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

Artifact cf90abce32567023c940ecabf5707c4714c61c92:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  ee(db, p);.    p
0b50: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0b60: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0b70: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0b80: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0b90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ba0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
0bb0: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
0bc0: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
0bd0: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
0be0: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
0bf0: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
0c00: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
0c10: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
0c20: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
0c30: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
0c40: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
0c50: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
0c60: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0c70: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0c80: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0c90: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0ca0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0cb0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
0cc0: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
0cd0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0ce0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
0cf0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
0d00: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
0d10: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
0d20: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
0d30: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
0d40: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
0d50: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
0d60: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
0d70: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
0d80: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
0d90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
0da0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
0db0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
0dc0: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
0dd0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
0df0: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
0e00: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
0e10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0e20: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
0e30: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
0e40: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
0e50: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
0e60: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
0e70: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
0e80: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
0e90: 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  pLimit,         
0ea0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
0eb0: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
0ec0: 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  used */.  Expr *
0ed0: 70 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  pOffset         
0ee0: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
0ef0: 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20    NULL means no 
0f00: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
0f10: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
0f20: 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20  elect standin;. 
0f30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0f40: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
0f50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
0f60: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
0f70: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
0f80: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
0f90: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
0fa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
0fb0: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0fc0: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  in;.  }.  if( pE
0fd0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
0fe0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
0ff0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1000: 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  arse, 0, sqlite3
1010: 45 78 70 72 28 64 62 2c 54 4b 5f 41 53 54 45 52  Expr(db,TK_ASTER
1020: 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70  ISK,0));.  }.  p
1030: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  New->pEList = pE
1040: 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  List;.  pNew->op
1050: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
1060: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
1070: 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65   selFlags;.  pNe
1080: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
1090: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
10a0: 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   0;.#if SELECTTR
10b0: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e  ACE_ENABLED.  pN
10c0: 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20  ew->zSelName[0] 
10d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e  = 0;.#endif.  pN
10e0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
10f0: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
1100: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
1110: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1120: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
1130: 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20    if( pSrc==0 ) 
1140: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62  pSrc = sqlite3Db
1150: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1160: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1170: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
1180: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
1190: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
11a0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
11b0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
11c0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
11d0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
11e0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
11f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1200: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1210: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1220: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1230: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
1240: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70  t = pOffset;.  p
1250: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a  New->pWith = 0;.
1260: 20 20 61 73 73 65 72 74 28 20 70 4f 66 66 73 65    assert( pOffse
1270: 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d  t==0 || pLimit!=
1280: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
1290: 72 3e 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  r>0 || db->mallo
12a0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
12b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12c0: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65  iled ) {.    cle
12d0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
12e0: 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  w, pNew!=&standi
12f0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  n);.    pNew = 0
1300: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1310: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
1320: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
1330: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
1340: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
1350: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
1360: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20  rn pNew;.}..#if 
1370: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1380: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  LED./*.** Set th
1390: 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65  e name of a Sele
13a0: 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ct object.*/.voi
13b0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53  d sqlite3SelectS
13c0: 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70  etName(Select *p
13d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
13e0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ame){.  if( p &&
13f0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
1400: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1410: 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d  izeof(p->zSelNam
1420: 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), p->zSelName,
1430: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%s", zName);. 
1440: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1450: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
1460: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
1470: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
1480: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1490: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
14a0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
14b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
14c0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
14d0: 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64   ) clearSelect(d
14e0: 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  b, p, 1);.}../*.
14f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1500: 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
1510: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
1520: 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70  tement in a comp
1530: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
1540: 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68  Select *findRigh
1550: 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29  tmost(Select *p)
1560: 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e  {.  while( p->pN
1570: 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65  ext ) p = p->pNe
1580: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  xt;.  return p;.
1590: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31  }../*.** Given 1
15a0: 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72   to 3 identifier
15b0: 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65 20  s preceding the 
15c0: 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65  JOIN keyword, de
15d0: 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74  termine the.** t
15e0: 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65  ype of join.  Re
15f0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
1600: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78  constant that ex
1610: 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70  presses that typ
1620: 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66  e.** in terms of
1630: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
1640: 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a  it values:.**.**
1650: 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a       JT_INNER.**
1660: 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a       JT_CROSS.**
1670: 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a       JT_OUTER.**
1680: 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a       JT_NATURAL.
1690: 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a  **     JT_LEFT.*
16a0: 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a  *     JT_RIGHT.*
16b0: 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65  *.** A full oute
16c0: 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f  r join is the co
16d0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f  mbination of JT_
16e0: 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48  LEFT and JT_RIGH
16f0: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  T..**.** If an i
1700: 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70  llegal or unsupp
1710: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20  orted join type 
1720: 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74  is seen, then st
1730: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  ill return.** a 
1740: 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70  join type, but p
1750: 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  ut an error in t
1760: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
1770: 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
1780: 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73  te3JoinType(Pars
1790: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
17a0: 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c   *pA, Token *pB,
17b0: 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69   Token *pC){.  i
17c0: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  nt jointype = 0;
17d0: 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b  .  Token *apAll[
17e0: 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a  3];.  Token *p;.
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1810: 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33    0123456789 123
1820: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
1830: 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63   123 */.  static
1840: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
1850: 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61  Text[] = "natura
1860: 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c  leftouterightful
1870: 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20  linnercross";.  
1880: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1890: 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20  uct {.    u8 i; 
18a0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
18b0: 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74  ing of keyword t
18c0: 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b  ext in zKeyText[
18d0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61  ] */.    u8 nCha
18e0: 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20  r;    /* Length 
18f0: 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69  of the keyword i
1900: 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  n characters */.
1910: 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20      u8 code;    
1920: 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61   /* Join type ma
1930: 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f  sk */.  } aKeywo
1940: 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  rd[] = {.    /* 
1950: 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20  natural */ { 0, 
1960: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20   7, JT_NATURAL  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1980: 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20  .    /* left    
1990: 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c  */ { 6,  4, JT_L
19a0: 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20  EFT|JT_OUTER    
19b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
19c0: 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c  outer   */ { 10,
19d0: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20   5, JT_OUTER    
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
19f0: 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20  .    /* right   
1a00: 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52  */ { 14, 5, JT_R
1a10: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  IGHT|JT_OUTER   
1a20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1a30: 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c  full    */ { 19,
1a40: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
1a50: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
1a60: 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20  .    /* inner   
1a70: 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49  */ { 23, 5, JT_I
1a80: 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NNER            
1a90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1aa0: 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c  cross   */ { 28,
1ab0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
1ac0: 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c  CROSS         },
1ad0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
1ae0: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
1af0: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
1b00: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
1b10: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
1b20: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
1b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
1b40: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
1b50: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
1b60: 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b  e(aKeyword); j++
1b70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1b80: 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e  n==aKeyword[j].n
1b90: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
1ba0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
1bb0: 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20  mp((char*)p->z, 
1bc0: 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f  &zKeyText[aKeywo
1bd0: 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d  rd[j].i], p->n)=
1be0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
1bf0: 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f  intype |= aKeywo
1c00: 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  rd[j].code;.    
1c10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
1c30: 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a  tcase( j==0 || j
1c40: 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a  ==1 || j==2 || j
1c50: 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a  ==3 || j==4 || j
1c60: 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20  ==5 || j==6 );. 
1c70: 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53     if( j>=ArrayS
1c80: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b  ize(aKeyword) ){
1c90: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1ca0: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
1cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cc0: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
1cd0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
1ce0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
1cf0: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
1d00: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
1d10: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
1d20: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d  onst char *zSp =
1d40: 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74   " ";.    assert
1d50: 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pB!=0 );.    i
1d60: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b  f( pC==0 ){ zSp+
1d70: 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  +; }.    sqlite3
1d80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d90: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   "unknown or uns
1da0: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
1db0: 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54  pe: ".       "%T
1dc0: 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42   %T%s%T", pA, pB
1dd0: 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20  , zSp, pC);.    
1de0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1df0: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
1e00: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1e10: 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
1e20: 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65      && (jointype
1e30: 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   & (JT_LEFT|JT_R
1e40: 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20  IGHT))!=JT_LEFT 
1e50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1e60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1e70: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1e80: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1e90: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1ea0: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1eb0: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1ec0: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1ed0: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ef0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1f00: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
1f10: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1f20: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
1f30: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
1f40: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
1f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
1f60: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
1f70: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1f80: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1f90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1fa0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1fb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1fc0: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1fd0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1fe0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1ff0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
2000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
2010: 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74 61  h the first N ta
2020: 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72  bles in pSrc, fr
2030: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
2040: 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a  , looking for a.
2050: 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68 61  ** table that ha
2060: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  s a column named
2070: 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57   zCol.  .**.** W
2080: 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a  hen found, set *
2090: 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c  piTab and *piCol
20a0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e   to the table in
20b0: 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  dex and column i
20c0: 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  ndex.** of the m
20d0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61  atching column a
20e0: 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a  nd return TRUE..
20f0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75  **.** If not fou
2100: 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  nd, return FALSE
2110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2120: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
2130: 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  dex(.  SrcList *
2140: 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41  pSrc,       /* A
2150: 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74  rray of tables t
2160: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
2170: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
2180: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2190: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e  tables in pSrc->
21a0: 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  a[] to search */
21b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21c0: 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Col,    /* Name 
21d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65  of the column we
21e0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
21f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62   */.  int *piTab
2200: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ,          /* Wr
2210: 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72  ite index of pSr
2220: 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20  c->a[] here */. 
2230: 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20   int *piCol     
2240: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69        /* Write i
2250: 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b  ndex of pSrc->a[
2260: 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43  *piTab].pTab->aC
2270: 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ol[] here */.){.
2280: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2290: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
22a0: 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
22b0: 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  s in pSrc */.  i
22c0: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
22d0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
22e0: 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20  column matching 
22f0: 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  zCol */..  asser
2300: 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28  t( (piTab==0)==(
2310: 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a  piCol==0) );  /*
2320: 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72   Both or neither
2330: 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66   are NULL */.  f
2340: 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b  or(i=0; i<N; i++
2350: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f  ){.    iCol = co
2360: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e  lumnIndex(pSrc->
2370: 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29  a[i].pTab, zCol)
2380: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
2390: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
23a0: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  iTab ){.        
23b0: 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20  *piTab = i;.    
23c0: 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f      *piCol = iCo
23d0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
23e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
23f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2410: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2420: 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70  to add terms imp
2430: 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e  lied by JOIN syn
2440: 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  tax to the.** WH
2450: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
2460: 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43  ssion of a SELEC
2470: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65  T statement. The
2480: 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68   new term, which
2490: 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74  .** is ANDed wit
24a0: 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 57  h the existing W
24b0: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20  HERE clause, is 
24c0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
24d0: 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31  **    (tab1.col1
24e0: 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a   = tab2.col2).**
24f0: 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20 69  .** where tab1 i
2500: 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74 61  s the iSrc'th ta
2510: 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70  ble in SrcList p
2520: 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73 20  Src and tab2 is 
2530: 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29  the .** (iSrc+1)
2540: 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31  'th. Column col1
2550: 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c   is column iColL
2560: 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64  eft of tab1, and
2570: 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75   col2 is.** colu
2580: 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20  mn iColRight of 
2590: 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tab2..*/.static 
25a0: 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72  void addWhereTer
25b0: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
25c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
25d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
25e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
25f0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2610: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
2620: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
2630: 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20  .  int iLeft,   
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
2660: 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f  irst table to jo
2670: 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  in in pSrc */.  
2680: 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20  int iColLeft,   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
26b0: 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c  mn in first tabl
26c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  e */.  int iRigh
26d0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
26e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26f0: 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  of second table 
2700: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2710: 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20   iColRight,     
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2730: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
2740: 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  in second table 
2750: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72  */.  int isOuter
2760: 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Join,           
2770: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2780: 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52  this is an OUTER
2790: 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20   join */.  Expr 
27a0: 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20 20  **ppWhere       
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
27c0: 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45 20  /OUT: The WHERE 
27d0: 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f  clause to add to
27e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
27f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2800: 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a  b;.  Expr *pE1;.
2810: 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45    Expr *pE2;.  E
2820: 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73  xpr *pEq;..  ass
2830: 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68  ert( iLeft<iRigh
2840: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2850: 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74  Src->nSrc>iRight
2860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2870: 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61  rc->a[iLeft].pTa
2880: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
2890: 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70  Src->a[iRight].p
28a0: 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20  Tab );..  pE1 = 
28b0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
28c0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
28d0: 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66  , iLeft, iColLef
28e0: 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69  t);.  pE2 = sqli
28f0: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
2900: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52  xpr(db, pSrc, iR
2910: 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29  ight, iColRight)
2920: 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74  ;..  pEq = sqlit
2930: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2940: 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c  TK_EQ, pE1, pE2,
2950: 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26   0);.  if( pEq &
2960: 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b  & isOuterJoin ){
2970: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
2980: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f  erty(pEq, EP_Fro
2990: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
29a0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
29b0: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b  erty(pEq, EP_Tok
29c0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
29d0: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
29e0: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 71  tVVAProperty(pEq
29f0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2a00: 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a      pEq->iRightJ
2a10: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
2a20: 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d  pE2->iTable;.  }
2a30: 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71  .  *ppWhere = sq
2a40: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
2a50: 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b   *ppWhere, pEq);
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2a70: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2a80: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
2a90: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
2aa0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
2ab0: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
2ac0: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2ad0: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
2ae0: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
2af0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
2b00: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
2b10: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
2b20: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
2b30: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
2b40: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
2b50: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
2b60: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
2b70: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
2b80: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
2b90: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
2ba0: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
2bb0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2bc0: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
2bd0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
2be0: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
2bf0: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
2c00: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
2c10: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
2c20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
2c30: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
2c40: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
2c50: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
2c60: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
2c70: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
2c80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
2c90: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
2ca0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2cb0: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
2cc0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2cd0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
2ce0: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
2cf0: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
2d00: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
2d10: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
2d20: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
2d30: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2d40: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
2d50: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
2d60: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
2d70: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
2d80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
2d90: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
2da0: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
2db0: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
2dc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
2dd0: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
2de0: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2df0: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
2e00: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
2e10: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
2e20: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
2e30: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
2e40: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
2e50: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
2e60: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
2e70: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
2e80: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
2e90: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
2ea0: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
2eb0: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
2ec0: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
2ed0: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
2ee0: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
2ef0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
2f00: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
2f10: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
2f20: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2f30: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
2f40: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
2f50: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
2f60: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2f70: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
2f80: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
2f90: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2fa0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
2fb0: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2fc0: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2fd0: 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  VAProperty(p, EP
2fe0: 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2ff0: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
3000: 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65  le = (i16)iTable
3010: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
3020: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20  =TK_FUNCTION && 
3030: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
3040: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
3050: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78   for(i=0; i<p->x
3060: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  .pList->nExpr; i
3070: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ++){.        set
3080: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c  JoinExpr(p->x.pL
3090: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
30a0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   iTable);.      
30b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a  }.    }.    setJ
30c0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
30d0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
30e0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
30f0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
3100: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
3110: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
3120: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
3130: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
3140: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
3150: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
3160: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
3170: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
3180: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
3190: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
31a0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
31b0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
31c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
31d0: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
31e0: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
31f0: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
3200: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
3210: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
3220: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
3230: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
3240: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
3250: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
3260: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
3270: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
3280: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
3290: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
32a0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
32b0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
32c0: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
32d0: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
32e0: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
32f0: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
3300: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
3310: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
3320: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
3330: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
3340: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
3350: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
3360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
3370: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
3380: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
3390: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
33a0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
33b0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
33c0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
33d0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
33e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
33f0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
3400: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3410: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
3420: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
3430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3440: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3450: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3460: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3470: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3480: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3490: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
34a0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
34b0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
34c0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
34d0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
34e0: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
34f0: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
3500: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
3510: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
3520: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
3530: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
3540: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
3550: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
3560: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
3570: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3580: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3590: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
35a0: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
35b0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
35c0: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
35d0: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
35e0: 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  = (pRight->fg.jo
35f0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
3600: 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  R)!=0;..    /* W
3610: 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20  hen the NATURAL 
3620: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
3630: 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c  nt, add WHERE cl
3640: 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20  ause terms for. 
3650: 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75     ** every colu
3660: 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  mn that the two 
3670: 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63  tables have in c
3680: 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ommon..    */.  
3690: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67    if( pRight->fg
36a0: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
36b0: 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20  ATURAL ){.      
36c0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
36d0: 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  || pRight->pUsin
36e0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
36f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3700: 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20  rse, "a NATURAL 
3710: 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76  join may not hav
3720: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
3730: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
3740: 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20  lause", 0);.    
3750: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3760: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
3770: 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62  j=0; j<pRightTab
3780: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
3790: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
37a0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
37b0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69  column in the ri
37c0: 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ght table */.   
37d0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
37e0: 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20      /* Matching 
37f0: 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  left table */.  
3800: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3810: 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67  ol;  /* Matching
3820: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c   column in the l
3830: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  eft table */..  
3840: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52        zName = pR
3850: 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  ightTab->aCol[j]
3860: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3870: 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  if( tableAndColu
3880: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3890: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
38a0: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a  , &iLeftCol) ){.
38b0: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
38c0: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
38d0: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
38e0: 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20  tCol, i+1, j,.  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
3910: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
3920: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3930: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
3940: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
3950: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
3960: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
3970: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3980: 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69  ight->pOn && pRi
3990: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
39a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
39b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
39c0: 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f  nnot have both O
39d0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20  N and USING ".  
39e0: 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69        "clauses i
39f0: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22  n the same join"
3a00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
3a10: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
3a20: 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75   Add the ON clau
3a30: 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
3a40: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3a50: 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  e, connected by.
3a60: 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70      ** an AND op
3a70: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
3a80: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3a90: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
3aa0: 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69  isOuter ) setJoi
3ab0: 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f  nExpr(pRight->pO
3ac0: 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73  n, pRight->iCurs
3ad0: 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57  or);.      p->pW
3ae0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
3af0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3b00: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69  , p->pWhere, pRi
3b10: 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  ght->pOn);.     
3b20: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30   pRight->pOn = 0
3b30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3b40: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
3b50: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
3b60: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
3b70: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
3b80: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
3b90: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
3ba0: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
3bb0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
3bc0: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
3bd0: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
3be0: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
3bf0: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
3c00: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
3c10: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
3c20: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
3c30: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
3c40: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
3c50: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
3c60: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
3c70: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
3c80: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
3c90: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
3ca0: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
3cb0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
3cc0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
3cd0: 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  ( pRight->pUsing
3ce0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
3cf0: 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74   *pList = pRight
3d00: 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20  ->pUsing;.      
3d10: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74  for(j=0; j<pList
3d20: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
3d30: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3d40: 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
3d50: 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65   the term in the
3d60: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f   USING clause */
3d70: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3d80: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ft;       /* Tab
3d90: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77  le on the left w
3da0: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  ith matching col
3db0: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
3dc0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
3dd0: 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ;    /* Column n
3de0: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
3df0: 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  g column on the 
3e00: 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  left */.        
3e10: 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20  int iRightCol;  
3e20: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3e30: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
3e40: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68  lumn on the righ
3e50: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  t */..        zN
3e60: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
3e70: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
3e80: 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c   iRightCol = col
3e90: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
3ea0: 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab, zName);.    
3eb0: 20 20 20 20 69 66 28 20 69 52 69 67 68 74 43 6f      if( iRightCo
3ec0: 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  l<0.         || 
3ed0: 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49  !tableAndColumnI
3ee0: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
3ef0: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
3f00: 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20  iLeftCol).      
3f10: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
3f20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3f30: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a  Parse, "cannot j
3f40: 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  oin using column
3f50: 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20   %s - column ". 
3f60: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20             "not 
3f70: 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20  present in both 
3f80: 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b  tables", zName);
3f90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
3fa0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
3fb0: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
3fc0: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
3fd0: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
3fe0: 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f  l, i+1, iRightCo
3ff0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
4000: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
4010: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
4020: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4030: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4040: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
4050: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65  nce */.static Ke
4060: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
4070: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
4080: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4090: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
40a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
40b0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
40c0: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
40d0: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
40e0: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
40f0: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
4100: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
4110: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
4120: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
4130: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
4140: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4150: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
4160: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
4170: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  /.);../*.** Gene
4180: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
4190: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
41a0: 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73  ord in registers
41b0: 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f   regData.** thro
41c0: 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74  ugh regData+nDat
41d0: 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72  a-1 onto the sor
41e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
41f0: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
4200: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
4210: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
4220: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4230: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
4240: 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt,        /* In
4250: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4260: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
4270: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
4280: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
4290: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
42a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
42b0: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20  .  int regData, 
42c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
42d0: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
42e0: 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73  ing data to be s
42f0: 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  orted */.  int r
4300: 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20  egOrigData,     
4310: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4320: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4330: 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20   before packing 
4340: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4360: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
4370: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
4380: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
4390: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
43a0: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
43b0: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
43c0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
43d0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
43e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
43f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
4410: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
4420: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
4430: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
4440: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4450: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4460: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4470: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4480: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4490: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
44a0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
44b0: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
44c0: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
44d0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
44e0: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
44f0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
4500: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
4510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
4540: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
4550: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4560: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4570: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4580: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4590: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
45a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
45b0: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
45c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
45d0: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
45e0: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
45f0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
4620: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
4630: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
4640: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69  r */.  int iLimi
4650: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
4670: 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  IT counter */.. 
4680: 20 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30   assert( bSeq==0
4690: 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20   || bSeq==1 );. 
46a0: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
46b0: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
46c0: 67 4f 72 69 67 44 61 74 61 20 29 3b 0a 20 20 69  gOrigData );.  i
46d0: 66 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b  f( nPrefixReg ){
46e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72  .    assert( nPr
46f0: 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62  efixReg==nExpr+b
4700: 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61  Seq );.    regBa
4710: 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e  se = regData - n
4720: 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d  Expr - bSeq;.  }
4730: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73  else{.    regBas
4740: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
4750: 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   + 1;.    pParse
4760: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b  ->nMem += nBase;
4770: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4780: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d  Select->iOffset=
4790: 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69  =0 || pSelect->i
47a0: 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c  Limit!=0 );.  iL
47b0: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
47c0: 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65 63  iOffset ? pSelec
47d0: 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  t->iOffset+1 : p
47e0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
47f0: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f    pSort->labelDo
4800: 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ne = sqlite3Vdbe
4810: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4820: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
4830: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4840: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4850: 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69   regBase, regOri
4860: 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20  gData,.         
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
4890: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
48a0: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
48b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
48c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
48d0: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
48e0: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
48f0: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
4900: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
4910: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
4920: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
4930: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
4940: 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20  ase+nExpr+bSeq, 
4950: 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71  nData);.  }.  sq
4960: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4970: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4980: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
4990: 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20  , nBase-nOBSat, 
49a0: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
49b0: 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ( nOBSat>0 ){.  
49c0: 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79    int regPrevKey
49d0: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
49e0: 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20   nOBSat columns 
49f0: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
4a00: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
4a10: 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ddrFirst;    /* 
4a20: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
4a30: 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a  P_IfNot opcode *
4a40: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d  /.    int addrJm
4a50: 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
4a60: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d  ss of the OP_Jum
4a70: 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  p opcode */.    
4a80: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
4a90: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74    /* Opcode that
4aa0: 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65   opens the sorte
4ab0: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  r */.    int nKe
4ac0: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
4ad0: 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20  mber of sorting 
4ae0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63  key columns, inc
4af0: 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e  luding OP_Sequen
4b00: 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  ce */.    KeyInf
4b10: 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f  o *pKI;     /* O
4b20: 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20  riginal KeyInfo 
4b30: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61  on the sorter ta
4b40: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50  ble */..    regP
4b50: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
4b60: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
4b70: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
4b80: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
4b90: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
4ba0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62  Sort->nOBSat + b
4bb0: 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65  Seq;.    if( bSe
4bc0: 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46  q ){.      addrF
4bd0: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
4be0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
4bf0: 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  fNot, regBase+nE
4c00: 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65  xpr); .    }else
4c10: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
4c20: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4c30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp1(v, OP_Sequ
4c40: 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d  enceTest, pSort-
4c50: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
4c60: 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  }.    VdbeCovera
4c70: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4c80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4c90: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50  OP_Compare, regP
4ca0: 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c  revKey, regBase,
4cb0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
4cc0: 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  .    pOp = sqlit
4cd0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
4ce0: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
4cf0: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dex);.    if( pP
4d00: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
4d10: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
4d20: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e  .    pOp->p2 = n
4d30: 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20  Key + nData;.   
4d40: 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70   pKI = pOp->p4.p
4d50: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  KeyInfo;.    mem
4d60: 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72  set(pKI->aSortOr
4d70: 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69  der, 0, pKI->nFi
4d80: 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f  eld); /* Makes O
4d90: 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65 73  P_Jump below tes
4da0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
4db0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4dc0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
4dd0: 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  KI, P4_KEYINFO);
4de0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
4df0: 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b  KI->nXField>2 );
4e00: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
4e10: 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
4e20: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
4e30: 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  se, pSort->pOrde
4e40: 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20  rBy, nOBSat,.   
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46          pKI->nXF
4e80: 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64  ield-1);.    add
4e90: 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rJmp = sqlite3Vd
4ea0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4ec0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
4ed0: 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30  mp, addrJmp+1, 0
4ee0: 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64  , addrJmp+1); Vd
4ef0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4f00: 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42     pSort->labelB
4f10: 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64  kOut = sqlite3Vd
4f20: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4f30: 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65      pSort->regRe
4f40: 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
4f50: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
4f60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4f70: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
4f80: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
4f90: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
4fa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4fb0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
4fc0: 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e  tSorter, pSort->
4fd0: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
4fe0: 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( iLimit ){.   
4ff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5000: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
5010: 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d  , iLimit, pSort-
5020: 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20  >labelDone);.   
5030: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
5040: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
5050: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5060: 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b  e(v, addrFirst);
5070: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5080: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
5090: 20 72 65 67 42 61 73 65 2c 20 72 65 67 50 72 65   regBase, regPre
50a0: 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  vKey, pSort->nOB
50b0: 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Sat);.    sqlite
50c0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
50d0: 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20   addrJmp);.  }. 
50e0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
50f0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
5100: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
5110: 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72    op = OP_Sorter
5120: 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b  Insert;.  }else{
5130: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78  .    op = OP_Idx
5140: 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71  Insert;.  }.  sq
5150: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5160: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
5170: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
5180: 64 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  d);.  if( iLimit
5190: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
51a0: 3b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30  ;.    int r1 = 0
51b0: 3b 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ;.    /* Fill th
51c0: 65 20 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69  e sorter until i
51d0: 74 20 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54  t contains LIMIT
51e0: 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e  +OFFSET entries.
51f0: 20 20 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20    (The iLimit.  
5200: 20 20 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73    ** register is
5210: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74   initialized wit
5220: 68 20 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54  h value of LIMIT
5230: 2b 4f 46 46 53 45 54 2e 29 20 20 41 66 74 65 72  +OFFSET.)  After
5240: 20 74 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20   the sorter.    
5250: 2a 2a 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c  ** fills up, del
5260: 65 74 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e  ete the least en
5270: 74 72 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65  try in the sorte
5280: 72 20 61 66 74 65 72 20 65 61 63 68 20 69 6e 73  r after each ins
5290: 65 72 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73  ert..    ** Thus
52a0: 20 77 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d   we never hold m
52b0: 6f 72 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d  ore than the LIM
52c0: 49 54 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69  IT+OFFSET rows i
52d0: 6e 20 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65  n memory at once
52e0: 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73   */.    addr = s
52f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5300: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  (v, OP_IfNotZero
5310: 2c 20 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b  , iLimit, 0, 1);
5320: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5330: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5340: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
5350: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5360: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53  sor);.    if( pS
5370: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
5380: 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  erLoop ){.      
5390: 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
53a0: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
53b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
53c0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74  OP_Column, pSort
53d0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70  ->iECursor, nExp
53e0: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  r, r1);.      Vd
53f0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
5400: 65 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eq"));.    }.   
5410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5420: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
5430: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
5440: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  );.    if( pSort
5450: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
5460: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  oop ){.      /* 
5470: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
5480: 70 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61  p is driven by a
5490: 6e 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61  n index such tha
54a0: 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20  t values from.  
54b0: 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
54c0: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
54d0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20   inner loop are 
54e0: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c  in sorted order,
54f0: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   then.      ** i
5500: 6d 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20  mmediately jump 
5510: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
5520: 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65  ation of an inne
5530: 72 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20  r loop if the.  
5540: 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f      ** entry fro
5550: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74  m the current it
5560: 65 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  eration does not
5570: 20 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f   fit into the to
5580: 70 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54  p.      ** LIMIT
5590: 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20  +OFFSET entries 
55a0: 6f 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  of the sorter. *
55b0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b  /.      int iBrk
55c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55d0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
55e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
55f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5600: 45 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  Eq, regBase+nExp
5610: 72 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20  r, iBrk, r1);.  
5620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5630: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
5640: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
5650: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5670: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5680: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5690: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
56a0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
56b0: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
56c0: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
56d0: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
56e0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
56f0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
5700: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  s VM */.  int iO
5710: 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52  ffset,      /* R
5720: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
5730: 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74  the offset count
5740: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  er */.  int iCon
5750: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
5760: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
5770: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
5780: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f  d */.){.  if( iO
5790: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73  ffset>0 ){.    s
57a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
57b0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
57c0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
57d0: 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 1); VdbeCovera
57e0: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
57f0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
5800: 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ET"));.  }.}../*
5810: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
5820: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
5830: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
5840: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
5850: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
5860: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
5870: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
5880: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
5890: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
58a0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
58b0: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
58c0: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
58d0: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
58e0: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
58f0: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
5900: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
5910: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
5920: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
5930: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
5940: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
5950: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5960: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5970: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5980: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
5990: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
59a0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
59b0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
59c0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
59d0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
59e0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
59f0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5a00: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5a10: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5a20: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5a30: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5a40: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5a50: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5a60: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5a70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5a80: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
5a90: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
5aa0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
5ab0: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
5ac0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
5ad0: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
5ae0: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5af0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5b00: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5b10: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5b20: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5b30: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5b40: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5b50: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5b60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5b70: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5b80: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
5b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5ba0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
5bb0: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
5bc0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5bd0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5be0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1);.}../*.** Thi
5bf0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
5c00: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
5c10: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
5c20: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
5c30: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
5c40: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
5c50: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
5c60: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
5c70: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
5c80: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
5c90: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
5ca0: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
5cb0: 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20  If srcTab is.** 
5cc0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68  zero or more, th
5cd0: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
5ce0: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
5cf0: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
5d00: 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74   only .** to get
5d10: 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e 73 20   number columns 
5d20: 61 6e 64 20 74 68 65 20 64 61 74 61 74 79 70 65  and the datatype
5d30: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
5d40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5d50: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
5d60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5d70: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
5d80: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
5d90: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
5da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5db0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
5dc0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5dd0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
5de0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5df0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
5e00: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
5e10: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
5e20: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
5e30: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
5e40: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
5e50: 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74  able */.  SortCt
5e60: 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20  x *pSort,       
5e70: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
5e80: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5e90: 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42   process ORDER B
5ea0: 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  Y */.  DistinctC
5eb0: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
5ec0: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
5ed0: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
5ee0: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
5ef0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
5f00: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
5f10: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
5f20: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
5f30: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
5f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5f50: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
5f60: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
5f70: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f90: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
5fa0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
5fb0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
5fc0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5fd0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5fe0: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
5ff0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
6000: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
6010: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
6020: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6030: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
6040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
6050: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
6060: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
6070: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
6080: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
6090: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
60a0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
60b0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
60c0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
60d0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
60e0: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
60f0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
6100: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
6110: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6120: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
6130: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
6140: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
6150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
6160: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
6170: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
6180: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
6190: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  );.  assert( pEL
61a0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
61b0: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
61c0: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
61d0: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
61e0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
61f0: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
6200: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
6210: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
6220: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
6230: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
6240: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
6250: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
6260: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
6270: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
6280: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
6290: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
62a0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
62b0: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
62c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
62d0: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ;..  if( pDest->
62e0: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
62f0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
6300: 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20     nPrefixReg = 
6310: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
6320: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >nExpr;.      if
6330: 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  ( !(pSort->sortF
6340: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
6350: 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72  UseSorter) ) nPr
6360: 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20  efixReg++;.     
6370: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6380: 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20   nPrefixReg;.   
6390: 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53   }.    pDest->iS
63a0: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
63b0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
63c0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
63d0: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
63e0: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e  ( pDest->iSdst+n
63f0: 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72  ResultCol > pPar
6400: 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  se->nMem ){.    
6410: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  /* This is an er
6420: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68  ror condition th
6430: 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66  at can result, f
6440: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
6450: 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a   a SELECT.    **
6460: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
6470: 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e  nd side of an IN
6480: 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  SERT contains mo
6490: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
64a0: 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  s than.    ** th
64b0: 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  ere are columns 
64c0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  in the table on 
64d0: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65  the left.  The e
64e0: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75  rror will be cau
64f0: 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72  ght.    ** and r
6500: 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20  eported later.  
6510: 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
6520: 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20  ake sure enough 
6530: 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
6540: 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76  ted.    ** to av
6550: 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f  oid other spurio
6560: 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  us errors in the
6570: 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20   meantime. */.  
6580: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
6590: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
65a0: 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  }.  pDest->nSdst
65b0: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
65c0: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
65d0: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28  st->iSdst;.  if(
65e0: 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20   srcTab>=0 ){.  
65f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
6600: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
6610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6620: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6630: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
6640: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
6650: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
6660: 28 76 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  (v, "%s", pEList
6670: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
6680: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
6690: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
66a0: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
66b0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
66c0: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
66d0: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
66e0: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
66f0: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
6700: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
6710: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
6720: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65  .    */.    u8 e
6730: 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20 69 66  celFlags;.    if
6740: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
6750: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f   || eDest==SRT_O
6760: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
6770: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
6780: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
6790: 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   = SQLITE_ECEL_D
67a0: 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  UP;.    }else{. 
67b0: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d       ecelFlags =
67c0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
67d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
67e0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
67f0: 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  List, regResult,
6800: 20 30 2c 20 65 63 65 6c 46 6c 61 67 73 29 3b 0a   0, ecelFlags);.
6810: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
6820: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
6830: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
6840: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
6850: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
6860: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
6870: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
6880: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
6890: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
68a0: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
68b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
68c0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
68d0: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
68e0: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
68f0: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
6900: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
6910: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
6920: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
6930: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
6940: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
6950: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
6960: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
6970: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
6980: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
6990: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
69a0: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
69b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
69c0: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
69d0: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
69e0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
69f0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
6a00: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
6a10: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
6a20: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
6a30: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6a40: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
6a50: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
6a60: 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
6a70: 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69  eral coded earli
6a80: 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c  er to an OP_Null
6a90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73  .        ** sets
6aa0: 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64   the MEM_Cleared
6ab0: 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73   bit on the firs
6ac0: 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  t register of th
6ad0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
6ae0: 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68  vious value.  Th
6af0: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
6b00: 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f  e OP_Ne below to
6b10: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20   always.        
6b20: 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66  ** fail on the f
6b30: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
6b40: 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20  f the loop even 
6b50: 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  if the first.   
6b60: 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61       ** row is a
6b70: 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20  ll NULLs..      
6b80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
6b90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
6ba0: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
6bb0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
6bc0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
6bd0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
6be0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
6bf0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
6c00: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
6c10: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ull;.        pOp
6c20: 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
6c30: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50    pOp->p2 = regP
6c40: 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a  rev;..        iJ
6c50: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
6c60: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
6c70: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
6c80: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6c90: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
6ca0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
6cb0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
6cc0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
6cd0: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
6ce0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
6cf0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52          if( i<nR
6d00: 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20  esultCol-1 ){.  
6d10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6d20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6d30: 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b  P_Ne, regResult+
6d40: 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65  i, iJump, regPre
6d50: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
6d60: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
6d70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
6d80: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6d90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6da0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52  3(v, OP_Eq, regR
6db0: 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e  esult+i, iContin
6dc0: 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a  ue, regPrev+i);.
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
6de0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6df0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6e00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6e10: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
6e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
6e30: 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
6e40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6e50: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6e60: 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
6e70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6e80: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
6e90: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
6ea0: 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20  dr(v)==iJump || 
6eb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6ec0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
6ed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ee0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
6ef0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
6f00: 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Prev, nResultCol
6f10: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  -1);.        bre
6f20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
6f30: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
6f40: 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
6f50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6f60: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
6f70: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
6f80: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
6f90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6fa0: 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
6fb0: 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   {.        asser
6fc0: 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  t( pDistinct->eT
6fd0: 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44  nctType==WHERE_D
6fe0: 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
6ff0: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  D );.        cod
7000: 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
7010: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62  , pDistinct->tab
7020: 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  Tnct, iContinue,
7030: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20   nResultCol,.   
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20    regResult);.  
7060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7070: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
7080: 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20  f( pSort==0 ){. 
7090: 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28       codeOffset(
70a0: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
70b0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
70c0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
70d0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
70e0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
70f0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
7100: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
7110: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
7120: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
7130: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
7140: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7150: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7160: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
7170: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
7180: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
7190: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
71a0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
71b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
71c0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
71d0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
71e0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b  nResultCol, r1);
71f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7200: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7210: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7220: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
7230: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7240: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7250: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7260: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
7270: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
7280: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
7290: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
72a0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
72b0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
72c0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
72d0: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
72e0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
72f0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
7300: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
7310: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
7320: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
7330: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7340: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
7350: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
7360: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7380: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7390: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
73a0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
73b0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
73c0: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
73d0: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
73e0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
73f0: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
7400: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
7410: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
7420: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
7430: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7440: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7450: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
7460: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
7470: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
7480: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7490: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
74a0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
74b0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
74c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
74d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ( eDest==SRT_Fif
74e0: 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  o );.      testc
74f0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7500: 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20  DistFifo );.    
7510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7520: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
7530: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7540: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
7550: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
7560: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7570: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
7580: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
7590: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
75a0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
75b0: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
75c0: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
75d0: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
75e0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
75f0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
7600: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
7610: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
7620: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
7630: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
7640: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
7650: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
7660: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
7670: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
7680: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
7690: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
76a0: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
76b0: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
76c0: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
76d0: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
76e0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
76f0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
7700: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
7710: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7720: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7730: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
7740: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
7750: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
7760: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
7770: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7780: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
7790: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a  , iParm+1, r1);.
77a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
77b0: 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pSort==0 );.    
77c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
77d0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
77e0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
77f0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
7800: 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69  rt, p, r1+nPrefi
7810: 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31  xReg,regResult,1
7820: 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20  ,nPrefixReg);.  
7830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7840: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
7850: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7860: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
7870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7880: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
7890: 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20   iParm, r2);.   
78a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
78b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
78c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
78d0: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
78e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
78f0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
7900: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  D);.        sqli
7910: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7920: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
7930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7940: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7950: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
7960: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
7970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7980: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
7990: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
79a0: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
79b0: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
79c0: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
79d0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
79e0: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
79f0: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
7a00: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
7a10: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
7a20: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
7a30: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
7a40: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
7a50: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
7a60: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7a70: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
7a80: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7a90: 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20      /* At first 
7aa0: 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64  glance you would
7ab0: 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20   think we could 
7ac0: 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65  optimize out the
7ad0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
7ae0: 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73  R BY in this cas
7af0: 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65  e since the orde
7b00: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
7b10: 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
7b20: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  ** does not matt
7b30: 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d  er.  But there m
7b40: 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20  ight be a LIMIT 
7b50: 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68  clause, in which
7b60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
7b70: 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20   the order does 
7b80: 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  matter */.      
7b90: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
7ba0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
7bb0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7bc0: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 52 65  regResult, regRe
7bd0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7be0: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
7bf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7c00: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
7c10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
7c20: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
7c30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
7c40: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
7c50: 41 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c  AffSdst)==nResul
7c60: 74 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  tCol );.        
7c70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7c80: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
7c90: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
7ca0: 52 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20  ResultCol, .    
7cb0: 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73          r1, pDes
7cc0: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65  t->zAffSdst, nRe
7cd0: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
7ce0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
7cf0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
7d00: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
7d10: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
7d20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7d40: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7d50: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  m, r1);.        
7d60: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
7d70: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
7d80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7d90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7da0: 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
7db0: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
7dc0: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
7dd0: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
7de0: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
7df0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
7e00: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7e10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7e20: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50  P_Integer, 1, iP
7e30: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
7e40: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
7e50: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
7e60: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
7e70: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
7e80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
7e90: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
7ea0: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
7eb0: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
7ec0: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
7ed0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
7ee0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
7ef0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
7f00: 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20  ell or array of 
7f10: 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  .    ** memory c
7f20: 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f  ells and break o
7f30: 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ut of the scan l
7f40: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
7f50: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
7f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
7f70: 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d  esultCol==pDest-
7f80: 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20  >nSdst );.      
7f90: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7fa0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7fb0: 74 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20  ter(.           
7fc0: 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20   pParse, pSort, 
7fd0: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
7fe0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7ff0: 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29  Col, nPrefixReg)
8000: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8010: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
8020: 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20  egResult==iParm 
8030: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
8040: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
8050: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
8060: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
8070: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
8080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8090: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
80a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
80b0: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73  UERY */..    cas
80c0: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
80d0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64         /* Send d
80e0: 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74  ata to a co-rout
80f0: 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ine */.    case 
8100: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20  SRT_Output: {   
8110: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
8120: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
8130: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8140: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
8150: 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ne );.      test
8160: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
8170: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
8180: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
8190: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
81a0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
81b0: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
81c0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
81d0: 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20  sultCol,.       
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81f0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
8200: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
8210: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
8220: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
8230: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
8240: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
8250: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
8260: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8280: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
8290: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
82a0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
82b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
82c0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
82d0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
82e0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
82f0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
8300: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
8310: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8320: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
8330: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
8340: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
8350: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
8360: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
8370: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
8380: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
8390: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
83a0: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
83b0: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
83c0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
83d0: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
83e0: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
83f0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
8400: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
8410: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
8420: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
8430: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
8440: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
8450: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
8460: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
8470: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
8480: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
8490: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
84a0: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
84b0: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
84c0: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
84d0: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
84e0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
84f0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
8500: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
8510: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
8520: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
8530: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
8540: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
8550: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
8560: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
8570: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
8580: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8590: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
85a0: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
85b0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
85c0: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
85d0: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
85e0: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
85f0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
8600: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
8610: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
8620: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
8630: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
8640: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
8650: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
8660: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
8670: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
8680: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
8690: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
86a0: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
86b0: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
86c0: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
86d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
86e0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
86f0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
8700: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
8730: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
8740: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
8750: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
8760: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8770: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8780: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
8790: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
87a0: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
87b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
87c0: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
87d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
87e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
87f0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
8800: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
8810: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8820: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
8830: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
8840: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
8850: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
8860: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8870: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
8880: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
8890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88a0: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
88b0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
88c0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88e0: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
88f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8900: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8910: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
8920: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
8930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8940: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
8950: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
8960: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
8970: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8980: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
8990: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
89a0: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
89b0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
89c0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
89d0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
89e0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
89f0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
8a00: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
8a10: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
8a20: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
8a30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8a40: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8a50: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
8a60: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
8a70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
8a80: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
8a90: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
8aa0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
8ab0: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
8ac0: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
8ad0: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
8ae0: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
8af0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
8b00: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
8b10: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
8b20: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
8b30: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
8b40: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
8b50: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
8b60: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
8b70: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
8b80: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
8b90: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8ba0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8bb0: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
8bc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8bd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
8be0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
8bf0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
8c00: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
8c10: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
8c20: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
8c30: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
8c40: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
8c50: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
8c60: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
8c70: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
8c80: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
8c90: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
8ca0: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
8cb0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8cc0: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
8cd0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
8ce0: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
8cf0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
8d00: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
8d10: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
8d20: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
8d30: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
8d40: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
8d50: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
8d60: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
8d70: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
8d80: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
8d90: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
8da0: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
8db0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
8dc0: 2b 31 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  +1);.  KeyInfo *
8dd0: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
8de0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
8df0: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78  f(KeyInfo) + nEx
8e00: 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  tra);.  if( p ){
8e10: 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
8e20: 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43  er = (u8*)&p->aC
8e30: 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d  oll[N+X];.    p-
8e40: 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e  >nField = (u16)N
8e50: 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64  ;.    p->nXField
8e60: 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20 70   = (u16)X;.    p
8e70: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
8e80: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
8e90: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
8ea0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
8eb0: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
8ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8ed0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
8ee0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8ef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
8f00: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
8f10: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
8f20: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
8f30: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
8f40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
8f50: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
8f60: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
8f70: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
8f80: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
8f90: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 29 3b  bFree(p->db, p);
8fa0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
8fb0: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
8fc0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
8fd0: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
8fe0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
8ff0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
9000: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
9010: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
9020: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
9030: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
9040: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
9050: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
9060: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
9070: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9080: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
9090: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
90a0: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
90b0: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
90c0: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
90d0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
90e0: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
90f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9100: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
9110: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
9120: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
9130: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
9140: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
9150: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
9160: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
9170: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
9180: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
9190: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
91a0: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
91b0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
91c0: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
91d0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
91e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
91f0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
9200: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
9210: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
9220: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
9230: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
9240: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
9250: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
9260: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
9270: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
9280: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
9290: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
92a0: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
92b0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
92c0: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
92d0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
92e0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
92f0: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
9300: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
9310: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
9320: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
9330: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
9340: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
9350: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
9360: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
9370: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
9380: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
9390: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
93a0: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
93b0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
93c0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
93d0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
93e0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
93f0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
9400: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
9410: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
9420: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
9430: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9440: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9450: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9460: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9470: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
9480: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
9490: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
94a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
94b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
94c0: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
94d0: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
94e0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
94f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
9500: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
9510: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
9520: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
9530: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
9540: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
9550: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
9560: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
9570: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9580: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
9590: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
95a0: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
95b0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
95c0: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
95d0: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
95e0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
95f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9600: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
9610: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
9620: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
9630: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
9640: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
9650: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
9660: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9670: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  oll;.      pColl
9680: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9690: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
96a0: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
96b0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
96c0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
96d0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  tColl;.      pIn
96e0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
96f0: 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  rt] = pColl;.   
9700: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
9710: 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d  rder[i-iStart] =
9720: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
9730: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
9740: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
9750: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
9760: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
9770: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
9780: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
9790: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
97a0: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
97b0: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
97c0: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
97d0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
97e0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
97f0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
9800: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9810: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
9820: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
9830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9840: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
9850: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
9860: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
9870: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
9880: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
9890: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
98a0: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
98b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
98c0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
98d0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
98e0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
98f0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
9900: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
9910: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
9920: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
9930: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
9940: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
9950: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
9960: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
9970: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
9980: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
9990: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
99a0: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
99b0: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
99c0: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
99d0: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
99e0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
99f0: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
9a00: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9a10: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
9a20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9a30: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
9a40: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
9a50: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
9a60: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
9a70: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
9a80: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
9a90: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
9aa0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
9ab0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9ac0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
9ad0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
9ae0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
9af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9b00: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9b10: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9b20: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9b30: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
9b40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
9b50: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
9b60: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
9b70: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
9b80: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
9b90: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
9ba0: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
9bb0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
9bc0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
9bd0: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
9be0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
9bf0: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
9c00: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
9c10: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
9c20: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
9c30: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
9c40: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
9c50: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
9c60: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
9c70: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
9c80: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
9c90: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
9ca0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
9cb0: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
9cc0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
9cd0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
9ce0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
9cf0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
9d00: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9d10: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
9d20: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
9d30: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
9d40: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
9d50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9d60: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
9d70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9d80: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9d90: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
9da0: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
9db0: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
9dc0: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
9dd0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9de0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9df0: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9e00: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9e10: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9e20: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9e30: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
9e40: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
9e50: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
9e60: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
9e70: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
9e80: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
9e90: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
9ea0: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
9eb0: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
9ec0: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
9ed0: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
9ee0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
9ef0: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
9f00: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
9f10: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9f20: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
9f30: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
9f40: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
9f50: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9f60: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
9f70: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
9f80: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
9f90: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
9fa0: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9fb0: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
9fc0: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
9fd0: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
9fe0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
9ff0: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
a000: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
a010: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
a020: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
a030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
a040: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
a050: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a070: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
a080: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a0b0: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
a0c0: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
a0d0: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a0f0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
a100: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a120: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
a130: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
a140: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
a150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a160: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
a170: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
a180: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
a190: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
a1a0: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
a1b0: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
a1c0: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
a1d0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
a1e0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
a1f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a200: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
a210: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
a220: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
a230: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
a240: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
a250: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
a260: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
a270: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
a280: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
a290: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
a2a0: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
a2b0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
a2c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a2d0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
a2e0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
a2f0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
a300: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
a310: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
a320: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
a330: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
a340: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
a350: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
a360: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
a370: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
a380: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
a390: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
a3a0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
a3b0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
a3c0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
a3d0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
a3e0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
a3f0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
a400: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
a410: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
a420: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
a430: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
a440: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
a450: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
a460: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
a470: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
a480: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
a490: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
a4a0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
a4b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
a4c0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a4d0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
a4e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
a4f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
a500: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
a510: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
a520: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
a530: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
a540: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
a550: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a560: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
a570: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
a580: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
a590: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
a5a0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
a5b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a5c0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a5e0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
a5f0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
a600: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
a610: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
a620: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
a630: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
a640: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
a650: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
a660: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a670: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
a680: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
a690: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
a6a0: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
a6b0: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
a6c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
a6d0: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
a6e0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
a6f0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
a700: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
a710: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
a720: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
a730: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
a740: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
a750: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a770: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
a780: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
a790: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
a7c0: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
a7d0: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
a7e0: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a810: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
a820: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
a830: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
a840: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
a850: 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63  COMMENTS.  struc
a860: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a870: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
a880: 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a  ist->a;.#endif..
a890: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 42 72    assert( addrBr
a8a0: 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70  eak<0 );.  if( p
a8b0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a8c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a8d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a8e0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
a8f0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
a900: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
a910: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
a920: 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
a930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
a940: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
a950: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a960: 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20  );.  }.  iTab = 
a970: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b  pSort->iECursor;
a980: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
a990: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
a9a0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
a9b0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d   || eDest==SRT_M
a9c0: 65 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  em ){.    regRow
a9d0: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
a9e0: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
a9f0: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
aa00: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
aa10: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
aa20: 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 72 65  RT_Set ){.    re
aa30: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
aa40: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
aa50: 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  e);.    regRow =
aa60: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
aa70: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
aa80: 6c 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74  lumn);.    nSort
aa90: 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  Data = nColumn;.
aaa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
aab0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
aac0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
aad0: 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  );.    regRow = 
aae0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
aaf0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 6e  g(pParse);.    n
ab00: 53 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a 20 20  SortData = 1;.  
ab10: 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65  }.  nKey = pOrde
ab20: 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  rBy->nExpr - pSo
ab30: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66  rt->nOBSat;.  if
ab40: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
ab50: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
ab60: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
ab70: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
ab80: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
ab90: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70      iSortTab = p
aba0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
abb0: 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61     if( pSort->la
abc0: 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20  belBkOut ){.    
abd0: 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
abe0: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
abf0: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
ac00: 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
ac10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac20: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
ac30: 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72  udo, iSortTab, r
ac40: 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b  egSortOut, nKey+
ac50: 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20 20  1+nSortData);.  
ac60: 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29    if( addrOnce )
ac70: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
ac80: 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65  Here(v, addrOnce
ac90: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  );.    addr = 1 
aca0: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
acb0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
acc0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
acd0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
ace0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
acf0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
ad00: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
ad10: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71  ontinue);.    sq
ad20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ad30: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
ad40: 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  , iTab, regSortO
ad50: 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a 20  ut, iSortTab);. 
ad60: 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d     bSeq = 0;.  }
ad70: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d  else{.    addr =
ad80: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
ad90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
ada0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
adb0: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
adc0: 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  e(v);.    codeOf
add0: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
ade0: 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  et, addrContinue
adf0: 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20  );.    iSortTab 
ae00: 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65 71  = iTab;.    bSeq
ae10: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   = 1;.  }.  for(
ae20: 69 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61  i=0; i<nSortData
ae30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
ae40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ae50: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72   OP_Column, iSor
ae60: 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b  tTab, nKey+bSeq+
ae70: 69 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20  i, regRow+i);.  
ae80: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
ae90: 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69  , "%s", aOutEx[i
aea0: 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78  ].zName ? aOutEx
aeb0: 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74  [i].zName : aOut
aec0: 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20  Ex[i].zSpan));. 
aed0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65   }.  switch( eDe
aee0: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
aef0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
af00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
af10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
af20: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65  Rowid, iParm, re
af30: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
af40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
af50: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
af60: 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65  Parm, regRow, re
af70: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
af80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
af90: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
afa0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61  END);.      brea
afb0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
afc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
afd0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
afe0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
aff0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
b000: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
b010: 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74  (pDest->zAffSdst
b020: 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
b030: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
b040: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
b050: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  egRow, nColumn, 
b060: 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  regRowid,.      
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73    pDest->zAffSds
b090: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
b0a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
b0b0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
b0c0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
b0d0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
b0e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b0f0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
b100: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
b110: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
b120: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b130: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
b140: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
b150: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
b160: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
b170: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
b180: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
b190: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
b1a0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
b1b0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
b1c0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
b1d0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20  _Coroutine ); . 
b1e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
b1f0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b200: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b210: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
b220: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
b230: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b240: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
b250: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b260: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
b270: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64  tRow, pDest->iSd
b280: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
b290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b2a0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
b2b0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
b2c0: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
b2d0: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
b2e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b2f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b300: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
b310: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
b320: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
b330: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
b340: 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69  egRowid ){.    i
b350: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  f( eDest==SRT_Se
b360: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
b370: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
b380: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ge(pParse, regRo
b390: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
b3a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
b3b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
b3c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
b3d0: 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ow);.    }.    s
b3e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b3f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
b400: 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Rowid);.  }.  /*
b410: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
b420: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
b430: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
b440: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
b450: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
b460: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
b470: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
b480: 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rter ){.    sqli
b490: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b4a0: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
b4b0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
b4c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b4d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b4e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b4f0: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
b500: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
b510: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
b520: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
b530: 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  n ) sqlite3VdbeA
b540: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
b550: 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  rn, pSort->regRe
b560: 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  turn);.  sqlite3
b570: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b580: 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
b590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b5a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
b5b0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
b5c0: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
b5d0: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
b5e0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
b5f0: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
b600: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
b610: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
b620: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  aller..**.** Als
b630: 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
b640: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
b650: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
b660: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
b670: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70  .** result in *p
b680: 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20  EstWidth..**.** 
b690: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
b6a0: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
b6b0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
b6c0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
b6d0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
b6e0: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
b6f0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
b700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b710: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
b720: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
b730: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
b740: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
b750: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
b760: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
b770: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
b780: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
b790: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
b7a0: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
b7b0: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
b7c0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
b7d0: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
b7e0: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
b7f0: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
b800: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
b810: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
b820: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
b830: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
b840: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
b850: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
b860: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
b870: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
b880: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
b890: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
b8a0: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
b8b0: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
b8c0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
b8d0: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
b8e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
b8f0: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
b900: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
b910: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
b920: 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61  either 3 or 6 pa
b930: 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69  rameters dependi
b940: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
b950: 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49   not.** the SQLI
b960: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b970: 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c  _METADATA compil
b980: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
b990: 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66   used..*/.#ifdef
b9a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
b9b0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23  OLUMN_METADATA.#
b9c0: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
b9d0: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
b9e0: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
b9f0: 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c 73  ,B,C,D,E,F).#els
ba00: 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64  e /* if !defined
ba10: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
ba20: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
ba30: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  */.# define colu
ba40: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
ba50: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
ba60: 70 6c 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69 66  pl(A,B,F).#endif
ba70: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
ba80: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ar *columnTypeIm
ba90: 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pl(.  NameContex
baa0: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
bab0: 2a 70 45 78 70 72 2c 0a 23 69 66 64 65 66 20 53  *pExpr,.#ifdef S
bac0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
bad0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63  UMN_METADATA.  c
bae0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
baf0: 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  igDb,.  const ch
bb00: 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a  ar **pzOrigTab,.
bb10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
bb20: 7a 4f 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69 66  zOrigCol,.#endif
bb30: 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68  .  u8 *pEstWidth
bb40: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
bb50: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
bb60: 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69  nt j;.  u8 estWi
bb70: 64 74 68 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  dth = 1;.#ifdef 
bb80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
bb90: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
bba0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
bbb0: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
bbc0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
bbd0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
bbe0: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
bbf0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
bc00: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
bc10: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
bc20: 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
bc30: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
bc40: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
bc50: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
bc60: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
bc70: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
bc80: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
bc90: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
bca0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
bcb0: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
bcc0: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
bcd0: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
bce0: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
bcf0: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
bd00: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
bd10: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
bd20: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
bd30: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
bd40: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
bd50: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
bd60: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
bd70: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
bd80: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
bd90: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
bda0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
bdb0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
bdc0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
bdd0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
bde0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
bdf0: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
be00: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
be10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
be20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
be30: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
be40: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
be50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
be60: 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  N );.      while
be70: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
be80: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
be90: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
bea0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
beb0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
bec0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
bed0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
bee0: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
bef0: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
bf00: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
bf10: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
bf20: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
bf30: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
bf40: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20  b;.          pS 
bf50: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
bf60: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
bf70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bf80: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
bf90: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
bfa0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
bfb0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
bfc0: 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74       /* At one t
bfd0: 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61  ime, code such a
bfe0: 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22  s "SELECT new.x"
bff0: 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
c000: 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  r would.        
c010: 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63 6f  ** cause this co
c020: 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20  ndition to run. 
c030: 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20   Since then, we 
c040: 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72 65  have restructure
c050: 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  d how.        **
c060: 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69 73   trigger code is
c070: 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73   generated and s
c080: 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  o this condition
c090: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20   is no longer . 
c0a0: 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
c0b0: 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20  le. However, it 
c0c0: 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75  can still be tru
c0d0: 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73  e for statements
c0e0: 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a   like.        **
c0f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c100: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c110: 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
c120: 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45  ABLE t1(col INTE
c130: 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a  GER);.        **
c140: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
c150: 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46  T t1.col) FROM F
c160: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20  ROM t1;.        
c170: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
c180: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
c190: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
c1a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e   expression "t1.
c1b0: 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20  col" in the .   
c1c0: 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65       ** sub-sele
c1d0: 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ct. In this case
c1e0: 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  , set the column
c1f0: 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65   type to NULL, e
c200: 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ven.        ** t
c210: 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
c220: 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47  really be "INTEG
c230: 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ER"..        **.
c240: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
c250: 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
c260: 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  , as the column 
c270: 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22  type of "t1.col"
c280: 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20   is never.      
c290: 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20    ** used. When 
c2a0: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
c2b0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
c2c0: 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20  pression .      
c2d0: 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31    ** "(SELECT t1
c2e0: 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72  .col)", the corr
c2f0: 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74 75  ect type is retu
c300: 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54 4b  rned (see the TK
c310: 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20  _SELECT.        
c320: 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e  ** branch below.
c330: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65    */.        bre
c340: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
c350: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20     assert( pTab 
c360: 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d  && pExpr->pTab==
c370: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
c380: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
c390: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
c3a0: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
c3b0: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
c3c0: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
c3d0: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
c3e0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
c3f0: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
c400: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c410: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
c420: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
c430: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
c440: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
c450: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
c460: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c470: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41  if( iCol>=0 && A
c480: 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70  LWAYS(iCol<pS->p
c490: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
c4a0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
c4b0: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
c4c0: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
c4d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
c4e0: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
c4f0: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
c500: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
c510: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
c520: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
c530: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
c540: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
c550: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
c560: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
c570: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
c580: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
c590: 2a 20 54 68 65 20 41 4c 57 41 59 53 28 29 20 69  * The ALWAYS() i
c5a0: 73 20 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d  s because iCol>=
c5b0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
c5c0: 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  r will have been
c5d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
c5e0: 75 67 68 74 20 61 6c 72 65 61 64 79 20 62 79 20  ught already by 
c5f0: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
c600: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
c610: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
c620: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
c630: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
c640: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
c650: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
c660: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
c670: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
c680: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
c690: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
c6a0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
c6b0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
c6c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
c6d0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26  mnType(&sNC, p,&
c6e0: 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61  zOrigDb,&zOrigTa
c6f0: 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73  b,&zOrigCol, &es
c700: 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20  tWidth); .      
c710: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
c720: 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  if( pTab->pSchem
c730: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
c740: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
c750: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c760: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
c770: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
c780: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
c790: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c7a0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
c7b0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
c7c0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64  b->nCol) );.#ifd
c7d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c7e0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c7f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c800: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
c810: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
c820: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
c830: 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22  rigCol = "rowid"
c840: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
c850: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
c860: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
c870: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
c880: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c890: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
c8a0: 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e(&pTab->aCol[iC
c8b0: 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ol],0);.        
c8c0: 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61    estWidth = pTa
c8d0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a  b->aCol[iCol].sz
c8e0: 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Est;.        }. 
c8f0: 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20         zOrigTab 
c900: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
c910: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
c920: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20  pParse ){.      
c930: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
c940: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
c950: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
c960: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
c970: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
c980: 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  rigDb = pNC->pPa
c990: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
c9a0: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
c9b0: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
c9c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
c9d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
c9e0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
c9f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ca00: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
ca10: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
ca20: 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e(&pTab->aCol[iC
ca30: 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ol],0);.        
ca40: 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61    estWidth = pTa
ca50: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a  b->aCol[iCol].sz
ca60: 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  Est;.        }.#
ca70: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
ca80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ca90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
caa0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
cab0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
cac0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
cad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
cae0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74   sub-select. Ret
caf0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
cb00: 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20  ion type and.   
cb10: 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66     ** origin inf
cb20: 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65  o for the single
cb30: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
cb40: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
cb50: 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a   SELECT.      **
cb60: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
cb70: 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43    */.      NameC
cb80: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
cb90: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70    Select *pS = p
cba0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
cbb0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d  .      Expr *p =
cbc0: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30   pS->pEList->a[0
cbd0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
cbe0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
cbf0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
cc00: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
cc10: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
cc20: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
cc30: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
cc40: 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  pNC;.      sNC.p
cc50: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
cc60: 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  rse;.      zType
cc70: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
cc80: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
cc90: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
cca0: 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68  igCol, &estWidth
ccb0: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
ccc0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ccd0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
cce0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
ccf0: 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20  ETADATA  .  if( 
cd00: 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20  pzOrigDb ){.    
cd10: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61  assert( pzOrigTa
cd20: 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29  b && pzOrigCol )
cd30: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20  ;.    *pzOrigDb 
cd40: 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a  = zOrigDb;.    *
cd50: 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69  pzOrigTab = zOri
cd60: 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  gTab;.    *pzOri
cd70: 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b  gCol = zOrigCol;
cd80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
cd90: 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a 70  ( pEstWidth ) *p
cda0: 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57 69  EstWidth = estWi
cdb0: 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  dth;.  return zT
cdc0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
cdd0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
cde0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
cdf0: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
ce00: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
ce10: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
ce20: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
ce30: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
ce40: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
ce50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ce60: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
ce70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
ce80: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
ce90: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
cea0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
ceb0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
cec0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
ced0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
cee0: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
cef0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
cf00: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
cf10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
cf20: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
cf30: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
cf40: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
cf50: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
cf60: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
cf70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
cf80: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
cf90: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
cfa0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
cfb0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
cfc0: 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20   *zType;.#ifdef 
cfd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
cfe0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
cff0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
d000: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63  rigDb = 0;.    c
d010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
d020: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Tab = 0;.    con
d030: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f  st char *zOrigCo
d040: 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65  l = 0;.    zType
d050: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
d060: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
d070: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
d080: 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20  igCol, 0);..    
d090: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
d0a0: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
d0b0: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
d0c0: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
d0d0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
d0e0: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
d0f0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
d100: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
d110: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
d120: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
d130: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
d140: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
d150: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d160: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
d170: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
d180: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
d190: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d1a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d1b0: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
d1c0: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
d1d0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d1f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d200: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
d210: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
d220: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
d230: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d240: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d250: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  0, 0, 0, 0);.#en
d260: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
d270: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d280: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c   i, COLNAME_DECL
d290: 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c  TYPE, zType, SQL
d2a0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d2b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
d2c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d2d0: 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a  IT_DECLTYPE) */.
d2e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
d2f0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
d300: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
d310: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
d320: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
d330: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
d340: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
d350: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
d360: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
d370: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
d380: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
d390: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
d3a0: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
d3b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d3c0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
d3d0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
d3e0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
d3f0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
d400: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
d410: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
d420: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
d430: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
d440: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
d450: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d460: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
d470: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d480: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
d490: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
d4a0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
d4b0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
d4c0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
d4d0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
d4e0: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
d4f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
d500: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
d510: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
d520: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
d530: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e  NamesSet || db->
d540: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
d550: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
d560: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
d570: 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29  t( pTabList!=0 )
d580: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
d590: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
d5a0: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
d5b0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
d5c0: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
d5d0: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
d5e0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d5f0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
d600: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
d610: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
d620: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
d630: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d640: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
d650: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
d660: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
d670: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d680: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
d690: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d6a0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
d6b0: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
d6c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
d6d0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
d6e0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
d6f0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d700: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
d710: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
d720: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d730: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
d740: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
d750: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
d760: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 54 61 62  UMN ){.      Tab
d770: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
d780: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
d790: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
d7a0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
d7b0: 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
d7c0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29  <pTabList->nSrc)
d7d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
d7e0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
d7f0: 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69  j].iCursor==p->i
d800: 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20  Table ) break;. 
d810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
d820: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
d830: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
d840: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
d850: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
d860: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
d870: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
d880: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d890: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
d8a0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
d8b0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
d8c0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
d8d0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
d8e0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
d8f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
d900: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
d910: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
d920: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
d930: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
d940: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
d950: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d960: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d970: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
d980: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d990: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
d9a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
d9b0: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
d9c0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  C);.      }else 
d9d0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  if( fullNames ){
d9e0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
d9f0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
da00: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
da10: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
da20: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
da30: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
da40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
da50: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
da60: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
da70: 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
da80: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
da90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
daa0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
dab0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
dac0: 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
dad0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
dae0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
daf0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
db00: 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *z = pEList->a[i
db10: 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a  ].zSpan;.      z
db20: 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65   = z==0 ? sqlite
db30: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f  3MPrintf(db, "co
db40: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20  lumn%d", i+1) : 
db50: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
db60: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  db, z);.      sq
db70: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
db80: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
db90: 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54  E_NAME, z, SQLIT
dba0: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
dbb0: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
dbc0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
dbd0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
dbe0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
dbf0: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
dc00: 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20  ion list (which 
dc10: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69  is really the li
dc20: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
dc30: 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74  s.** that form t
dc40: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
dc50: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
dc60: 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70  ent) compute app
dc70: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75  ropriate.** colu
dc80: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74  mn names for a t
dc90: 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20  able that would 
dca0: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
dcb0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
dcc0: 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  All column names
dcd0: 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e   will be unique.
dce0: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
dcf0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
dd00: 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75   computed.  Colu
dd10: 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e  mn.zType, Column
dd20: 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f  .zColl,.** and o
dd30: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43  ther fields of C
dd40: 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64  olumn are zeroed
dd50: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
dd60: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
dd70: 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ess.  If a memor
dd80: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
dd90: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74  or occurs,.** st
dda0: 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43  ore NULL in *paC
ddb0: 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43  ol and 0 in *pnC
ddc0: 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ol and return SQ
ddd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69  LITE_NOMEM..*/.i
dde0: 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  nt sqlite3Column
ddf0: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  sFromExprList(. 
de00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
de10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
de20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
de30: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
de40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  t,       /* Expr
de50: 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68   list from which
de60: 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d   to derive colum
de70: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36  n names */.  i16
de80: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
de90: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
dea0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
deb0: 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f  mns here */.  Co
dec0: 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20  lumn **paCol    
ded0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
dee0: 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69  he new column li
def0: 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  st here */.){.  
df00: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
df10: 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44  arse->db;   /* D
df20: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
df30: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  on */.  int i, j
df40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df50: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
df60: 74 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e  ters */.  u32 cn
df70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
df80: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61        /* Index a
df90: 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  dded to make the
dfa0: 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a   name unique */.
dfb0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
dfc0: 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a  *pCol;        /*
dfd0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
dfe0: 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  r result columns
dff0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e010: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
e020: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
e030: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
e040: 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  pr *p;          
e050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
e060: 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69  ression for a si
e070: 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
e080: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  mn */.  char *zN
e090: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
e0a0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
e0b0: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
e0c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e0d0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
e0e0: 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
e0f0: 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20  /.  Hash ht;    
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66  /* Hash table of
e120: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
e130: 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ..  sqlite3HashI
e140: 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20  nit(&ht);.  if( 
e150: 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43  pEList ){.    nC
e160: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
e170: 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73  pr;.    aCol = s
e180: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
e190: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
e1a0: 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
e1b0: 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c    testcase( aCol
e1c0: 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
e1d0: 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
e1e0: 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a    aCol = 0;.  }.
e1f0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d    assert( nCol==
e200: 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a  (i16)nCol );.  *
e210: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
e220: 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
e230: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
e240: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20  aCol; i<nCol && 
e250: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
e260: 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  d; i++, pCol++){
e270: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
e280: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
e290: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
e2a0: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71     */.    p = sq
e2b0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
e2c0: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
e2d0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
e2e0: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
e2f0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
e300: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
e310: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
e320: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
e330: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
e340: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
e350: 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  me */.    }else{
e360: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
e370: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
e380: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
e390: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
e3a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
e3b0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
e3c0: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
e3d0: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
e3e0: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
e3f0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
e400: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
e410: 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
e420: 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70      pColExpr = p
e430: 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ColExpr->pRight;
e440: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e450: 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a   pColExpr!=0 );.
e460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e470: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
e480: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
e490: 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54  AYS(pColExpr->pT
e4a0: 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ab!=0) ){.      
e4b0: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
e4c0: 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20   use the column 
e4d0: 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  name name */.   
e4e0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
e4f0: 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pColExpr->iColum
e500: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  n;.        pTab 
e510: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
e520: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
e530: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
e540: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
e550: 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e     zName = iCol>
e560: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
e570: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
e580: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
e590: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
e5a0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
e5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
e5c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e5d0: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
e5e0: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
e5f0: 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70   zName = pColExp
e600: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
e610: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e620: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
e630: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
e640: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
e650: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
e660: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
e670: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
e680: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  zSpan;.      }. 
e690: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
e6a0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e6b0: 64 62 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29  db, "%s", zName)
e6c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;..    /* Make s
e6d0: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
e6e0: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
e6f0: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
e700: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
e710: 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65  * append an inte
e720: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
e730: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
e740: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
e750: 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20  /.    cnt = 0;. 
e760: 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20     while( zName 
e770: 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  && sqlite3HashFi
e780: 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d  nd(&ht, zName)!=
e790: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  0 ){.      nName
e7a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e7b0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  30(zName);.     
e7c0: 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a   if( nName>0 ){.
e7d0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e          for(j=nN
e7e0: 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71  ame-1; j>0 && sq
e7f0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
e800: 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20  me[j]); j--){}. 
e810: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
e820: 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [j]==':' ) nName
e830: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
e840: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e850: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e860: 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c  %.*z:%u", nName,
e870: 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
e880: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20        if( cnt>3 
e890: 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  ) sqlite3_random
e8a0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29  ness(sizeof(cnt)
e8b0: 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  , &cnt);.    }. 
e8c0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
e8d0: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69   zName;.    sqli
e8e0: 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
e8f0: 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70  iesFromName(0, p
e900: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  Col);.    if( zN
e910: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
e920: 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e  shInsert(&ht, zN
e930: 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c  ame, pCol)==pCol
e940: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e950: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
e960: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
e970: 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74 29  e3HashClear(&ht)
e980: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
e990: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e9a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
e9b0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
e9c0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
e9d0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
e9e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
e9f0: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
ea00: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
ea10: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
ea20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ea30: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
ea40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ea50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
ea60: 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
ea70: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
ea80: 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
ea90: 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
eaa0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
eab0: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
eac0: 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
ead0: 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
eae0: 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
eaf0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
eb00: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
eb10: 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
eb20: 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
eb30: 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
eb40: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
eb50: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
eb60: 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
eb70: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
eb80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
eb90: 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
eba0: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
ebb0: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
ebc0: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
ebd0: 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
ebe0: 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
ebf0: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
ec00: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
ec10: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
ec20: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
ec30: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
ec40: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
ec50: 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  dd column type i
ec60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
ec70: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  is table */.  Se
ec80: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
ec90: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
eca0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
ecb0: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
ecc0: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
ecd0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ece0: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
ecf0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
ed00: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
ed10: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
ed20: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
ed30: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
ed40: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34  t_item *a;.  u64
ed50: 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61   szAll = 0;..  a
ed60: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d  ssert( pSelect!=
ed70: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
ed80: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
ed90: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
eda0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
edb0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65   pTab->nCol==pSe
edc0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
edd0: 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
ede0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
edf0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ee00: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  d ) return;.  me
ee10: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
ee20: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
ee30: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
ee40: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20  lect->pSrc;.  a 
ee50: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
ee60: 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  t->a;.  for(i=0,
ee70: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
ee80: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
ee90: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
eea0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
eeb0: 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20  ype;.    int n, 
eec0: 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  m;.    p = a[i].
eed0: 70 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65  pExpr;.    zType
eee0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
eef0: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20  NC, p, 0, 0, 0, 
ef00: 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20  &pCol->szEst);. 
ef10: 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c     szAll += pCol
ef20: 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f  ->szEst;.    pCo
ef30: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
ef40: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
ef50: 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  y(p);.    if( zT
ef60: 79 70 65 20 26 26 20 28 6d 20 3d 20 73 71 6c 69  ype && (m = sqli
ef70: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
ef80: 65 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e  e))>0 ){.      n
ef90: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
efa0: 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  30(pCol->zName);
efb0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61  .      pCol->zNa
efc0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  me = sqlite3DbRe
efd0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20  allocOrFree(db, 
efe0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d  pCol->zName, n+m
eff0: 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +2);.      if( p
f000: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  Col->zName ){.  
f010: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43        memcpy(&pC
f020: 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20  ol->zName[n+1], 
f030: 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20  zType, m+1);.   
f040: 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
f050: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48  ags |= COLFLAG_H
f060: 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a  ASTYPE;.      }.
f070: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
f080: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
f090: 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
f0a0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
f0b0: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  OB;.    pColl = 
f0c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
f0d0: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
f0e0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20     if( pColl && 
f0f0: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29  pCol->zColl==0 )
f100: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
f110: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
f120: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
f130: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
f140: 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62   }.  pTab->szTab
f150: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
f160: 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a  Est(szAll*4);.}.
f170: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
f180: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
f190: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
f1a0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
f1b0: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
f1c0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
f1d0: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
f1e0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
f1f0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
f200: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
f210: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
f220: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
f230: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f240: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
f250: 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20  t savedFlags;.. 
f260: 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62   savedFlags = db
f270: 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66  ->flags;.  db->f
f280: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
f290: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  FullColNames;.  
f2a0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
f2b0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
f2c0: 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  s;.  sqlite3Sele
f2d0: 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
f2e0: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
f2f0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
f300: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
f310: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
f320: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
f330: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
f340: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73  .  db->flags = s
f350: 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61  avedFlags;.  pTa
f360: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
f370: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
f380: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
f390: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
f3a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f3b0: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33    /* The sqlite3
f3c0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
f3d0: 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t() is only used
f3e0: 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72   n contexts wher
f3f0: 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a  e lookaside.  **
f400: 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
f410: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
f420: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
f430: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66   );.  pTab->nRef
f440: 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
f450: 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d  ame = 0;.  pTab-
f460: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
f470: 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
f480: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
f490: 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69  48576) );.  sqli
f4a0: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
f4b0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
f4c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
f4d0: 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
f4e0: 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  ab->aCol);.  sql
f4f0: 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
f500: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
f510: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
f520: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
f530: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
f540: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f550: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
f560: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
f570: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
f580: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
f590: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
f5a0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
f5b0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
f5c0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
f5d0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
f5e0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
f5f0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f600: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
f610: 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
f620: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
f630: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
f640: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 56 64 62 65 20  E_NOINLINE Vdbe 
f650: 2a 61 6c 6c 6f 63 56 64 62 65 28 50 61 72 73 65  *allocVdbe(Parse
f660: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
f670: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
f680: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
f690: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29  beCreate(pParse)
f6a0: 3b 0a 20 20 69 66 28 20 76 20 29 20 73 71 6c 69  ;.  if( v ) sqli
f6b0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
f6c0: 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 69 66 28   OP_Init);.  if(
f6d0: 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
f6e0: 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  el==0.   && Opti
f6f0: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
f700: 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
f710: 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
f720: 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ).  ){.    pPars
f730: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
f740: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
f750: 72 6e 20 76 3b 0a 7d 0a 56 64 62 65 20 2a 73 71  rn v;.}.Vdbe *sq
f760: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
f770: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
f780: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
f790: 3e 70 56 64 62 65 3b 0a 20 20 72 65 74 75 72 6e  >pVdbe;.  return
f7a0: 20 76 20 3f 20 76 20 3a 20 61 6c 6c 6f 63 56 64   v ? v : allocVd
f7b0: 62 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a  be(pParse);.}...
f7c0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
f7d0: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
f7e0: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
f7f0: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
f800: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
f810: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
f820: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
f830: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
f840: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
f850: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
f860: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
f870: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
f880: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
f890: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
f8a0: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
f8b0: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
f8c0: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
f8d0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
f8e0: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
f8f0: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
f900: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
f910: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
f920: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
f930: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
f940: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
f950: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
f960: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
f970: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
f980: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
f990: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
f9a0: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
f9b0: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
f9c0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
f9d0: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
f9e0: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
f9f0: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
fa00: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
fa10: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
fa20: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
fa30: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
fa40: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
fa50: 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
fa60: 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
fa70: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
fa80: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
fa90: 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
faa0: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
fab0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
fac0: 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
fad0: 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
fae0: 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
faf0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
fb00: 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
fb10: 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
fb20: 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
fb30: 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
fb40: 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
fb50: 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
fb60: 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
fb70: 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
fb80: 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
fb90: 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
fba0: 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
fbb0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
fbc0: 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
fbd0: 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
fbe0: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
fbf0: 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
fc00: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
fc10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
fc20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
fc30: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
fc40: 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
fc50: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
fc60: 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
fc70: 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
fc80: 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
fc90: 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
fca0: 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  t n;.  if( p->iL
fcb0: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
fcc0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
fcd0: 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
fce0: 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
fcf0: 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
fd00: 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
fd10: 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
fd20: 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
fd30: 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
fd40: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
fd50: 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
fd60: 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
fd70: 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
fd80: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
fd90: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
fda0: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
fdb0: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
fdc0: 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30   || p->pLimit!=0
fdd0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   );.  if( p->pLi
fde0: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
fdf0: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
fe00: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
fe10: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
fe20: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
fe30: 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30      assert( v!=0
fe40: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
fe50: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
fe60: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20  (p->pLimit, &n) 
fe70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fe80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fe90: 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
fea0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
feb0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
fec0: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
fed0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
fee0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fef0: 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65  VdbeGoto(v, iBre
ff00: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
ff10: 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
ff20: 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74  nSelectRow>sqlit
ff30: 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
ff40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
ff50: 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
ff60: 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
ff70: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  );.        p->se
ff80: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78  lFlags |= SF_Fix
ff90: 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d  edLimit;.      }
ffa0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ffb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ffc0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
ffd0: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
ffe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fff0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
10000 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20  BeInt, iLimit); 
10010 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10020 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
10030 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
10040 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
10050 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10060 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
10070 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
10080 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10090 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
100a0 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
100b0 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
100c0 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
100d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
100e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
100f0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
10100 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
10110 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
10120 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
10130 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10140 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
10150 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
10160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10170 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
10180 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
10190 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
101a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
101b0 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
101c0 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
101d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
101e0 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
101f0 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
10200 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  +1, iOffset);.  
10210 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
10220 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
10230 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T"));.    }.  }.
10240 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10250 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
10260 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
10270 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
10280 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
10290 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
102a0 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
102b0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
102c0 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
102d0 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
102e0 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
102f0 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
10300 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
10310 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
10320 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
10330 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
10340 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
10350 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
10360 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
10370 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
10380 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
10390 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
103a0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
103b0 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
103c0 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
103d0 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
103e0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
103f0 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
10400 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
10410 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
10420 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
10430 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
10440 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
10450 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
10460 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
10470 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
10480 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f  l>=0 );.  /* iCo
10490 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74  l must be less t
104a0 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  han p->pEList->n
104b0 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65  Expr.  Otherwise
104c0 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a   an error would.
104d0 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74    ** have been t
104e0 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d  hrown during nam
104f0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64  e resolution and
10500 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61   we would not ha
10510 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74  ve gotten.  ** t
10520 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28  his far */.  if(
10530 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41   pRet==0 && ALWA
10540 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  YS(iCol<p->pELis
10550 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
10560 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
10570 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10580 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
10590 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
105a0 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
105b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
105c0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
105d0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
105e0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
105f0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
10600 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
10610 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
10620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
10630 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
10640 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
10650 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
10660 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
10670 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
10680 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
10690 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
106a0 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
106b0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
106c0 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
106d0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
106e0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
106f0 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
10700 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
10710 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
10720 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
10730 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
10740 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
10750 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
10760 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10770 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
10780 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
10790 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
107a0 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
107b0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
107c0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
107d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
107e0 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
107f0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10800 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
10810 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
10820 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
10830 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
10840 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
10850 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
10860 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
10870 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
10880 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
10890 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
108a0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
108b0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
108c0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
108d0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
108e0 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
108f0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
10900 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
10910 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
10920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10930 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
10940 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
10950 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
10960 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
10970 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
10980 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
10990 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
109a0 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
109b0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
109c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
109d0 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
109e0 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
109f0 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
10a00 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10a10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10a20 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
10a30 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
10a40 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
10a50 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
10a60 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
10a70 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
10a80 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
10a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
10aa0 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
10ab0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10ac0 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
10ad0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
10ae0 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
10af0 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
10b00 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
10b10 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
10b20 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
10b30 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
10b40 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
10b50 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
10b60 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
10b70 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b90 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
10ba0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
10bb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
10bc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
10be0 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
10c00 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
10c10 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
10c20 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
10c30 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
10c40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
10c50 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
10c60 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
10c70 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
10c80 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  a[].fg.isRecursi
10c90 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54  ve flag..**.** T
10ca0 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72  he setup-query r
10cb0 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65  uns once to gene
10cc0 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  rate an initial 
10cd0 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  set of rows that
10ce0 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75   go.** into a Qu
10cf0 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73  eue table.  Rows
10d00 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
10d10 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61  rom the Queue ta
10d20 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e  ble one by.** on
10d30 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74  e.  Each row ext
10d40 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
10d50 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70  e is output to p
10d60 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Dest.  Then the 
10d70 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63  single.** extrac
10d80 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20  ted row (now in 
10d90 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62  the iCurrent tab
10da0 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  le) becomes the 
10db0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a  content of the.*
10dc0 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  * recursive-tabl
10dd0 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76  e for a recursiv
10de0 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68  e-query run.  Th
10df0 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
10e00 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a  recursive-query.
10e10 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b  ** is added back
10e20 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
10e30 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f  table.  Then ano
10e40 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72  ther row is extr
10e50 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
10e60 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72  .** and the iter
10e70 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20  ation continues 
10e80 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
10e90 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
10ea0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
10eb0 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72  pound query oper
10ec0 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68  ator is UNION th
10ed0 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  en no duplicate 
10ee0 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a  rows are ever.**
10ef0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
10f00 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
10f10 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74   The iDistinct t
10f20 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70  able keeps a cop
10f30 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a  y of all rows.**
10f40 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20   that have ever 
10f50 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
10f60 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75  to Queue and cau
10f70 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74  ses duplicates t
10f80 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65  o be.** discarde
10f90 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61  d.  If the opera
10fa0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c  tor is UNION ALL
10fb0 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65  , then duplicate
10fc0 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
10fd0 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  * .** If the que
10fe0 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  ry has an ORDER 
10ff0 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73  BY, then entries
11000 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61   in the Queue ta
11010 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a  ble are kept in.
11020 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  ** ORDER BY orde
11030 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  r and the first 
11040 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74  entry is extract
11050 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c  ed for each cycl
11060 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61  e.  Without.** a
11070 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
11080 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a  Queue table is j
11090 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a  ust a FIFO..**.*
110a0 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61  * If a LIMIT cla
110b0 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  use is provided,
110c0 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
110d0 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20  ion stops after 
110e0 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61  LIMIT rows.** ha
110f0 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74  ve been output t
11100 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49  o pDest.  A LIMI
11110 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20  T of zero means 
11120 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77  to output no row
11130 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74  s and a.** negat
11140 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20  ive LIMIT means 
11150 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f  to output all ro
11160 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ws.  If there is
11170 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20   also an OFFSET 
11180 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61  clause.** with a
11190 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
111a0 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
111b0 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61  OFFSET outputs a
111c0 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74  re discarded rat
111d0 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e  her.** than bein
111e0 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e  g sent to pDest.
111f0 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e    The LIMIT coun
11200 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
11210 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46   until after OFF
11220 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65  SET.** rows have
11230 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a   been skipped..*
11240 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
11250 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
11260 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73  iveQuery(.  Pars
11270 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11280 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11290 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
112a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
112b0 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65  /* The recursive
112c0 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f   SELECT to be co
112d0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
112e0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
112f0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
11300 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
11310 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
11320 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
11330 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
11340 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
11350 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
11360 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  */.  int nCol = 
11370 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11380 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
11390 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
113a0 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a  ecursive table *
113b0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
113c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
113d0 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
113e0 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
113f0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
11400 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74  /.  Select *pSet
11410 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20  up = p->pPrior; 
11420 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71    /* The setup q
11430 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  uery */.  int ad
11440 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
11450 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
11460 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
11470 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  int addrCont, ad
11480 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a  drBreak;      /*
11490 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52   CONTINUE and BR
114a0 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f  EAK addresses */
114b0 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
114c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
114d0 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20   /* The Current 
114e0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
114f0 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20  egCurrent;      
11500 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11510 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72  ster holding Cur
11520 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
11530 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20  int iQueue;     
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11550 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   The Queue table
11560 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69   */.  int iDisti
11570 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nct = 0;        
11580 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
11590 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20   unique results 
115a0 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e  if UNION */.  in
115b0 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69  t eDest = SRT_Fi
115c0 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  fo;         /* H
115d0 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51  ow to write to Q
115e0 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ueue */.  Select
115f0 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20  Dest destQueue; 
11600 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
11610 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67  tDest targetting
11620 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11630 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11650 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11660 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11690 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c   code */.  ExprL
116a0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
116b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
116c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
116d0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
116e0 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20  t, *pOffset;    
116f0 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49     /* Saved LIMI
11700 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
11710 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20    int regLimit, 
11720 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20  regOffset;      
11730 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65  /* Registers use
11740 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f  d by LIMIT and O
11750 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  FFSET */..  /* O
11760 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74  btain authorizat
11770 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75  ion to do a recu
11780 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
11790 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
117a0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
117b0 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20  LITE_RECURSIVE, 
117c0 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
117d0 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73  n;..  /* Process
117e0 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
117f0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69  FFSET clauses, i
11800 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a  f they exist */.
11810 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71    addrBreak = sq
11820 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11830 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65  el(v);.  compute
11840 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
11850 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72  Parse, p, addrBr
11860 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d  eak);.  pLimit =
11870 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f   p->pLimit;.  pO
11880 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
11890 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d  et;.  regLimit =
118a0 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65   p->iLimit;.  re
118b0 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  gOffset = p->iOf
118c0 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  fset;.  p->pLimi
118d0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  t = p->pOffset =
118e0 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20   0;.  p->iLimit 
118f0 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  = p->iOffset = 0
11900 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
11910 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  ->pOrderBy;..  /
11920 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72  * Locate the cur
11930 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
11940 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
11950 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c  */.  for(i=0; AL
11960 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72  WAYS(i<pSrc->nSr
11970 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  c); i++){.    if
11980 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e  ( pSrc->a[i].fg.
11990 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  isRecursive ){. 
119a0 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20       iCurrent = 
119b0 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
119c0 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  or;.      break;
119d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
119e0 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
119f0 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75  s numbers for Qu
11a00 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74  eue and Distinct
11a10 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
11a20 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68  mber for.  ** th
11a30 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65  e Distinct table
11a40 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
11a50 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
11a60 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72  n Queue in order
11a70 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52  .  ** for the SR
11a80 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53  T_DistFifo and S
11a90 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73  RT_DistQueue des
11aa0 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72  tinations to wor
11ab0 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d  k. */.  iQueue =
11ac0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
11ad0 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
11ae0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44  _UNION ){.    eD
11af0 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
11b00 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a   SRT_DistQueue :
11b10 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20   SRT_DistFifo;. 
11b20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70     iDistinct = p
11b30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
11b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73   }else{.    eDes
11b50 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53  t = pOrderBy ? S
11b60 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46  RT_Queue : SRT_F
11b70 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ifo;.  }.  sqlit
11b80 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
11b90 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65  (&destQueue, eDe
11ba0 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  st, iQueue);..  
11bb0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
11bc0 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c  ors for Current,
11bd0 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74   Queue, and Dist
11be0 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75  inct. */.  regCu
11bf0 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65  rrent = ++pParse
11c00 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
11c10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11c20 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43  P_OpenPseudo, iC
11c30 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65  urrent, regCurre
11c40 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28  nt, nCol);.  if(
11c50 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
11c60 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
11c70 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  fo = multiSelect
11c80 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
11c90 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
11ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11cb0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
11cc0 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
11cd0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
11ce0 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
11d00 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
11d10 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64  _KEYINFO);.    d
11d20 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42  estQueue.pOrderB
11d30 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11d40 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
11d50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11d60 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
11d70 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b  , iQueue, nCol);
11d80 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65  .  }.  VdbeComme
11d90 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61  nt((v, "Queue ta
11da0 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44  ble"));.  if( iD
11db0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70  istinct ){.    p
11dc0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
11dd0 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
11de0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
11df0 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74  Ephemeral, iDist
11e00 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  inct, 0);.    p-
11e10 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
11e20 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
11e30 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20   }..  /* Detach 
11e40 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11e50 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d  use from the com
11e60 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
11e70 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
11e80 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74  0;..  /* Store t
11e90 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
11ea0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e  e setup-query in
11eb0 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65   Queue. */.  pSe
11ec0 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  tup->pNext = 0;.
11ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
11ee0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
11ef0 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
11f00 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  ;.  pSetup->pNex
11f10 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20  t = p;.  if( rc 
11f20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65  ) goto end_of_re
11f30 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a  cursive_query;..
11f40 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
11f50 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75  xt row in the Qu
11f60 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74  eue and output t
11f70 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64  hat row */.  add
11f80 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
11f90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
11fa0 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61  ewind, iQueue, a
11fb0 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
11fc0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
11fd0 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e  * Transfer the n
11fe0 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65  ext row in Queue
11ff0 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74   over to Current
12000 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
12010 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
12020 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29  llRow, iCurrent)
12030 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f  ; /* To reset co
12040 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  lumn cache */.  
12050 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
12060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12070 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
12080 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  mn, iQueue, pOrd
12090 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
120a0 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65  egCurrent);.  }e
120b0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
120c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
120d0 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65  _RowData, iQueue
120e0 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
120f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
12100 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
12110 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  ete, iQueue);.. 
12120 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
12130 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
12140 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f  rent */.  addrCo
12150 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
12160 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
12170 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65  codeOffset(v, re
12180 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  gOffset, addrCon
12190 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  t);.  selectInne
121a0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
121b0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72   p->pEList, iCur
121c0 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30  rent,.      0, 0
121d0 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e  , pDest, addrCon
121e0 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
121f0 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b   if( regLimit ){
12200 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12210 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
12220 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69  rJumpZero, regLi
12230 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  mit, addrBreak);
12240 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
12250 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
12260 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
12270 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29  bel(v, addrCont)
12280 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  ;..  /* Execute 
12290 74 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  the recursive SE
122a0 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20  LECT taking the 
122b0 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
122c0 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68  rrent as.  ** th
122d0 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
122e0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e  recursive-table.
122f0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
12300 74 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e  ts in the Queue.
12310 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
12320 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
12330 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71  regate ){.    sq
12340 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12350 61 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65  arse, "recursive
12360 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
12370 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  es not supported
12380 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
12390 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
123a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
123b0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
123c0 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73  stQueue);.    as
123d0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
123e0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  =0 );.    p->pPr
123f0 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20  ior = pSetup;.  
12400 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e  }..  /* Keep run
12410 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e  ning the loop un
12420 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73  til the Queue is
12430 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69   empty */.  sqli
12440 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
12450 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
12460 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
12470 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
12480 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  ;..end_of_recurs
12490 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c  ive_query:.  sql
124a0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
124b0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
124c0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
124d0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
124e0 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
124f0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
12500 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
12510 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  set;.  return;.}
12520 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12530 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
12540 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
12550 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
12560 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
12570 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
12580 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12590 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
125a0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
125b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
125c0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
125d0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
125e0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
125f0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
12600 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
12610 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
12620 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48  s */.);../*.** H
12630 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61  andle the specia
12640 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70  l case of a comp
12650 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
12660 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
12670 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61   a.** VALUES cla
12680 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e  use.  By handlin
12690 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  g this as a spec
126a0 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f  ial case, we avo
126b0 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72  id deep.** recur
126c0 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64  sion, and thus d
126d0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e  o not need to en
126e0 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45  force the SQLITE
126f0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
12700 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56  SELECT.** on a V
12710 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a  ALUES clause..**
12720 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20  .** Because the 
12730 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72  Select object or
12740 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20  iginates from a 
12750 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a  VALUES clause:.*
12760 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e  *   (1) It has n
12770 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45  o LIMIT or OFFSE
12780 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74  T.**   (2) All t
12790 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41  erms are UNION A
127a0 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72  LL.**   (3) Ther
127b0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
127c0 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69   clause.*/.stati
127d0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
127e0 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
127f0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12800 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12810 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12820 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12830 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12840 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12850 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12860 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12870 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12880 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12890 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
128a0 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e  ct *pPrior;.  in
128b0 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
128c0 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t rc = 0;.  asse
128d0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
128e0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
128f0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
12900 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
12910 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
12920 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
12930 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
12940 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
12950 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
12960 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12970 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20  ->pLimit==0 );. 
12980 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
12990 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ffset==0 );.    
129a0 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74  assert( p->pNext
129b0 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74  ==0 || p->pEList
129c0 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78  ->nExpr==p->pNex
129d0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
129e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
129f0 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b  Prior==0 ) break
12a00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
12a10 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d  >pPrior->pNext==
12a20 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  p );.    p = p->
12a30 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77  pPrior;.    nRow
12a40 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ++;.  }while(1);
12a50 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
12a60 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70     pPrior = p->p
12a70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50  Prior;.    p->pP
12a80 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  rior = 0;.    rc
12a90 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
12aa0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
12ab0 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  t);.    p->pPrio
12ac0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
12ad0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
12ae0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
12af0 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20  w = nRow;.    p 
12b00 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
12b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12b20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12b30 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
12b40 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
12b50 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
12b60 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
12b70 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
12b80 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
12b90 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
12ba0 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
12bb0 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
12bc0 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
12bd0 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
12be0 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
12bf0 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
12c00 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
12c10 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
12c20 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
12c30 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
12c40 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
12c50 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
12c60 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
12c70 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
12c80 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
12c90 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
12ca0 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
12cb0 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
12cc0 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
12cd0 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
12ce0 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
12cf0 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
12d00 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
12d10 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
12d20 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
12d30 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
12d40 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
12d50 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
12d60 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
12d70 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
12d80 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
12d90 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
12da0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
12db0 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
12dc0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
12dd0 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
12de0 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
12df0 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
12e20 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
12e30 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
12e40 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
12e50 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
12e60 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
12e70 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
12e80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
12e90 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
12ea0 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
12eb0 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
12ec0 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
12ed0 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
12ee0 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
12ef0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
12f00 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
12f10 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
12f20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
12f30 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
12f40 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
12f50 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
12f60 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
12f70 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
12f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
12f90 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
12fa0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12fb0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12fc0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
12fd0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12fe0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
12ff0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
13000 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
13010 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
13020 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
13030 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
13040 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
13050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13060 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
13070 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
13080 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
13090 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
130a0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
130b0 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
130c0 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
130d0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
130e0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
130f0 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
13100 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
13110 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
13120 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
13130 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
13140 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
13150 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
13160 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
13170 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
13180 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
13190 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
131a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
131b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
131c0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
131d0 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20   int iSub1 = 0; 
131e0 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
131f0 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
13200 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
13210 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  b2 = 0;        /
13220 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
13230 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
13240 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
13250 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
13260 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
13270 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
13280 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
13290 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
132a0 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
132b0 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
132c0 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
132d0 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
132e0 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
132f0 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
13300 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
13310 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
13320 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
13330 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
13340 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
13350 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d  ursive)==0 || p-
13360 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
13370 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
13380 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
13390 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
133a0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73  p->pPrior;.  des
133b0 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
133c0 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
133d0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
133e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
133f0 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
13400 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
13410 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
13420 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
13430 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
13440 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
13450 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
13460 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
13470 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
13480 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13490 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
134a0 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
134b0 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
134c0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
134d0 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
134e0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
134f0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
13500 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13510 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
13520 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13530 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
13540 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
13550 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
13560 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
13570 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
13580 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
13590 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
135a0 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
135b0 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
135c0 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
135d0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
135e0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
135f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
13600 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13610 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
13620 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e  est.iSDParm, p->
13630 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
13640 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
13650 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
13660 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61  .  /* Special ha
13670 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d  ndling for a com
13680 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
13690 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20  t originates as 
136a0 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  a VALUES clause.
136b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
136c0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
136d0 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72  tiValue ){.    r
136e0 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56  c = multiSelectV
136f0 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c  alues(pParse, p,
13700 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74   &dest);.    got
13710 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13720 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  nd;.  }..  /* Ma
13730 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
13740 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
13750 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
13760 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
13770 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
13780 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
13790 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
137a0 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
137b0 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
137c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
137d0 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f  st->nExpr==pPrio
137e0 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
137f0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
13800 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69  ITE_OMIT_CTE.  i
13810 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
13820 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
13830 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74  .    generateWit
13840 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
13850 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
13860 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
13870 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  f..  /* Compound
13880 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
13890 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
138a0 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
138b0 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
138c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
138d0 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
138e0 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
138f0 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
13900 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   pDest);.  }else
13910 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
13920 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
13930 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
13940 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
13950 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
13960 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
13970 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
13980 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
13990 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
139a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
139b0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
139c0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
139d0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
139e0 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
139f0 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
13a00 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72  ffset;.      pPr
13a10 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d  ior->pLimit = p-
13a20 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
13a30 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d  Prior->pOffset =
13a40 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
13a50 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
13a60 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
13a70 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
13a80 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
13a90 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13aa0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
13ab0 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  st);.      p->pL
13ac0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
13ad0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
13ae0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
13af0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
13b00 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
13b20 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
13b30 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
13b40 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
13b50 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
13b60 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
13b70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
13b80 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
13b90 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
13ba0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13bb0 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74  IfNot, p->iLimit
13bc0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
13bd0 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
13be0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
13bf0 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
13c00 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
13c10 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66       if( p->iOff
13c20 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
13c30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13c40 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
13c50 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c70 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e    p->iLimit, p->
13c80 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f  iOffset+1, p->iO
13c90 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
13ca0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13cb0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
13cc0 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
13cd0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
13ce0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13cf0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
13d00 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
13d10 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
13d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
13d30 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
13d40 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
13d50 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
13d60 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  r;.      p->nSel
13d70 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
13d80 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
13d90 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
13da0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
13db0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
13dc0 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26  pLimit.       &&
13dd0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
13de0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
13df0 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20  imit, &nLimit). 
13e00 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e        && nLimit>
13e10 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
13e20 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow > sqlite3LogE
13e30 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 20  st((u64)nLimit) 
13e40 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13e50 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13e60 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
13e70 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20  (u64)nLimit);.  
13e80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13e90 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
13ea0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13eb0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
13ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13ed0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13ee0 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
13ef0 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
13f00 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
13f10 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
13f20 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
13f30 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13f40 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
13f50 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d  */.      u8 op =
13f60 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
13f70 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
13f80 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
13f90 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
13fa0 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
13fb0 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
13fc0 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
13fd0 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
13fe0 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
13ff0 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
14000 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
14010 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
14020 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
14030 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
14040 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
14050 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
14060 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14070 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
14080 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14090 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
140a0 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
140b0 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
140c0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
140d0 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
140e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
140f0 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
14100 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
14110 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
14120 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
14130 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
14140 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
14150 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
14160 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
14170 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
14180 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
14190 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
141a0 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
141b0 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   );     /* Not a
141c0 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
141d0 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
141e0 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
141f0 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
14200 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14210 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
14220 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
14230 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
14240 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
14250 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
14260 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
14270 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
14280 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
14290 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
142a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
142b0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
142c0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72   );.        addr
142d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
142e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
142f0 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
14300 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
14310 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
14320 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
14330 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
14340 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14350 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66   addr;.        f
14360 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
14370 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
14380 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
14390 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
143a0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
143b0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
143c0 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
143d0 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
143e0 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
143f0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
14400 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
14410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
14420 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
14430 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
14440 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
14450 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14460 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
14470 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14480 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
14490 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
144a0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
144b0 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
144c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
144d0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
144e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
144f0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14500 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
14510 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
14520 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14530 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
14540 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
14550 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
14560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14570 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
14580 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
14590 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
145a0 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
145b0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
145c0 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
145d0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
145e0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
145f0 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
14600 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
14610 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
14620 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
14630 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
14640 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
14650 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
14660 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
14670 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
14680 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
14690 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
146a0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
146b0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
146c0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
146d0 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
146e0 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
146f0 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
14700 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
14710 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
14720 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
14730 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
14740 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
14750 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
14760 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
14770 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
14780 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
14790 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
147a0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
147b0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
147c0 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
147d0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
147e0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
147f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
14800 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
14810 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
14820 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
14830 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
14840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
14850 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
14860 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
14870 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
14880 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
14890 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
148a0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
148b0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
148c0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
148d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
148e0 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
148f0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14900 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
14910 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
14920 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
14930 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
14940 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
14950 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
14960 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
14970 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
14980 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
14990 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
149a0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
149b0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
149c0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
149d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
149e0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
149f0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
14a00 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
14a10 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
14a20 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
14a30 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
14a40 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
14a50 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
14a60 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
14a70 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
14a80 6d 65 73 28 70 50 61 72 73 65 2c 20 70 46 69 72  mes(pParse, pFir
14a90 73 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73 74  st->pSrc, pFirst
14aa0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
14ab0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
14ac0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
14ad0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14ae0 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
14af0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14b00 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
14b10 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
14b20 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14b30 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14b50 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
14b60 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
14b70 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
14b80 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53  e(v);.        iS
14b90 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
14ba0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
14bb0 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
14bc0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
14bd0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
14be0 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20  unionTab,.      
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
14c10 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
14c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14c30 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
14c40 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
14c50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14c60 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
14c70 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
14c80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
14c90 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
14ca0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14cb0 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
14cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14cd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14ce0 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
14cf0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
14d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14d10 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
14d20 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
14d30 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
14d40 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
14d50 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
14d60 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
14d70 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
14d80 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
14d90 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
14da0 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
14db0 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
14dc0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
14dd0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
14de0 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
14df0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
14e00 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
14e10 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
14e20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14e30 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
14e40 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
14e50 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
14e60 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
14e70 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
14e80 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
14e90 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
14ea0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
14eb0 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
14ec0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
14ed0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
14ee0 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
14ef0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
14f00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
14f10 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
14f20 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
14f30 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
14f40 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
14f50 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
14f60 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
14f70 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
14f80 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
14f90 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
14fa0 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
14fb0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
14fc0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
14fd0 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
14fe0 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
14ff0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
15000 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
15010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15020 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
15030 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
15040 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
15050 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15060 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
15070 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15080 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15090 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
150a0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
150b0 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
150c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
150d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
150e0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
150f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15100 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
15110 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
15120 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
15130 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
15140 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15150 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15160 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15170 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
15180 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
15190 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
151a0 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
151b0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
151c0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
151d0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
151e0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
151f0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
15200 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
15210 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
15220 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
15230 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
15240 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
15250 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
15260 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
15270 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
15280 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
15290 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
152a0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
152b0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
152c0 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
152d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
152e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
152f0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
15300 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
15310 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
15320 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
15330 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
15340 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
15350 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
15360 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
15370 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
15380 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
15390 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
153a0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
153b0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
153c0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
153d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
153e0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
153f0 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
15400 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
15410 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
15420 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
15430 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
15440 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
15450 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
15460 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
15470 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
15480 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
15490 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
154a0 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
154b0 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
154c0 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
154d0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
154e0 73 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74  s(pParse, pFirst
154f0 2d 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e  ->pSrc, pFirst->
15500 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
15510 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
15520 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15530 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
15540 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
15550 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15560 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
15570 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
15580 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
15590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
155a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
155b0 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
155c0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
155d0 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  e(v);.      r1 =
155e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
155f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
15600 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
15610 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15620 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
15630 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
15640 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
15650 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
15660 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
15670 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
15680 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
15690 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
156a0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
156b0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
156c0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
156d0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
156e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
156f0 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
15700 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
15710 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
15720 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15730 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
15740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15750 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
15760 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
15770 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15790 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
157a0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
157b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
157c0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
157d0 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
157e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
157f0 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
15800 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
15810 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
15820 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ..  explainCompo
15830 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
15840 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
15850 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  , p->op!=TK_ALL)
15860 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
15870 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
15880 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a  ces used by .  *
15890 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
158a0 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
158b0 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
158c0 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
158d0 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
158e0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
158f0 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
15900 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
15910 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
15920 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
15930 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
15940 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
15950 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
15960 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
15970 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
15980 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
15990 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
159a0 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
159b0 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
159c0 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
159d0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
159e0 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
159f0 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
15a00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
15a10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
15a20 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
15a30 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a50 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
15a60 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
15a70 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
15a80 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
15a90 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
15aa0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
15ab0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f  .    Select *pLo
15ac0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
15ad0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
15ae0 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54  g through SELECT
15af0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
15b00 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43     CollSeq **apC
15b10 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
15b20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
15b30 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f  through pKeyInfo
15b40 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  ->aColl[] */.   
15b50 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
15b80 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
15b90 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  t */..    assert
15ba0 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b  ( p->pNext==0 );
15bb0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
15bc0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
15bd0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
15be0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
15bf0 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  (db, nCol, 1);. 
15c00 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
15c10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
15c20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
15c30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
15c40 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
15c50 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
15c60 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66  , apColl=pKeyInf
15c70 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c  o->aColl; i<nCol
15c80 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29  ; i++, apColl++)
15c90 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20  {.      *apColl 
15ca0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
15cb0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
15cc0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i);.      if( 0=
15cd0 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  =*apColl ){.    
15ce0 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62      *apColl = db
15cf0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
15d00 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
15d10 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
15d20 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
15d30 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
15d40 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
15d50 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
15d60 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
15d70 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20  drOpenEphm[i];. 
15d80 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
15d90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
15da0 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
15db0 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
15dc0 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
15dd0 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
15de0 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
15df0 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
15e00 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
15e10 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
15e20 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
15e30 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
15e40 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20  drOpenEphm[1]<0 
15e50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
15e60 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
15e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15e80 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
15e90 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
15ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15eb0 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
15ec0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
15ed0 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
15ee0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
15f00 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
15f10 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f      pLoop->addrO
15f20 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b  penEphm[i] = -1;
15f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15f40 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
15f50 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
15f60 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
15f70 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74  ect_end:.  pDest
15f80 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  ->iSdst = dest.i
15f90 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e  Sdst;.  pDest->n
15fa0 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73  Sdst = dest.nSds
15fb0 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  t;.  sqlite3Sele
15fc0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  ctDelete(db, pDe
15fd0 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  lete);.  return 
15fe0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
15ff0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
16000 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
16010 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73  /*.** Error mess
16020 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f  age for when two
16030 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f   or more terms o
16040 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
16050 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65  ect have differe
16060 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c  nt.** size resul
16070 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  t sets..*/.void 
16080 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f  sqlite3SelectWro
16090 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28  ngNumTermsError(
160a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
160b0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
160c0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
160d0 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20  F_Values ){.    
160e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
160f0 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
16100 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
16110 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
16120 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73   terms");.  }els
16130 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
16140 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16150 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
16160 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
16170 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
16180 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
16190 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
161a0 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
161b0 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
161c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
161d0 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73  Code an output s
161e0 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  ubroutine for a 
161f0 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
16200 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a  entation of a.**
16210 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74   SELECT statment
16220 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
16230 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73   to be output is
16240 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49   contained in pI
16250 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65  n->iSdst.  There
16260 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64   are.** pIn->nSd
16270 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  st columns to be
16280 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
16290 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
162a0 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
162b0 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
162c0 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
162d0 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
162e0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
162f0 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
16300 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
16310 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
16320 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  0 then it is the
16330 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
16340 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
16350 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
16360 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
16370 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
16380 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
16390 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
163a0 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
163b0 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
163c0 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
163d0 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
163e0 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
163f0 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
16400 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
16410 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
16420 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
16430 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
16440 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
16450 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
16460 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
16470 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
16480 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
16490 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
164a0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
164b0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
164c0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
164d0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
164e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
164f0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
16500 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
16510 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
16520 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
16530 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
16540 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
16550 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
16560 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
16570 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
16580 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
16590 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
165a0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
165b0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
165c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
165d0 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
165e0 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
165f0 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
16600 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
16610 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
16620 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
16630 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
16640 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16660 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20  Jump here if we 
16670 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f  hit the LIMIT */
16680 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
16690 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
166a0 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a   int iContinue;.
166b0 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61    int addr;..  a
166c0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
166d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
166e0 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  .  iContinue = s
166f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16700 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75  bel(v);..  /* Su
16710 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
16720 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43  s for UNION, EXC
16730 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
16740 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  CT .  */.  if( r
16750 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e  egPrev ){.    in
16760 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
16770 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
16780 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16790 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
167a0 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ev); VdbeCoverag
167b0 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20  e(v);.    addr2 
167c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
167d0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
167e0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  e, pIn->iSdst, r
167f0 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
16800 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Sdst,.          
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16820 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
16830 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
16840 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
16850 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
16860 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16870 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20  _Jump, addr2+2, 
16880 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32  iContinue, addr2
16890 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
168a0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
168b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
168c0 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
168d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
168e0 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e  , OP_Copy, pIn->
168f0 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
16900 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b  , pIn->nSdst-1);
16910 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16920 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16930 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
16940 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
16950 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
16960 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
16970 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
16980 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
16990 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
169a0 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
169b0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
169c0 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
169d0 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
169e0 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e);..  assert( p
169f0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
16a00 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73  _Exists );.  ass
16a10 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
16a20 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t!=SRT_Table );.
16a30 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
16a40 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
16a50 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
16a60 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
16a70 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
16a80 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
16a90 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
16aa0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
16ab0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16ac0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
16ad0 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
16ae0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16af0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16b00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16b10 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
16b20 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16b30 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  st, r1);.      s
16b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16b50 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
16b60 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
16b70 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
16b80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16b90 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73   OP_Insert, pDes
16ba0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20  t->iSDParm, r1, 
16bb0 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
16bc0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
16bd0 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
16be0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16bf0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16c00 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
16c10 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16c20 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16c30 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
16c40 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
16c50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16c60 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
16c70 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
16c80 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
16c90 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
16ca0 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
16cb0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
16cc0 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
16cd0 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
16ce0 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
16cf0 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
16d00 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
16d10 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
16d20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
16d30 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
16d40 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
16d50 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
16d60 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65  dst==1 || pParse
16d70 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 20 20  ->nErr>0 );.    
16d80 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
16d90 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16da0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16db0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16dc0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
16dd0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16de0 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72  st, .          r
16df0 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  1, pDest->zAffSd
16e00 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  st,1);.      sql
16e10 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
16e20 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
16e30 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
16e40 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16e50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16e60 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
16e70 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29  st->iSDParm, r1)
16e80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16e90 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16ea0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
16eb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16ec0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
16ed0 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
16ee0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
16ef0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
16f00 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
16f10 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
16f20 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
16f30 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
16f40 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
16f50 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
16f60 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
16f70 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
16f80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
16f90 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50  ->nSdst==1 || pP
16fa0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20  arse->nErr>0 ); 
16fb0 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
16fc0 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20  nSdst!=1 );.    
16fd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16fe0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16ff0 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
17000 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20  >iSDParm, 1);.  
17010 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
17020 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
17030 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
17040 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
17050 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
17060 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
17070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
17080 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
17090 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
170a0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
170b0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
170c0 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
170d0 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64  ng at pDest->iSd
170e0 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  st.  Then the co
170f0 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e  -routine yields.
17100 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
17110 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
17120 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  {.      if( pDes
17130 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
17140 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53         pDest->iS
17150 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dst = sqlite3Get
17160 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
17170 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17180 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53         pDest->nS
17190 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74  dst = pIn->nSdst
171a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
171b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
171c0 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
171d0 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
171e0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
171f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17200 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
17210 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
17220 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62  SDParm);.      b
17230 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
17240 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
17250 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  he above, then t
17260 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e  he result destin
17270 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20  ation must be.  
17280 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e    ** SRT_Output.
17290 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
172a0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  s never called w
172b0 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20  ith any other.  
172c0 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e    ** destination
172d0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
172e0 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f  ones handled abo
172f0 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  ve or SRT_Output
17300 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17310 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20  For SRT_Output, 
17320 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
17330 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
17340 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20   of registers.  
17350 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  .    ** Then the
17360 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70   OP_ResultRow op
17370 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
17380 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74  cause sqlite3_st
17390 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72  ep() to.    ** r
173a0 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72  eturn the next r
173b0 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20  ow of result..  
173c0 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
173d0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
173e0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
173f0 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
17400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17410 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
17420 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73  ltRow, pIn->iSds
17430 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17440 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17450 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
17460 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
17470 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17480 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
17490 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
174a0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
174b0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
174c0 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
174d0 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
174e0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
174f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
17510 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
17520 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
17530 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17540 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
17550 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
17560 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
17570 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17580 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
17590 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
175a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
175b0 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
175c0 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
175d0 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
175e0 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
175f0 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
17600 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
17610 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
17620 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
17630 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
17640 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
17650 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17660 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
17670 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
17680 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
17690 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
176a0 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
176b0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
176c0 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
176d0 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
176e0 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
176f0 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
17700 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
17710 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
17720 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
17730 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
17740 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
17750 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
17760 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
17770 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
17780 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
17790 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
177a0 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
177b0 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
177c0 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
177d0 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
177e0 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
177f0 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
17800 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
17810 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17820 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
17830 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
17840 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
17850 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
17860 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
17870 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
17880 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
17890 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
178a0 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
178b0 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
178c0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
178d0 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
178e0 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
178f0 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
17900 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
17910 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
17920 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
17930 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
17940 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
17950 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
17960 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
17970 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
17980 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
17990 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
179a0 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
179b0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
179c0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
179d0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
179e0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
179f0 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
17a00 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
17a10 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
17a20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
17a30 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
17a40 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
17a50 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
17a60 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
17a70 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
17a80 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
17a90 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
17aa0 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
17ab0 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
17ac0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
17ad0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
17ae0 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
17af0 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
17b00 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
17b10 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
17b20 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
17b30 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
17b40 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
17b50 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
17b60 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
17b70 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
17b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
17b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ba0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17bb0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17bc0 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
17bd0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
17be0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
17bf0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
17c00 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
17c10 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
17c20 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
17c30 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
17c40 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
17c50 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
17c60 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
17c70 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
17c80 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
17c90 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
17ca0 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
17cb0 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
17cc0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
17cd0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
17ce0 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
17cf0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
17d00 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
17d10 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
17d20 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
17d30 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
17d40 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
17d50 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
17d60 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
17d70 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
17d80 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
17d90 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
17da0 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
17db0 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
17dc0 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
17dd0 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
17de0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
17df0 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
17e00 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
17e10 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
17e20 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
17e30 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
17e40 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
17e50 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
17e60 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
17e70 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
17e80 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
17e90 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
17ea0 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
17eb0 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
17ec0 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
17ed0 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
17ee0 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
17ef0 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
17f00 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
17f10 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
17f20 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
17f30 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
17f40 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
17f50 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
17f60 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
17f70 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
17f80 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
17f90 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
17fa0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
17fb0 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
17fc0 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
17fd0 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
17fe0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
17ff0 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
18000 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
18010 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
18020 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
18030 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
18040 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
18050 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
18060 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
18070 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
18080 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
18090 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
180a0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
180b0 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
180c0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
180d0 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
180e0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
180f0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
18100 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
18110 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
18120 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
18130 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
18140 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
18150 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
18160 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
18170 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
18180 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
18190 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
181a0 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
181b0 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
181c0 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
181d0 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
181e0 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
181f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
18200 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
18210 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
18220 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
18230 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
18240 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
18250 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
18260 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
18270 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
18280 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
18290 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
182a0 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
182b0 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
182c0 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
182d0 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
182e0 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
182f0 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
18300 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
18310 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
18320 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
18330 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
18340 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18350 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
18360 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
18370 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
18380 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
18390 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
183a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
183b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
183c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
183d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
183e0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
183f0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
18400 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
18410 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
18420 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
18430 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
18440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18450 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
18460 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
18470 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
18480 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
18490 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
184a0 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
184b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
184c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
184d0 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
184e0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
184f0 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
18500 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
18510 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
18520 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
18530 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
18540 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
18550 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
18560 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
18570 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
18580 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
18590 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
185a0 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
185b0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
185c0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
185d0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
185e0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
185f0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
18600 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
18610 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
18620 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
18630 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
18640 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
18650 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
18660 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
18670 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18680 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
18690 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
186a0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
186b0 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
186c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
186d0 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
186e0 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
186f0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
18700 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
18710 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
18720 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
18730 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18740 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
18750 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18760 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
18770 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18780 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
18790 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
187a0 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
187b0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
187c0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
187d0 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
187e0 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
187f0 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
18800 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
18810 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
18820 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18830 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
18840 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
18850 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
18860 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
18870 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
18880 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
18890 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
188a0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
188b0 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
188c0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
188d0 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
188e0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
188f0 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
18900 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
18910 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
18920 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
18930 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
18940 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
18950 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
18960 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
18970 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
18980 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
18990 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
189a0 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
189b0 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
189c0 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
189d0 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
189e0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
189f0 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
18a00 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
18a10 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
18a20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
18a30 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
18a40 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
18a50 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
18a60 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
18a70 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
18a80 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
18a90 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
18aa0 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
18ab0 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
18ac0 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
18ad0 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
18ae0 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
18af0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
18b00 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
18b10 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
18b20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
18b30 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
18b40 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
18b50 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
18b60 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
18b70 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
18b80 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
18b90 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
18ba0 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
18bb0 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
18bc0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
18bd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
18be0 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
18bf0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
18c00 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
18c10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
18c20 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
18c30 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
18c40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18c50 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
18c60 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
18c70 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
18c80 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
18c90 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
18ca0 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
18cb0 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
18cc0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
18cd0 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
18ce0 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
18cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
18d00 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
18d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18d20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
18d30 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
18d40 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
18d50 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
18d60 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
18d70 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
18d80 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
18d90 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
18da0 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
18db0 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
18dc0 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
18dd0 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
18de0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
18df0 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
18e00 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
18e10 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
18e20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
18e30 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
18e40 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
18e50 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
18e60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18e70 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
18e80 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
18e90 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
18ea0 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
18eb0 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
18ec0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
18ed0 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
18ee0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
18ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
18f00 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
18f10 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
18f20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
18f30 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
18f40 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
18f50 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
18f60 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
18f70 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
18f80 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
18f90 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
18fa0 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
18fb0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
18fc0 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
18fd0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
18fe0 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
18ff0 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
19000 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
19010 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
19020 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
19030 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
19040 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
19050 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
19060 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
19070 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
19080 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19090 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
190a0 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
190b0 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
190c0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
190d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
190e0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
190f0 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
19100 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
19110 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  x.iOrderByCol==i
19120 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
19130 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
19140 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
19150 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
19160 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
19170 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
19180 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
19190 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
191a0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
191b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
191c0 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
191d0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
191e0 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
191f0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
19200 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
19210 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
19220 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
19230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
19240 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
19250 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
19260 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
19270 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
19280 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
19290 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
192a0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
192b0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
192c0 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
192d0 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
192e0 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
192f0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
19300 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
19310 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
19320 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
19330 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
19340 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
19350 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
19360 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
19370 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
19380 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
19390 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
193a0 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
193b0 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
193c0 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
193d0 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
193e0 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
193f0 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
19400 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
19410 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
19420 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b  (nOrderBy + 1));
19430 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
19440 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
19450 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
19460 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65  em;.    aPermute
19470 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  [0] = nOrderBy;.
19480 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74      for(i=1, pIt
19490 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
194a0 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  i<=nOrderBy; i++
194b0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
194c0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
194d0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
194e0 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
194f0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
19500 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70  OrderByCol<=p->p
19510 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
19520 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69        aPermute[i
19530 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  ] = pItem->u.x.i
19540 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a  OrderByCol - 1;.
19550 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
19560 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  rge = multiSelec
19570 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
19580 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
19590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
195a0 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
195b0 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
195c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
195d0 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
195e0 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
195f0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
19600 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
19610 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
19620 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
19630 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
19640 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
19650 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
19660 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
19670 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
19680 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
19690 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
196a0 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
196b0 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
196c0 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
196d0 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
196e0 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
196f0 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
19700 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
19710 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
19720 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
19730 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
19740 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
19750 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
19760 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
19770 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
19780 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
19790 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
197a0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
197b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
197c0 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71   nExpr+1;.    sq
197d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
197e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
197f0 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
19800 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
19810 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
19820 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  , nExpr, 1);.   
19830 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
19840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
19850 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
19860 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29  iteable(pKeyDup)
19870 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
19880 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
19890 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
198a0 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
198b0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
198c0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
198d0 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
198e0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
198f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19900 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
19910 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
19920 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
19930 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
19940 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
19950 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69  rior = 0;.  pPri
19960 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  or->pNext = 0;. 
19970 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
19980 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
19990 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
199a0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
199b0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
199c0 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
199d0 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
199e0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
199f0 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
19a00 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
19a10 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ");.  }..  /* Co
19a20 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
19a30 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
19a40 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
19a50 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
19a60 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
19a70 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
19a80 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
19a90 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
19aa0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
19ab0 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
19ac0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
19ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ae0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
19af0 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
19b00 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
19b10 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
19b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b30 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
19b40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19b50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
19b60 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
19b70 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
19b80 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
19b90 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
19ba0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
19bb0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
19bc0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
19bd0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73  >pLimit = 0;.  s
19be0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
19bf0 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  (db, p->pOffset)
19c00 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  ;.  p->pOffset =
19c10 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20   0;..  regAddrA 
19c20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19c30 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b  ;.  regAddrB = +
19c40 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
19c50 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61   regOutA = ++pPa
19c60 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
19c70 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutB = ++pParse-
19c80 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
19c90 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
19ca0 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75  destA, SRT_Corou
19cb0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
19cc0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19cd0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c  DestInit(&destB,
19ce0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
19cf0 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
19d00 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
19d10 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
19d20 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
19d30 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
19d40 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
19d50 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
19d60 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
19d70 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  t..  */.  addrSe
19d80 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56  lectA = sqlite3V
19d90 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19da0 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
19db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19dc0 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
19dd0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
19de0 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
19df0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
19e00 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
19e10 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
19e20 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
19e30 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
19e40 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
19e50 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
19e60 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
19e70 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
19e80 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
19e90 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
19ea0 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
19eb0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
19ec0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
19ed0 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47   addr1);..  /* G
19ee0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
19ef0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
19f00 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
19f10 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
19f20 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
19f30 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
19f40 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
19f50 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19f60 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
19f70 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
19f80 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19f90 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
19fa0 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53  gAddrB, 0, addrS
19fb0 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43  electB);.  VdbeC
19fc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68  omment((v, "righ
19fd0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
19fe0 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
19ff0 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
1a000 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
1a010 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
1a020 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
1a030 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
1a040 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
1a050 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
1a060 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
1a070 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1a080 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
1a090 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  estB);.  p->iLim
1a0a0 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
1a0b0 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
1a0c0 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
1a0d0 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
1a0e0 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64  outine(v, regAdd
1a0f0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
1a100 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1a110 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
1a120 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
1a130 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65   the A.  ** sele
1a140 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
1a150 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
1a160 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1a170 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
1a180 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
1a190 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
1a1a0 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74   A"));.  addrOut
1a1b0 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  A = generateOutp
1a1c0 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
1a1d0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1a1e0 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c        p, &destA,
1a1f0 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c   pDest, regOutA,
1a200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a210 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
1a220 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
1a230 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
1a240 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1a250 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
1a260 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
1a270 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
1a280 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
1a290 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
1a2a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
1a2b0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1a2c0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
1a2d0 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
1a2e0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a2f0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
1a300 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
1a310 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
1a320 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
1a330 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1a340 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
1a350 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
1a360 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
1a370 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
1a380 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
1a390 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1a3a0 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
1a3b0 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  yDup);..  /* Gen
1a3c0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1a3d0 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
1a3e0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
1a3f0 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72  select A.  ** ar
1a400 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
1a410 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
1a420 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20  ect B remains.. 
1a430 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1a440 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
1a450 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1a460 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1a470 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62  = addrEofA = lab
1a480 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20  elEnd;.  }else{ 
1a490 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
1a4a0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41  mment((v, "eof-A
1a4b0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1a4c0 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
1a4d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a4e0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1a4f0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1a500 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  ;.    addrEofA_n
1a510 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  oB = sqlite3Vdbe
1a520 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a530 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61  ld, regAddrB, la
1a540 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  belEnd);.       
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
1a570 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1a590 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b  to(v, addrEofA);
1a5a0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
1a5b0 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
1a5c0 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
1a5d0 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
1a5e0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20  lectRow);.  }.. 
1a5f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1a600 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
1a610 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
1a620 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
1a630 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
1a640 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
1a650 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
1a660 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
1a670 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1a680 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1a690 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
1a6a0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
1a6b0 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53  Row > pPrior->nS
1a6c0 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
1a6d0 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
1a6e0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
1a6f0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
1a700 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a710 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
1a720 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1a730 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = sqlite3Vd
1a740 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a750 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
1a760 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71  ddrOutA);.    sq
1a770 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a780 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a790 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrA, labelEnd)
1a7a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a7b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a7c0 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f  beGoto(v, addrEo
1a7d0 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  fB);.  }..  /* G
1a7e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1a7f0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1a800 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64  of A<B.  */.  Vd
1a810 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a820 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75  , "A-lt-B subrou
1a830 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
1a840 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ltB = sqlite3Vdb
1a850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a860 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
1a870 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74  drOutA);.  sqlit
1a880 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a890 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a8a0 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1a8b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a8c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1a8d0 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1a8e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a8f0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1a900 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a  he case of A==B.
1a910 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1a920 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64  K_ALL ){.    add
1a930 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
1a940 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
1a950 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1a960 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1a970 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61   addrAltB;.    a
1a980 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c  ddrAltB++;.  }el
1a990 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  se{.    VdbeNoop
1a9a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65  Comment((v, "A-e
1a9b0 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  q-B subroutine")
1a9c0 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  );.    addrAeqB 
1a9d0 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  =.    sqlite3Vdb
1a9e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a9f0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1aa00 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1aa10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1aa20 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1aa30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1aa40 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1aa50 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1aa60 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
1aa70 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1aa80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
1aa90 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1aaa0 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
1aab0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1aac0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
1aad0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
1aae0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
1aaf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ab00 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1ab10 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1ab20 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
1ab30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ab40 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1ab50 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1ab60 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ab70 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1ab80 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1ab90 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
1aba0 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e   runs once to in
1abb0 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68  itialize everyth
1abc0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ing..  */.  sqli
1abd0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1abe0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c  v, addr1);.  sql
1abf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ac00 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1ac10 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e  ddrA, addrEofA_n
1ac20 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  oB); VdbeCoverag
1ac30 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1ac40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ac50 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1ac60 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1ac70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1ac80 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
1ac90 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
1aca0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1acb0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1acc0 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
1acd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ace0 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61  p4(v, OP_Permuta
1acf0 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28  tion, 0, 0, 0, (
1ad00 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20  char*)aPermute, 
1ad10 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
1ad20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ad30 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
1ad40 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65   destA.iSdst, de
1ad50 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65  stB.iSdst, nOrde
1ad60 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1ad80 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20  har*)pKeyMerge, 
1ad90 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
1ada0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1adb0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52  P5(v, OPFLAG_PER
1adc0 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  MUTE);.  sqlite3
1add0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ade0 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
1adf0 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
1ae00 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  gtB); VdbeCovera
1ae10 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  ge(v);..  /* Jum
1ae20 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f  p to the this po
1ae30 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
1ae40 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75  terminate the qu
1ae50 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ery..  */.  sqli
1ae60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1ae70 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29  bel(v, labelEnd)
1ae80 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1ae90 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
1aea0 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
1aeb0 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
1aec0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
1aed0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
1aee0 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  st = pPrior;.   
1aef0 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
1af00 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
1af10 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
1af20 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  ;.    generateCo
1af30 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
1af40 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20  , pFirst->pSrc, 
1af50 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
1af60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73  .  }..  /* Reass
1af70 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
1af80 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
1af90 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
1afa0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1afb0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1afc0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
1afd0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1afe0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1aff0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
1b000 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
1b010 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1b020 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1b030 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42   = p;..  /*** TB
1b040 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
1b050 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
1b060 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
1b070 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
1b080 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
1b090 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  */.  explainComp
1b0a0 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
1b0b0 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
1b0c0 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  2, 0);.  return 
1b0d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b  pParse->nErr!=0;
1b0e0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
1b0f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b100 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1b110 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b120 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
1b130 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1b140 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1b150 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1b160 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
1b170 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
1b180 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1b190 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
1b1a0 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
1b1b0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
1b1c0 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
1b1d0 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1b1e0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1b1f0 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1b200 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1b210 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1b220 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1b230 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1b240 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1b250 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1b260 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1b270 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1b280 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1b290 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1b2a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b2b0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1b2c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1b2d0 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1b2e0 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1b2f0 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1b300 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1b310 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1b320 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1b330 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1b340 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1b350 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1b360 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1b370 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1b380 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1b390 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
1b3a0 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
1b3b0 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
1b3c0 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
1b3d0 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
1b3e0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
1b3f0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1b400 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
1b410 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
1b420 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
1b430 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
1b440 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
1b450 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
1b460 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1b470 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
1b480 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1b490 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
1b4a0 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1b4b0 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1b4c0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
1b4d0 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
1b4e0 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
1b4f0 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
1b500 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
1b510 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
1b520 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
1b530 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1b540 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1b550 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1b560 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
1b570 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
1b580 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1b590 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1b5a0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1b5b0 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1b5c0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1b5d0 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
1b5e0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
1b5f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1b600 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1b610 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b620 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
1b630 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
1b640 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
1b650 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1b660 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
1b670 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1b680 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1b690 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1b6a0 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
1b6b0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
1b6c0 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  w;.    }.  }else
1b6d0 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
1b6e0 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ft = substExpr(d
1b6f0 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
1b700 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b710 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
1b720 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
1b730 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
1b740 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b750 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1b760 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1b770 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1b780 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1b790 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
1b7a0 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  >x.pSelect, iTab
1b7b0 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a  le, pEList, 1);.
1b7c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b7d0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b7e0 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
1b7f0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b800 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1b810 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
1b820 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1b830 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
1b840 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1b850 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
1b860 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
1b870 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1b880 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
1b890 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
1b8a0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1b8b0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
1b8c0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1b8d0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1b8e0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
1b8f0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1b900 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
1b910 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
1b920 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
1b930 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1b940 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
1b950 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1b960 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74   i++){.    pList
1b970 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
1b980 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
1b990 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1b9a0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b9b0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1b9c0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
1b9d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1b9e0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1b9f0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
1ba00 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
1ba10 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
1ba20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ba30 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
1ba40 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
1ba50 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1ba60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
1ba70 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
1ba80 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1ba90 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20   *pEList,    /* 
1baa0 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
1bab0 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69  s */.  int doPri
1bac0 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  or          /* D
1bad0 6f 20 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e  o substitutes on
1bae0 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a   p->pPrior too *
1baf0 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
1bb00 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
1bb10 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1bb20 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1bb30 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
1bb40 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45    do{.    substE
1bb50 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
1bb60 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  EList, iTable, p
1bb70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
1bb80 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1bb90 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
1bba0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1bbb0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1bbc0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  , p->pOrderBy, i
1bbd0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1bbe0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
1bbf0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1bc00 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
1bc10 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1bc20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
1bc30 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
1bc40 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
1bc50 69 73 74 29 3b 0a 20 20 20 20 70 53 72 63 20 3d  ist);.    pSrc =
1bc60 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73   p->pSrc;.    as
1bc70 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1bc80 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
1bc90 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
1bca0 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
1bcb0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1bcc0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
1bcd0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1bce0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20  iTable, pEList, 
1bcf0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  1);.      if( pI
1bd00 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1bd10 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62  c ){.        sub
1bd20 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1bd30 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1bd40 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
1bd50 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1bd60 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72  }.  }while( doPr
1bd70 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70  ior && (p = p->p
1bd80 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23  Prior)!=0 );.}.#
1bd90 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1bda0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1bdb0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1bdc0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1bdd0 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
1bde0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1bdf0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1be00 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1be10 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
1be20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1be30 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
1be40 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20  n subqueries as 
1be50 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
1be60 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54  timization..** T
1be70 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1be80 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
1be90 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
1bea0 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
1beb0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
1bec0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
1bed0 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
1bee0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
1bef0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1bf00 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
1bf10 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
1bf20 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
1bf30 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1bf40 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
1bf50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1bf60 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
1bf70 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
1bf80 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
1bf90 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
1bfa0 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
1bfb0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
1bfc0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1bfd0 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
1bfe0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
1bff0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
1c000 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
1c010 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
1c020 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
1c030 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
1c040 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
1c050 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
1c060 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
1c070 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1c080 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
1c090 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
1c0a0 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
1c0b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1c0c0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
1c0d0 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
1c0e0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
1c0f0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
1c100 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
1c110 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1c120 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1c130 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1c140 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
1c150 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1c160 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
1c170 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76  mplification giv
1c180 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
1c190 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
1c1a0 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
1c1b0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
1c1c0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
1c1d0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
1c1e0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
1c1f0 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
1c200 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
1c210 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
1c220 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
1c230 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
1c240 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
1c250 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1c260 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
1c270 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c280 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1c290 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
1c2a0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
1c2b0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
1c2c0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1c2d0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1c2e0 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20   (2a) the outer 
1c2f0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1c300 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  oin.**        an
1c310 64 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72  d (2b) the outer
1c320 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1c330 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 6f  use subqueries o
1c340 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1c350 65 0a 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d  e.**        FROM
1c360 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1c370 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69   that is a candi
1c380 64 61 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e  date for flatten
1c390 69 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20  ing.  (2b is.** 
1c3a0 20 20 20 20 20 20 20 64 75 65 20 74 6f 20 74 69         due to ti
1c3b0 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62  cket [2f7170d73b
1c3c0 66 39 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30  f9abf80] from 20
1c3d0 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a  15-02-09.).**.**
1c3e0 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
1c3f0 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
1c400 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1c410 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
1c420 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
1c430 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
1c440 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
1c450 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
1c460 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
1c470 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1c480 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
1c490 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
1c4a0 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
1c4b0 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
1c4c0 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
1c4d0 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
1c4e0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
1c4f0 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
1c500 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
1c510 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
1c520 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
1c530 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
1c540 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
1c550 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
1c560 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
1c570 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
1c580 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
1c590 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1c5a0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1c5b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1c5c0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1c5d0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1c5e0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1c5f0 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
1c600 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
1c610 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1c620 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
1c630 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
1c640 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
1c650 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
1c660 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1c670 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1c680 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1c690 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1c6a0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1c6b0 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1c6c0 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1c6d0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
1c6e0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c6f0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1c700 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1c710 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1c720 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
1c730 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1c740 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1c750 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1c760 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1c770 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1c780 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74    (**)  Restrict
1c790 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d  ion (10) was rem
1c7a0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  oved from the co
1c7b0 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35  de on 2005-02-05
1c7c0 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   but we.**      
1c7d0 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72    accidently car
1c7e0 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ried the comment
1c7f0 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32   forward until 2
1c800 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67  014-09-15.  Orig
1c810 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  inal.**        t
1c820 65 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65  ext: "The subque
1c830 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c840 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
1c850 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a  e outer query .*
1c860 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f  *        does no
1c870 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
1c880 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1c890 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1c8a0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1c8b0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
1c8c0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
1c8d0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
1c8e0 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
1c8f0 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
1c900 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
1c910 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
1c920 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
1c930 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
1c940 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
1c950 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
1c960 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
1c970 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
1c980 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1c990 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
1c9a0 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
1c9b0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1c9c0 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
1c9d0 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
1c9e0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
1c9f0 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1ca00 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
1ca10 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
1ca20 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
1ca30 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
1ca40 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
1ca50 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
1ca60 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
1ca70 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
1ca80 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1ca90 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1caa0 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
1cab0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
1cac0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
1cad0 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
1cae0 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
1caf0 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
1cb00 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
1cb10 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
1cb20 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
1cb30 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
1cb40 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
1cb50 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1cb60 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
1cb70 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
1cb80 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
1cb90 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
1cba0 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
1cbb0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
1cbc0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
1cbd0 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
1cbe0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1cbf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1cc00 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
1cc10 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1cc20 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
1cc30 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1cc40 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1cc50 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
1cc60 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
1cc70 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
1cc80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1cc90 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1cca0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1ccb0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1ccc0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1ccd0 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1cce0 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1ccf0 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1cd00 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1cd10 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1cd20 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1cd30 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1cd40 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1cd50 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1cd60 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1cd70 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1cd80 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1cd90 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1cda0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1cdb0 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1cdc0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1cdd0 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1cde0 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1cdf0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1ce00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1ce10 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1ce20 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1ce30 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1ce40 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1ce50 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1ce60 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1ce70 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1ce80 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1ce90 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1cea0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1ceb0 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1cec0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1ced0 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1cee0 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1cef0 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1cf00 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1cf10 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1cf20 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1cf30 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1cf40 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1cf50 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1cf60 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1cf70 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1cf80 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1cf90 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1cfa0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1cfb0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1cfc0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
1cfd0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1cfe0 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1cff0 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1d000 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1d010 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1d020 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
1d030 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1d040 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1d050 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d060 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
1d070 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
1d080 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
1d090 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
1d0a0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1d0b0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1d0c0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
1d0d0 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
1d0e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1d0f0 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
1d100 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
1d110 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
1d120 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
1d130 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
1d140 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1d150 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1d160 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
1d170 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
1d180 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
1d190 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
1d1a0 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
1d1b0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
1d1c0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
1d1d0 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
1d1e0 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
1d1f0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
1d200 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d210 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1d220 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1d230 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1d240 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
1d250 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
1d260 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
1d270 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75   (22)  The subqu
1d280 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ery is not a rec
1d290 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
1d2a0 2a 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72  *  (23)  The par
1d2b0 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ent is not a rec
1d2c0 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74  ursive CTE, or t
1d2d0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1d2e0 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  not a.**        
1d2f0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1d300 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
1d310 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e   is because tran
1d320 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20  sforming the.** 
1d330 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f         parent to
1d340 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1d350 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63  y confuses the c
1d360 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73  ode that handles
1d370 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72  .**        recur
1d380 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20  sive queries in 
1d390 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a  multiSelect()..*
1d3a0 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20  *.**  (24)  The 
1d3b0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1d3c0 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
1d3d0 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
1d3e0 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
1d3f0 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
1d400 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
1d410 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
1d420 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
1d430 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
1d440 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
1d450 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
1d460 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
1d470 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1d480 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
1d490 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
1d4a0 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
1d4b0 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a  ximal.).**.**.**
1d4c0 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
1d4d0 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
1d4e0 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
1d4f0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
1d500 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
1d510 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
1d520 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
1d530 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1d540 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
1d550 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
1d560 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
1d570 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1d580 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1d590 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1d5a0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1d5b0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
1d5c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d5d0 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
1d5e0 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
1d5f0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
1d600 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
1d610 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
1d620 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
1d630 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
1d640 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
1d650 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
1d660 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
1d670 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
1d680 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
1d690 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
1d6a0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
1d6b0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
1d6c0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
1d6d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1d6e0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1d6f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1d700 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
1d710 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
1d720 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
1d730 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d740 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
1d750 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
1d760 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
1d770 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
1d780 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
1d790 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
1d7a0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1d7b0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
1d7c0 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
1d7d0 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
1d7e0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1d7f0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1d800 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1d810 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
1d820 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
1d830 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
1d840 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20  lect *pParent;  
1d850 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49    /* Current UNI
1d860 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74  ON ALL term of t
1d870 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a  he other query *
1d880 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1d890 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
1d8a0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
1d8b0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
1d8c0 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
1d8d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1d8e0 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
1d8f0 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
1d900 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1d910 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
1d920 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1d930 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d940 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1d950 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
1d960 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1d970 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1d980 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1d990 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
1d9a0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
1d9b0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1d9c0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1d9d0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1d9e0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1d9f0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1da00 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1da10 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1da20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1da30 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
1da40 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
1da50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1da60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1da70 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1da80 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
1da90 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
1daa0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
1dab0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1dac0 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
1dad0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
1dae0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1daf0 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
1db00 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
1db10 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
1db20 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
1db30 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65  =0 );  /* Unable
1db40 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70   to flatten comp
1db50 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a  ound queries */.
1db60 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
1db70 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1db80 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
1db90 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30  ener) ) return 0
1dba0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1dbb0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1dbc0 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
1dbd0 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
1dbe0 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  rc );.  pSubitem
1dbf0 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f   = &pSrc->a[iFro
1dc00 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20  m];.  iParent = 
1dc10 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
1dc20 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  r;.  pSub = pSub
1dc30 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
1dc40 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
1dc50 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65   );.  if( subque
1dc60 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 69  ryIsAgg ){.    i
1dc70 66 28 20 69 73 41 67 67 20 29 20 72 65 74 75 72  f( isAgg ) retur
1dc80 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1dcb0 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20 20  on (1)   */.    
1dcc0 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31  if( pSrc->nSrc>1
1dcd0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dd00 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20 20  ion (2a)  */.   
1dd10 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65 20   if( (p->pWhere 
1dd20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
1dd30 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f  ty(p->pWhere,EP_
1dd40 53 75 62 71 75 65 72 79 29 29 0a 20 20 20 20 20  Subquery)).     
1dd50 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c  || (sqlite3ExprL
1dd60 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69  istFlags(p->pELi
1dd70 73 74 29 20 26 20 45 50 5f 53 75 62 71 75 65 72  st) & EP_Subquer
1dd80 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73  y)!=0.     || (s
1dd90 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
1dda0 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ags(p->pOrderBy)
1ddb0 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21   & EP_Subquery)!
1ddc0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1ddd0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de00 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1de10 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d  n (2b)  */.    }
1de20 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53 75 62  .  }.    .  pSub
1de30 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1de40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1de50 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
1de60 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
1de70 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
1de80 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
1de90 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
1dea0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
1deb0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1dec0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
1ded0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
1dee0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
1def0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
1df00 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
1df10 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
1df20 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
1df30 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1df40 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
1df50 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1df60 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
1df70 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
1df80 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
1df90 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
1dfa0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1dfb0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
1dfc0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1dfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1dfe0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
1dff0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
1e000 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1e030 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
1e040 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1e050 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
1e060 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
1e070 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
1e080 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e0c0 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
1e0d0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1e0e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e110 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
1e120 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1e130 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
1e140 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1e150 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e160 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
1e170 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1e180 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
1e190 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
1e1a0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1e1b0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e1c0 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
1e1d0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1e1e0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1e1f0 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
1e200 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1e210 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1e220 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e230 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
1e240 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1e250 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1e260 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
1e270 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e2a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
1e2b0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
1e2c0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
1e2d0 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
1e2e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e2f0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e300 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
1e310 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1e320 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
1e330 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1e340 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e350 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
1e360 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1e370 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1e380 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
1e390 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1e3a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1e3b0 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
1e3c0 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
1e3d0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1e3e0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
1e3f0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1e400 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1e410 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69  MinMaxAgg );.  i
1e420 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1e430 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
1e440 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20  e|SF_MinMaxAgg) 
1e450 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1e460 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1e470 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a   (22) and (24) *
1e480 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1e490 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1e4a0 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62  cursive) && pSub
1e4b0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1e4c0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1e4d0 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f  triction (23) */
1e4e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c  .  }..  /* OBSOL
1e4f0 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20  ETE COMMENT 1:. 
1e500 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1e510 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
1e520 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
1e530 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1e540 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
1e550 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
1e560 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1e570 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
1e580 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
1e590 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
1e5a0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1e5b0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1e5c0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1e5d0 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
1e5e0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1e5f0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1e600 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1e610 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1e620 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1e630 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
1e640 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
1e650 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
1e660 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
1e670 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  ** OBSOLETE C
1e680 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52  OMMENT 2:.  ** R
1e690 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
1e6a0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1e6b0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1e6c0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
1e6d0 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
1e6e0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1e6f0 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
1e700 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
1e710 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
1e720 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
1e730 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1e740 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1e750 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
1e760 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1e770 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
1e780 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1e790 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1e7a0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1e7b0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1e7c0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1e7d0 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
1e7e0 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
1e7f0 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
1e800 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
1e810 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
1e820 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
1e830 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
1e840 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
1e850 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
1e860 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a  INNER JOIN..  **
1e870 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52  .  ** THIS OVERR
1e880 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f  IDES OBSOLETE CO
1e890 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41  MMENTS 1 AND 2 A
1e8a0 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65  BOVE:.  ** Ticke
1e8b0 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68  t #3300 shows th
1e8c0 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  at flattening th
1e8d0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1e8e0 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a  a LEFT JOIN.  **
1e8f0 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68   is fraught with
1e900 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74   danger.  Best t
1e910 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c  o avoid the whol
1e920 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65  e thing.  If the
1e930 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1e940 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
1e950 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1e960 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
1e970 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tten..  */.  if(
1e980 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a   (pSubitem->fg.j
1e990 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1e9a0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1e9b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1e9c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1e9d0 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1e9e0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1e9f0 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1ea00 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1ea10 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1ea20 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1ea30 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1ea40 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1ea50 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1ea60 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1ea70 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1ea80 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1ea90 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1eaa0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1eab0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1eac0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1ead0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1eae0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1eaf0 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1eb00 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1eb10 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1eb20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1eb30 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1eb40 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1eb50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1eb60 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1eb70 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1eb80 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1eb90 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1eba0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1ebb0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1ebc0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1ebd0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1ebe0 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1ebf0 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1ec00 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1ec10 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1ec20 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1ec30 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1ec40 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1ec50 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
1ec60 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69  sert( pSub->pELi
1ec70 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31  st->nExpr==pSub1
1ec80 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1ec90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1eca0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1ecb0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1ecc0 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1ecd0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1ece0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1ecf0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1ed00 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1ed10 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1ed20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
1ed30 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1ed40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ed50 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1ed60 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
1ed70 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ed80 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   18. */.    if( 
1ed90 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
1eda0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1edb0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1edc0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1edd0 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1ede0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1edf0 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f  By->a[ii].u.x.iO
1ee00 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72  rderByCol==0 ) r
1ee10 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1ee20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1ee30 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
1ee40 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
1ee50 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1ee60 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
1ee70 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
1ee80 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
1ee90 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %s.%p from term 
1eea0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1eeb0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
1eec0 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20  zSelName, pSub, 
1eed0 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41  iFrom));..  /* A
1eee0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
1eef0 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
1ef00 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1ef10 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
1ef20 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
1ef30 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
1ef40 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1ef50 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
1ef60 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
1ef70 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
1ef80 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
1ef90 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
1efa0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
1efb0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
1efc0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1efd0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
1efe0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
1eff0 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
1f000 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
1f010 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
1f020 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
1f030 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
1f040 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
1f050 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
1f060 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
1f070 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
1f080 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
1f090 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
1f0a0 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
1f0b0 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
1f0c0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
1f0d0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
1f0e0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
1f0f0 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
1f100 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
1f110 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
1f120 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
1f130 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
1f140 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
1f150 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
1f160 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
1f170 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
1f180 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
1f190 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
1f1a0 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
1f1b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
1f1c0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
1f1d0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1f1e0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
1f1f0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
1f200 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
1f210 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1f220 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
1f230 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
1f240 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1f250 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1f260 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1f270 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
1f280 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1f290 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
1f2a0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
1f2b0 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
1f2c0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
1f2d0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1f2e0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
1f2f0 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
1f300 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
1f310 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
1f320 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1f330 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1f340 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
1f350 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
1f360 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1f370 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1f380 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
1f390 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
1f3a0 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
1f3b0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
1f3c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
1f3d0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
1f3e0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1f3f0 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
1f400 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
1f410 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
1f420 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1f430 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
1f440 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
1f450 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
1f460 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1f470 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
1f480 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78  ->pLimit;.    Ex
1f490 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d  pr *pOffset = p-
1f4a0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65  >pOffset;.    Se
1f4b0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
1f4c0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
1f4d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1f4e0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
1f4f0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1f500 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
1f510 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66   = 0;.    p->pOf
1f520 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
1f530 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
1f540 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
1f550 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1f560 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
1f570 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  pSub->zSelName);
1f580 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1f590 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  = pOffset;.    p
1f5a0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
1f5b0 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
1f5c0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1f5d0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
1f5e0 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
1f5f0 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70  K_ALL;.    if( p
1f600 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1f610 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1f620 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
1f630 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
1f640 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1f650 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
1f660 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
1f670 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  New;.      pNew-
1f680 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
1f690 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
1f6a0 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ew;.      SELECT
1f6b0 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70  TRACE(2,pParse,p
1f6c0 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d  ,.         ("com
1f6d0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1f6e0 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73  lattener creates
1f6f0 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e   %s.%p as peer\n
1f700 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77  ",.         pNew
1f710 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77  ->zSelName, pNew
1f720 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
1f730 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1f740 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1f750 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
1f760 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
1f770 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
1f780 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1f790 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
1f7a0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
1f7b0 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
1f7c0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1f7d0 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
1f7e0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
1f7f0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
1f800 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1f810 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
1f820 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
1f830 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1f840 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
1f850 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1f860 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
1f870 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
1f880 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1f890 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
1f8a0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1f8b0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
1f8c0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
1f8d0 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
1f8e0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1f8f0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
1f900 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
1f910 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
1f920 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1f930 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
1f940 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
1f950 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
1f960 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
1f970 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
1f980 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
1f990 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
1f9a0 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
1f9b0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
1f9c0 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
1f9d0 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
1f9e0 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
1f9f0 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
1fa00 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
1fa10 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
1fa20 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
1fa30 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
1fa40 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
1fa50 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
1fa60 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
1fa70 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
1fa80 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
1fa90 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29  ToDel->nRef==1 )
1faa0 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
1fab0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1fac0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1fad0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
1fae0 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
1faf0 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
1fb00 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
1fb10 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1fb20 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
1fb30 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
1fb40 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
1fb50 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  el->nRef--;.    
1fb60 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
1fb70 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
1fb80 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1fb90 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
1fba0 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
1fbb0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
1fbc0 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
1fbd0 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
1fbe0 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
1fbf0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
1fc00 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
1fc10 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
1fc20 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
1fc30 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
1fc40 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1fc50 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
1fc60 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
1fc70 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
1fc80 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
1fc90 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
1fca0 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
1fcb0 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
1fcc0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
1fcd0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1fce0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1fcf0 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
1fd00 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
1fd10 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
1fd20 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
1fd30 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
1fd40 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
1fd50 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
1fd60 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
1fd70 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
1fd80 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
1fd90 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
1fda0 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
1fdb0 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
1fdc0 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
1fdd0 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
1fde0 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
1fdf0 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
1fe00 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
1fe10 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
1fe20 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
1fe30 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
1fe40 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
1fe50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
1fe60 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
1fe70 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
1fe80 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
1fe90 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1fea0 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
1feb0 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
1fec0 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
1fed0 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
1fee0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1fef0 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
1ff00 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
1ff10 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
1ff20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
1ff30 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
1ff40 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
1ff50 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
1ff60 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1ff70 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1ff80 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
1ff90 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
1ffa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1ffb0 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
1ffc0 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
1ffd0 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
1ffe0 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
1fff0 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
20000 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
20010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20020 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
20030 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
20040 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
20050 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
20060 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
20070 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
20080 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
20090 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
200a0 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
200b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
200c0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
200d0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
200e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
200f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
20100 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
20110 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
20120 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
20130 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
20140 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
20150 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
20160 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
20170 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
20180 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
20190 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
201a0 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
201b0 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
201c0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
201d0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
201e0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
201f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
20200 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
20210 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
20220 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
20230 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
20240 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
20250 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
20260 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
20270 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
20280 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
20290 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
202a0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
202b0 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
202c0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
202d0 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
202e0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
202f0 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
20300 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
20310 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
20320 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20  to 4 slots..    
20330 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c  ** The middle sl
20340 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
20350 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
20360 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
20370 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ce.    ** for th
20380 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  e two elements i
20390 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
203a0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
203b0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
203c0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
203d0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
203e0 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
203f0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
20400 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
20410 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
20420 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
20430 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
20440 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20450 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20460 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
20470 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
20480 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
20490 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
204a0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
204b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
204c0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
204d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
204e0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
204f0 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
20500 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
20510 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
20520 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e  ->a[i+iFrom].fg.
20530 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
20540 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
20550 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
20560 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
20570 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
20580 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
20590 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
205a0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
205b0 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e  a[iFrom].fg.join
205c0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
205d0 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
205e0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
205f0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
20600 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
20610 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
20620 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
20630 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
20640 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
20650 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
20660 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
20670 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
20680 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
20690 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
206a0 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
206b0 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
206c0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
206d0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
206e0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
206f0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
20700 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
20710 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
20720 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
20730 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
20740 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20750 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
20760 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
20770 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
20780 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
20790 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
207a0 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
207b0 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
207c0 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
207d0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
207e0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
207f0 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
20800 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
20810 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
20820 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
20830 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
20840 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
20850 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
20860 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
20870 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
20880 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73  bStrDup(db, pLis
20890 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
208a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
208b0 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
208c0 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b         pList->a[
208d0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  i].zName = zName
208e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
208f0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
20900 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
20910 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
20920 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
20930 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
20940 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
20950 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
20960 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
20970 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
20980 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
20990 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
209a0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
209b0 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
209c0 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
209d0 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
209e0 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
209f0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
20a00 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
20a10 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
20a20 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
20a30 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
20a40 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
20a50 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
20a60 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
20a70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20a80 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
20a90 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
20aa0 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
20ab0 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
20ac0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
20ad0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
20ae0 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
20af0 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
20b00 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
20b10 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
20b20 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
20b30 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
20b40 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
20b50 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
20b60 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
20b70 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
20b80 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
20b90 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
20ba0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
20bb0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
20bc0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
20bd0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
20be0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
20bf0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
20c00 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
20c10 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
20c20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
20c30 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
20c40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20c50 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
20c60 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
20c70 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
20c80 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
20c90 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
20ca0 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65      }.    pWhere
20cb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
20cc0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
20cd0 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  re, 0);.    if( 
20ce0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
20cf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20d00 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
20d10 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
20d20 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
20d30 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
20d40 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20d50 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
20d60 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20d70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
20d80 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
20d90 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20  ent->pHaving, . 
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20dc0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
20dd0 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
20de0 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73  g, 0));.      as
20df0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
20e00 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
20e10 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
20e20 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
20e30 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
20e40 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30  Sub->pGroupBy, 0
20e50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20e60 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
20e70 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
20e80 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
20e90 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
20ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62  );.    }.    sub
20eb0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 50 61  stSelect(db, pPa
20ec0 72 65 6e 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  rent, iParent, p
20ed0 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b  Sub->pEList, 0);
20ee0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
20ef0 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
20f00 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
20f10 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
20f20 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
20f30 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
20f40 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
20f50 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
20f60 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
20f70 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
20f80 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
20f90 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
20fa0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
20fb0 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
20fc0 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
20fd0 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
20fe0 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
20ff0 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
21000 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
21010 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
21020 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
21030 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
21040 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
21050 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
21060 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
21070 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
21080 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
21090 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
210a0 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
210b0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
210c0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
210d0 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
210e0 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
210f0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
21100 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
21110 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
21120 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
21130 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45  Sub1);..#if SELE
21140 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
21150 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
21160 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
21170 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
21180 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
21190 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74  ,p,("After flatt
211a0 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20  ening:\n"));.   
211b0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
211c0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
211d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
211e0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
211f0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
21200 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
21210 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
21220 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
21230 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  ) */....#if !def
21240 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21250 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
21260 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21270 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d  IT_VIEW)./*.** M
21280 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65  ake copies of re
21290 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61  levant WHERE cla
212a0 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
212b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74   outer query int
212c0 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  o.** the WHERE c
212d0 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
212e0 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  y.  Example:.**.
212f0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
21300 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
21310 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
21320 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20  M t1) WHERE x=5 
21330 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
21340 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
21350 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
21360 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
21370 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
21380 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
21390 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a  a=5 AND c-d=10).
213a0 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35  **     WHERE x=5
213b0 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
213c0 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61   The hope is tha
213d0 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65  t the terms adde
213e0 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71  d to the inner q
213f0 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69  uery will make i
21400 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69  t more.** effici
21410 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  ent..**.** Do no
21420 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f  t attempt this o
21430 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a  ptimization if:.
21440 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 20  **.**   (1) The 
21450 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 61  inner query is a
21460 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 28 49  n aggregate.  (I
21470 6e 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 27  n that case, we'
21480 64 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a  d really want.**
21490 20 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20 74         to copy t
214a0 68 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d 63  he outer WHERE-c
214b0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f  lause terms onto
214c0 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
214d0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  se of the.**    
214e0 20 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e 20     inner query. 
214f0 20 42 75 74 20 74 68 65 79 20 70 72 6f 62 61 62   But they probab
21500 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74 68  ly won't help th
21510 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f  ere so do not bo
21520 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  ther.).**.**   (
21530 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  2) The inner que
21540 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73  ry is the recurs
21550 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f  ive part of a co
21560 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
21570 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  ssion..**.**   (
21580 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  3) The inner que
21590 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63  ry has a LIMIT c
215a0 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65  lause (since the
215b0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
215c0 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63  WHERE.**       c
215d0 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67  lose would chang
215e0 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66  e the meaning of
215f0 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a   the LIMIT)..**.
21600 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e  **   (4) The inn
21610 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
21620 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
21630 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28   a LEFT JOIN.  (
21640 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  The caller.**   
21650 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69      enforces thi
21660 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69  s restriction si
21670 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
21680 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65   does not have e
21690 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69  nough.**       i
216a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e  nformation to kn
216b0 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  ow.).**.**   (5)
216c0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
216d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
216e0 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f  ginates in the O
216f0 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
21700 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20  e.**       of a 
21710 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a  LEFT JOIN..**.**
21720 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20   Return 0 if no 
21730 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
21740 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   and non-zero if
21750 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
21760 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72  RE clause.** ter
21770 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ms are duplicate
21780 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75  d into the subqu
21790 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
217a0 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  nt pushDownWhere
217b0 54 65 72 6d 73 28 0a 20 20 73 71 6c 69 74 65 33  Terms(.  sqlite3
217c0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 2f   *db,          /
217d0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
217e0 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d  onnection (for m
217f0 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20 20 53 65  alloc()) */.  Se
21800 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20  lect *pSubq,    
21810 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
21820 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20  ery whose WHERE 
21830 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20  clause is to be 
21840 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45  augmented */.  E
21850 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
21860 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
21870 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
21880 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
21890 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20   int iCursor    
218a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
218b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73   number of the s
218c0 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  ubquery */.){.  
218d0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
218e0 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 53  t nChng = 0;.  S
218f0 65 6c 65 63 74 20 2a 70 58 3b 20 20 20 20 20 20  elect *pX;      
21900 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
21910 69 6e 67 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e  ing over compoun
21920 64 20 53 45 4c 45 43 54 73 20 69 6e 20 70 53 75  d SELECTs in pSu
21930 62 71 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  bq */.  if( pWhe
21940 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  re==0 ) return 0
21950 3b 0a 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71  ;.  for(pX=pSubq
21960 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ; pX; pX=pX->pPr
21970 69 6f 72 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ior){.    if( (p
21980 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  X->selFlags & (S
21990 46 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52  F_Aggregate|SF_R
219a0 65 63 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b  ecursive))!=0 ){
219b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
219c0 20 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   pX->selFlags & 
219d0 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
219e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
219f0 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  pX->selFlags & S
21a00 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20  F_Recursive );. 
21a10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21a20 58 21 3d 70 53 75 62 71 20 29 3b 0a 20 20 20 20  X!=pSubq );.    
21a30 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
21a40 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20  estrictions (1) 
21a50 61 6e 64 20 28 32 29 20 2a 2f 0a 20 20 20 20 7d  and (2) */.    }
21a60 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71  .  }.  if( pSubq
21a70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20  ->pLimit!=0 ){. 
21a80 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
21a90 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20  restriction (3) 
21aa0 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
21ab0 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
21ac0 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20  ND ){.    nChng 
21ad0 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  += pushDownWhere
21ae0 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c  Terms(db, pSubq,
21af0 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c   pWhere->pRight,
21b00 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70   iCursor);.    p
21b10 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
21b20 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
21b30 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
21b40 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
21b50 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
21b60 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
21b70 35 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  5 */.  if( sqlit
21b80 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
21b90 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
21ba0 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
21bb0 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
21bc0 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
21bd0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
21be0 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72  xprDup(db, pWher
21bf0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  e, 0);.      pNe
21c00 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  w = substExpr(db
21c10 2c 20 70 4e 65 77 2c 20 69 43 75 72 73 6f 72 2c  , pNew, iCursor,
21c20 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 29 3b   pSubq->pEList);
21c30 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57  .      pSubq->pW
21c40 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
21c50 70 72 41 6e 64 28 64 62 2c 20 70 53 75 62 71 2d  prAnd(db, pSubq-
21c60 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a  >pWhere, pNew);.
21c70 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53        pSubq = pS
21c80 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  ubq->pPrior;.   
21c90 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21ca0 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20  nChng;.}.#endif 
21cb0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
21cc0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21cd0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
21ce0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
21cf0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20  */../*.** Based 
21d00 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
21d10 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  of the AggInfo s
21d20 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
21d30 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a  ed by the first.
21d40 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69  ** argument, thi
21d50 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
21d60 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
21d70 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
21d80 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72  **    * the quer
21d90 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20  y contains just 
21da0 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61  a single aggrega
21db0 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20  te function,.** 
21dc0 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61     * the aggrega
21dd0 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  te function is e
21de0 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d  ither min() or m
21df0 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  ax(), and.**    
21e00 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * the argument t
21e10 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
21e20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  function is a co
21e30 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  lumn value..**.*
21e40 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
21e50 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20  above are true, 
21e60 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  then WHERE_ORDER
21e70 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
21e80 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69  ORDERBY_MAX.** i
21e90 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70  s returned as ap
21ea0 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c  propriate. Also,
21eb0 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
21ec0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
21ed0 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72  e .** list of ar
21ee0 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
21ef0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
21f00 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
21f10 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
21f20 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
21f30 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c  ove are not met,
21f40 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
21f50 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48  t to 0 and.** WH
21f60 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
21f70 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  AL is returned..
21f80 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
21f90 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f  MaxQuery(AggInfo
21fa0 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72   *pAggInfo, Expr
21fb0 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29  List **ppMinMax)
21fc0 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57  {.  int eRet = W
21fd0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
21fe0 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  MAL;          /*
21ff0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
22000 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  ..  *ppMinMax = 
22010 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  0;.  if( pAggInf
22020 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  o->nFunc==1 ){. 
22030 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
22040 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
22050 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67  [0].pExpr; /* Ag
22060 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
22070 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
22080 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72   *pEList = pExpr
22090 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20  ->x.pList;      
220a0 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
220b0 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  agg function */.
220c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
220d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
220e0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69  UNCTION );.    i
220f0 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
22100 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  ist->nExpr==1 &&
22110 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
22120 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
22130 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
22140 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
22150 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  c = pExpr->u.zTo
22160 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ken;.      if( s
22170 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
22180 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
22190 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
221a0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
221b0 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  IN;.        *ppM
221c0 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
221d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
221e0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
221f0 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
22200 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
22210 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
22220 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MAX;.        *pp
22230 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
22240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22250 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
22260 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a  pMinMax==0 || (*
22270 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72  ppMinMax)->nExpr
22280 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
22290 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eRet;.}../*.** T
222a0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
222b0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
222c0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
222d0 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
222e0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
222f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
22300 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
22310 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20   aggregate-info 
22320 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a  object. This .**
22330 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
22340 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
22350 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
22360 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75  .**   SELECT cou
22370 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
22380 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
22390 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65  le is a database
223a0 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75   table, not a su
223b0 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
223c0 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a  . If the query.*
223d0 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69  * does match thi
223e0 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
223f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
22400 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   Table object re
22410 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74  presenting.** <t
22420 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  bl> is returned.
22430 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
22440 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
22450 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69  atic Table *isSi
22460 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74  mpleCount(Select
22470 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41   *p, AggInfo *pA
22480 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65  ggInfo){.  Table
22490 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a   *pTab;.  Expr *
224a0 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74  pExpr;..  assert
224b0 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  ( !p->pGroupBy )
224c0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  ;..  if( p->pWhe
224d0 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  re || p->pEList-
224e0 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c  >nExpr!=1 .   ||
224f0 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
22500 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  1 || p->pSrc->a[
22510 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a  0].pSelect.  ){.
22520 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
22530 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  }.  pTab = p->pS
22540 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
22550 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
22560 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
22570 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
22580 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  & !pTab->pSelect
22590 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20   && pExpr );..  
225a0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
225b0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
225c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
225d0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
225e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
225f0 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66  f( NEVER(pAggInf
22600 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72  o->nFunc==0) ) r
22610 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
22620 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
22630 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  0].pFunc->funcFl
22640 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
22650 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
22660 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
22670 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
22680 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
22690 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
226a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
226b0 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
226c0 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
226d0 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
226e0 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
226f0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
22700 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
22710 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
22720 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
22730 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
22740 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
22750 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
22760 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
22770 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
22780 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
22790 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
227a0 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
227b0 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
227c0 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
227d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
227e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
227f0 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
22800 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
22810 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
22820 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
22830 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
22840 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pFrom->fg.isInde
22850 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62  xedBy ){.    Tab
22860 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
22870 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
22880 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70   *zIndexedBy = p
22890 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  From->u1.zIndexe
228a0 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dBy;.    Index *
228b0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
228c0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
228d0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
228e0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
228f0 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
22900 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20  ndexedBy); .    
22910 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
22920 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
22930 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
22940 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22950 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
22960 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
22970 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a  zIndexedBy, 0);.
22980 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
22990 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
229a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
229b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
229c0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e      pFrom->pIBIn
229d0 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
229e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
229f0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
22a00 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
22a10 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
22a20 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
22a30 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
22a40 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
22a50 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
22a60 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
22a70 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
22a80 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
22a90 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
22aa0 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
22ab0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
22ac0 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
22ad0 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
22ae0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
22af0 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
22b00 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
22b10 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
22b20 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
22b30 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
22b40 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
22b50 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
22b60 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
22b70 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
22b80 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
22b90 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
22ba0 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
22bb0 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
22bc0 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
22bd0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
22be0 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
22bf0 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
22c00 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
22c10 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
22c20 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
22c30 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
22c40 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
22c50 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
22c60 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
22c70 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
22c80 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
22c90 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
22ca0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
22cb0 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
22cc0 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
22cd0 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
22ce0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
22cf0 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
22d00 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
22d10 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
22d20 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
22d30 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
22d40 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
22d50 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
22d60 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
22d70 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
22d80 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
22d90 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
22da0 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
22db0 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
22dc0 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
22dd0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
22de0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
22df0 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
22e00 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
22e10 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
22e20 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
22e30 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
22e40 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
22e50 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
22e60 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
22e70 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
22e80 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
22e90 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
22ea0 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
22eb0 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
22ec0 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
22ed0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
22ee0 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
22ef0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
22f00 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
22f10 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
22f20 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
22f30 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
22f40 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
22f50 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
22f60 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
22f70 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
22f80 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
22f90 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
22fa0 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
22fb0 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
22fc0 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
22fd0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
22fe0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
22ff0 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
23000 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
23010 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
23020 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
23030 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
23040 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
23050 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
23060 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
23070 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
23080 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
23090 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
230a0 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
230b0 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
230c0 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
230d0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
230e0 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
230f0 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
23100 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
23110 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
23120 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
23130 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
23140 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b  K_ASTERISK, 0));
23150 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  .  p->op = TK_SE
23160 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72  LECT;.  p->pWher
23170 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = 0;.  pNew->p
23180 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70  GroupBy = 0;.  p
23190 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30  New->pHaving = 0
231a0 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
231b0 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72  By = 0;.  p->pPr
231c0 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e  ior = 0;.  p->pN
231d0 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57  ext = 0;.  p->pW
231e0 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65  ith = 0;.  p->se
231f0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
23200 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74  mpound;.  assert
23210 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
23220 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d   SF_Converted)==
23230 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
23240 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74  gs |= SF_Convert
23250 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  ed;.  assert( pN
23260 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b  ew->pPrior!=0 );
23270 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d  .  pNew->pPrior-
23280 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
23290 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
232a0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  0;.  pNew->pOffs
232b0 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  et = 0;.  return
232c0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
232d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
232e0 20 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d   see if the FROM
232f0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72   clause term pFr
23300 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c  om has table-val
23310 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ued function.** 
23320 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69  arguments.  If i
23330 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e  t does, leave an
23340 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
23350 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
23360 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c  urn.** non-zero,
23370 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20   since pFrom is 
23380 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  not allowed to b
23390 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  e a table-valued
233a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
233b0 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42  atic int cannotB
233c0 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  eFunction(Parse 
233d0 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
233e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
233f0 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
23400 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
23410 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
23420 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23430 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75  '%s' is not a fu
23440 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e  nction", pFrom->
23450 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
23460 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
23470 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 0;.}..#ifndef
23480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
23490 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
234a0 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79  pWith (which may
234b0 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73   be NULL) points
234c0 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   to a linked lis
234d0 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20  t of nested .** 
234e0 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66  WITH contexts, f
234f0 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74  rom inner to out
23500 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74  ermost. If the t
23510 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
23520 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  by .** FROM clau
23530 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d  se element pItem
23540 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d   is really a com
23550 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73  mon-table-expres
23560 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74  sion (CTE) .** t
23570 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
23580 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20  nter to the CTE 
23590 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74  definition for t
235a0 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72  hat table. Other
235b0 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  wise.** return N
235c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
235d0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
235e0 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20  s returned, set 
235f0 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f  *ppContext to po
23600 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a  int to the With.
23610 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74  ** object that t
23620 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20  he returned CTE 
23630 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73  belongs to..*/.s
23640 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65  tatic struct Cte
23650 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20   *searchWith(.  
23660 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
23670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23680 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72  /* Current inner
23690 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
236a0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
236b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
236c0 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ,     /* FROM cl
236d0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20  ause element to 
236e0 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74  resolve */.  Wit
236f0 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20  h **ppContext   
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23710 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65  OUT: WITH clause
23720 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65   return value be
23730 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20  longs to */.){. 
23740 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
23750 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d  me;.  if( pItem-
23760 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26  >zDatabase==0 &&
23770 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   (zName = pItem-
23780 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
23790 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66    With *p;.    f
237a0 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70  or(p=pWith; p; p
237b0 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20  =p->pOuter){.   
237c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
237d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
237e0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
237f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
23800 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61  ICmp(zName, p->a
23810 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
23820 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f  .          *ppCo
23830 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  ntext = p;.     
23840 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e       return &p->
23850 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
23860 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23870 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
23880 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  ./* The code gen
23890 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73  erator maintains
238a0 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69   a stack of acti
238b0 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a  ve WITH clauses.
238c0 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65  ** with the inne
238d0 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  r-most WITH clau
238e0 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20  se being at the 
238f0 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
23900 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
23910 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20  tine pushes the 
23920 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73  WITH clause pass
23930 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
23940 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74   argument.** ont
23950 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  o the top of the
23960 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d   stack. If argum
23970 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75  ent bFree is tru
23980 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
23990 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c  WITH clause will
239a0 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64   never be popped
239b0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
239c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
239d0 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72  .** should be fr
239e0 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
239f0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
23a00 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c   In other cases,
23a10 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d   when.** bFree==
23a20 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  0, the With obje
23a30 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  ct will be freed
23a40 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
23a50 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
23a60 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20  ment with which 
23a70 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  it is associated
23a80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23a90 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20  3WithPush(Parse 
23aa0 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70  *pParse, With *p
23ab0 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b  With, u8 bFree){
23ac0 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65  .  assert( bFree
23ad0 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e  ==0 || (pParse->
23ae0 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72  pWith==0 && pPar
23af0 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d  se->pWithToFree=
23b00 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69  =0) );.  if( pWi
23b10 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  th ){.    assert
23b20 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21  ( pParse->pWith!
23b30 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57  =pWith );.    pW
23b40 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50  ith->pOuter = pP
23b50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
23b60 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
23b70 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
23b80 62 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e  bFree ) pParse->
23b90 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57  pWithToFree = pW
23ba0 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ith;.  }.}../*.*
23bb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23bc0 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65  checks if argume
23bd0 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20  nt pFrom refers 
23be0 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65  to a CTE declare
23bf0 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20  d by .** a WITH 
23c00 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74  clause on the st
23c10 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61  ack currently ma
23c20 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  intained by the 
23c30 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20  parser. And,.** 
23c40 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  if currently pro
23c50 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78  cessing a CTE ex
23c60 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20  pression, if it 
23c70 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a  is a recursive.*
23c80 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  * reference to t
23c90 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a  he current CTE..
23ca0 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66  **.** If pFrom f
23cb0 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72  alls into either
23cc0 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65   of the two cate
23cd0 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46  gories above, pF
23ce0 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64  rom->pTab.** and
23cf0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
23d00 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f  e populated acco
23d10 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c  rdingly. The cal
23d20 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b  ler should check
23d30 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62  .** (pFrom->pTab
23d40 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  !=0) to determin
23d50 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
23d60 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61   a successful ma
23d70 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64  tch.** was found
23d80 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
23d90 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69  or not a match i
23da0 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f  s found, SQLITE_
23db0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
23dc0 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f no error.** oc
23dd0 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
23de0 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e  r does occur, an
23df0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
23e00 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  s stored in the.
23e10 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f  ** parser and so
23e20 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  me error code ot
23e30 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
23e40 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
23e50 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45  static int withE
23e60 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20  xpand(.  Walker 
23e70 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72  *pWalker, .  str
23e80 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23e90 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72   *pFrom.){.  Par
23ea0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
23eb0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
23ec0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
23ed0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75  arse->db;.  stru
23ee0 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20  ct Cte *pCte;   
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
23f00 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e  atched CTE (or N
23f10 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29  ULL if no match)
23f20 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
23f30 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
23f40 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c        /* WITH cl
23f50 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62  ause that pCte b
23f60 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
23f70 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23f80 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74  Tab==0 );..  pCt
23f90 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70  e = searchWith(p
23fa0 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46  Parse->pWith, pF
23fb0 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20  rom, &pWith);.  
23fc0 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20  if( pCte ){.    
23fd0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
23fe0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
23ff0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
24000 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  Sel;.    Select 
24010 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
24020 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d         /* Left-m
24030 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
24040 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
24050 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20  bMayRecursive;  
24060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24070 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f  e if compound jo
24080 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41  ined by UNION [A
24090 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20  LL] */.    With 
240a0 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20  *pSavedWith;    
240b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
240c0 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ial value of pPa
240d0 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20  rse->pWith */.. 
240e0 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a     /* If pCte->z
240f0 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55  CteErr is non-NU
24100 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  LL at this point
24110 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  , then this is a
24120 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a  n illegal.    **
24130 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
24140 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65  ence to CTE pCte
24150 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  . Leave an error
24160 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
24170 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72  eturn.    ** ear
24180 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74  ly. If pCte->zCt
24190 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68  eErr is NULL, th
241a0 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  en this is not a
241b0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
241c0 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  ence..    ** In 
241d0 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65  this case, proce
241e0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
241f0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b  pCte->zCteErr ){
24200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
24210 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
24220 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43  Cte->zCteErr, pC
24230 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
24240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24250 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
24260 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e   if( cannotBeFun
24270 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46  ction(pParse, pF
24280 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51  rom) ) return SQ
24290 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20  LITE_ERROR;..   
242a0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
242b0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pTab==0 );.    p
242c0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
242d0 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
242e0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
242f0 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
24300 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
24310 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
24320 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
24330 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e   1;.    pTab->zN
24340 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
24350 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  trDup(db, pCte->
24360 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
24370 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
24380 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
24390 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
243a0 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
243b0 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
243c0 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
243d0 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
243e0 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  ral | TF_NoVisib
243f0 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72  leRowid;.    pFr
24400 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
24410 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
24420 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
24430 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
24440 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
24460 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61  OMEM_BKPT;.    a
24470 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
24480 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  elect );..    /*
24490 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
244a0 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  s a recursive CT
244b0 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d  E. */.    pSel =
244c0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
244d0 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69  .    bMayRecursi
244e0 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d  ve = ( pSel->op=
244f0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d  =TK_ALL || pSel-
24500 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
24510 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
24520 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
24530 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63  int i;.      Src
24540 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72  List *pSrc = pFr
24550 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  om->pSelect->pSr
24560 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  c;.      for(i=0
24570 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
24580 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
24590 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
245a0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63  m *pItem = &pSrc
245b0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
245c0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
245d0 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20  base==0 .       
245e0 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d    && pItem->zNam
245f0 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e!=0 .         &
24600 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
24610 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  Cmp(pItem->zName
24620 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20  , pCte->zName). 
24630 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
24640 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
24650 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
24660 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
24670 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
24680 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
24690 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
246a0 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
246b0 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
246c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
246d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
246e0 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
246f0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
24700 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
24710 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
24720 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
24730 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
24740 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
24750 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
24760 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
24770 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
24780 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
24790 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
247a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
247b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
247c0 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c   pTab->nRef==1 |
247d0 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  | ((pSel->selFla
247e0 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29  gs&SF_Recursive)
247f0 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d   && pTab->nRef==
24800 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d  2 ));..    pCte-
24810 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63  >zCteErr = "circ
24820 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20  ular reference: 
24830 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57  %s";.    pSavedW
24840 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ith = pParse->pW
24850 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
24860 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
24870 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
24880 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62  elect(pWalker, b
24890 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f 20 70  MayRecursive ? p
248a0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53  Sel->pPrior : pS
248b0 65 6c 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  el);.    pParse-
248c0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
248d0 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70  .    for(pLeft=p
248e0 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69  Sel; pLeft->pPri
248f0 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d  or; pLeft=pLeft-
24900 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45  >pPrior);.    pE
24910 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
24920 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43  List;.    if( pC
24930 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20  te->pCols ){.   
24940 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
24950 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
24960 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
24970 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
24980 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24990 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
249a0 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f  has %d values fo
249b0 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20  r %d columns",. 
249c0 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d             pCte-
249d0 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e  >zName, pEList->
249e0 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f  nExpr, pCte->pCo
249f0 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  ls->nExpr.      
24a00 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61    );.        pPa
24a10 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
24a20 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20  vedWith;.       
24a30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24a40 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
24a50 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74      pEList = pCt
24a60 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a  e->pCols;.    }.
24a70 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
24a80 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
24a90 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
24aa0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
24ab0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
24ac0 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
24ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
24ae0 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
24af0 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
24b00 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74         pCte->zCt
24b10 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65  eErr = "multiple
24b20 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
24b30 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20  ences: %s";.    
24b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24b50 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
24b60 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
24b70 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
24b80 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
24b90 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
24ba0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
24bb0 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
24bc0 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
24bd0 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  r = 0;.    pPars
24be0 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
24bf0 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65  dWith;.  }..  re
24c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24c10 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
24c20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
24c30 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  E./*.** If the S
24c40 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20  ELECT passed as 
24c50 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
24c60 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63  ent has an assoc
24c70 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63  iated WITH .** c
24c80 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72  lause, pop it fr
24c90 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f  om the stack sto
24ca0 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
24cb0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
24cc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
24cd0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
24ce0 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  the xSelectCallb
24cf0 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20  ack2() callback 
24d00 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  by.** sqlite3Sel
24d10 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e  ectExpand() when
24d20 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43   walking a SELEC
24d30 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76  T tree to resolv
24d40 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
24d50 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20   and other FROM 
24d60 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e  clause elements.
24d70 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
24d80 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57   selectPopWith(W
24d90 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
24da0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
24db0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
24dc0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
24dd0 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66   With *pWith = f
24de0 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
24df0 3e 70 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57  >pWith;.  if( pW
24e00 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ith!=0 ){.    as
24e10 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
24e20 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith==pWith );.  
24e30 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24e40 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  = pWith->pOuter;
24e50 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
24e60 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
24e70 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
24e80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24e90 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
24ea0 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
24eb0 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
24ec0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
24ed0 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
24ee0 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
24ef0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
24f00 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
24f10 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
24f20 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
24f30 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
24f40 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
24f50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24f60 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
24f70 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
24f80 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
24f90 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
24fa0 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
24fb0 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
24fc0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
24fd0 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
24fe0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24ff0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
25000 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
25010 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
25020 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
25030 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
25040 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
25050 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
25060 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
25070 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
25080 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
25090 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
250a0 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
250b0 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
250c0 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
250d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
250e0 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
250f0 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
25100 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70  e persistent rep
25110 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
25120 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
25130 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
25140 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
25150 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
25160 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
25170 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
25180 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
25190 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
251a0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
251b0 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
251c0 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
251d0 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
251e0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
251f0 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
25200 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
25210 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
25220 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
25230 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
25240 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
25250 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
25260 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
25270 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
25280 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
25290 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
252a0 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
252b0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
252c0 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
252d0 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
252e0 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
252f0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
25300 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
25310 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
25320 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
25330 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
25340 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
25350 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
25360 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
25370 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
25380 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
25390 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
253a0 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
253b0 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
253c0 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
253d0 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c  ags;..  p->selFl
253e0 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
253f0 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ed;.  if( db->ma
25400 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
25410 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
25420 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  ort;.  }.  if( N
25430 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29  EVER(p->pSrc==0)
25440 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20   || (selFlags & 
25450 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
25460 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
25470 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
25480 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
25490 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
254a0 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
254b0 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43  Walker->xSelectC
254c0 61 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74  allback2==select
254d0 50 6f 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73  PopWith ){.    s
254e0 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
254f0 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74  Parse, findRight
25500 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20  most(p)->pWith, 
25510 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  0);.  }..  /* Ma
25520 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
25530 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
25540 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
25550 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
25560 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25570 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
25580 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
25590 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
255a0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
255b0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
255c0 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
255d0 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
255e0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
255f0 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
25600 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
25610 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
25620 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
25630 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
25640 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
25650 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
25660 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
25670 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
25680 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
25690 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
256a0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
256b0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
256c0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
256d0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
256e0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
256f0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
25700 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d  fg.isRecursive==
25710 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  0 || pFrom->pTab
25720 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
25730 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
25740 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sive ) continue;
25750 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
25760 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23  om->pTab==0 );.#
25770 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25780 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77  IT_CTE.    if( w
25790 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65  ithExpand(pWalke
257a0 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75  r, pFrom) ) retu
257b0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
257c0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
257d0 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64  b ) {} else.#end
257e0 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  if.    if( pFrom
257f0 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
25800 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25810 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
25820 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
25830 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
25840 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
25850 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
25860 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
25870 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
25880 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a  ert( pSel!=0 );.
25890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
258a0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
258b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
258c0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
258d0 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74  ker, pSel) ) ret
258e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
258f0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
25900 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
25910 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
25920 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
25930 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
25940 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
25950 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
25960 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
25970 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
25980 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
25990 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f  (db, "sqlite_sq_
259a0 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  %p", (void*)pTab
259b0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
259c0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
259d0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
259e0 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  ior; }.      sql
259f0 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
25a00 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
25a10 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
25a20 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
25a30 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
25a40 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
25a50 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
25a60 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
25a70 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
25a80 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
25a90 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
25aa0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
25ab0 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
25ac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25ad0 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
25ae0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
25af0 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
25b00 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
25b10 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
25b20 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
25b30 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
25b40 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
25b50 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
25b60 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
25b70 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
25b80 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
25b90 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
25ba0 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66  Tab->nRef==0xfff
25bb0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
25bc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
25bd0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
25be0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
25bf0 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
25c00 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
25c10 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
25c20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
25c30 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
25c40 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25c50 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
25c60 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  >nRef++;.      i
25c70 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
25c80 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46  ab) && cannotBeF
25c90 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
25ca0 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
25cb0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
25cc0 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  rt;.      }.#if 
25cd0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25ce0 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
25cf0 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
25d00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
25d10 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69  ).      if( IsVi
25d20 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70  rtual(pTab) || p
25d30 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
25d40 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c          i16 nCol
25d50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
25d60 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
25d70 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
25d80 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
25d90 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
25da0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
25db0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
25dc0 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
25dd0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
25de0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
25df0 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
25e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
25e10 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72  electSetName(pFr
25e20 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61  om->pSelect, pTa
25e30 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
25e40 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     nCol = pTab->
25e50 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54  nCol;.        pT
25e60 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  ab->nCol = -1;. 
25e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
25e80 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
25e90 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
25ea0 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  );.        pTab-
25eb0 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
25ec0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25ed0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74   }..    /* Locat
25ee0 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  e the index name
25ef0 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44  d by the INDEXED
25f00 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61   BY clause, if a
25f10 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ny. */.    if( s
25f20 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
25f30 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46  ookup(pParse, pF
25f40 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  rom) ){.      re
25f50 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25f60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
25f70 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
25f80 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
25f90 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
25fa0 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
25fb0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
25fc0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69  ocFailed || sqli
25fd0 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
25fe0 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
25ff0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
26000 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
26010 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
26020 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
26030 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
26040 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
26050 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
26060 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
26070 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
26080 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
26090 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
260a0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
260b0 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
260c0 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
260d0 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
260e0 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
260f0 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72  STERISK operator
26100 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
26110 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
26120 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c  he column.  ** l
26130 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ist.  The follow
26140 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
26150 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
26160 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a  TK_ASTERISK.  **
26170 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
26180 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65   expand each one
26190 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
261a0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20  all columns in. 
261b0 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   ** all tables..
261c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
261d0 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
261e0 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
261f0 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
26200 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
26210 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
26220 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
26230 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
26240 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
26250 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
26260 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
26270 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45   pE->op==TK_ASTE
26280 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  RISK ) break;.  
26290 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
262a0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
262b0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
262c0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
262d0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
262e0 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
262f0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
26300 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
26310 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
26320 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
26330 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
26340 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  ak;.  }.  if( k<
26350 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
26360 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
26370 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
26380 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
26390 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
263a0 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
263b0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
263c0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
263d0 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
263e0 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
263f0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
26400 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
26410 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
26420 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
26430 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
26440 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
26450 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
26460 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
26470 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
26480 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
26490 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
264a0 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
264b0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
264c0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
264f0 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
26500 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
26510 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
26520 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
26530 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
26540 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68  xpr;.      pRigh
26550 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
26560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
26570 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
26580 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
26590 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
265a0 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20  K_ASTERISK.     
265b0 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b    && (pE->op!=TK
265c0 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e  _DOT || pRight->
265d0 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29  op!=TK_ASTERISK)
265e0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
265f0 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
26600 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
26610 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
26620 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
26630 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
26640 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
26650 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
26660 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
26670 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
26680 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
26690 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
266a0 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
266b0 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
266c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
266d0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
266e0 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e  1].zSpan = a[k].
266f0 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  zSpan;.         
26700 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
26710 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
26720 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20  zSpan = 0;.     
26730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
26740 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
26750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26760 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
26770 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
26780 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
26790 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
267a0 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
267b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
267c0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
267d0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
267e0 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
267f0 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
26800 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b  har *zTName = 0;
26810 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
26820 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
26830 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
26840 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  E->op==TK_DOT ){
26850 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26860 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  t( pE->pLeft!=0 
26870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
26880 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
26890 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c  perty(pE->pLeft,
268a0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
268b0 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
268c0 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75  e = pE->pLeft->u
268d0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
268e0 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
268f0 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
26900 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
26910 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
26920 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
26930 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
26940 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
26950 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
26960 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sub = pFrom->pSe
26970 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20  lect;.          
26980 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
26990 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
269a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
269b0 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d  char *zSchemaNam
269c0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
269d0 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
269e0 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
269f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
26a00 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
26a10 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
26a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26a30 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
26a40 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
26a50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
26a60 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73  b==0 || (pSub->s
26a70 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
26a80 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20  tedFrom)==0 ){. 
26a90 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20             pSub 
26aa0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
26ab0 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73   if( zTName && s
26ac0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
26ad0 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
26ae0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26af0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26b00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26b10 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
26b20 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
26b30 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
26b40 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
26b50 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d     zSchemaName =
26b60 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44   iDb>=0 ? db->aD
26b70 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20  b[iDb].zDbSName 
26b80 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20  : "*";.         
26b90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72   }.          for
26ba0 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
26bb0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
26bc0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
26bd0 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
26be0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
26bf0 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e       char *zColn
26c00 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ame;  /* The com
26c10 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
26c20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
26c30 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20   char *zToFree; 
26c40 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74    /* Malloced st
26c50 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20  ring that needs 
26c60 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
26c70 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e             Token
26c80 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43   sColname;  /* C
26c90 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
26ca0 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a  ame as a token *
26cb0 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  /..            a
26cc0 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a  ssert( zName );.
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26ce0 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20  zTName && pSub. 
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
26d00 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e  qlite3MatchSpanN
26d10 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74  ame(pSub->pEList
26d20 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c  ->a[j].zSpan, 0,
26d30 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20   zTName, 0)==0. 
26d40 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
26d50 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
26d60 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
26d70 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
26d80 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
26d90 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
26da0 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66  dden', omit it f
26db0 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64  rom the expanded
26dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
26dd0 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20  result-set list 
26de0 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43  unless the SELEC
26df0 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63  T has the SF_Inc
26e00 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20  ludeHidden.     
26e10 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65         ** bit se
26e20 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
26e30 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
26e40 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
26e50 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65   SF_IncludeHidde
26e60 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
26e70 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f     && IsHiddenCo
26e80 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
26e90 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20  [j]) .          
26ea0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
26eb0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26ec0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26ed0 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
26ee0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
26ef0 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
26f00 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
26f10 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
26f20 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  rom->fg.jointype
26f30 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
26f40 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
26f50 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
26f60 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
26f70 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
26f80 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
26f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26fa0 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
26fb0 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
26fc0 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
26fd0 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
26fe0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
26ff0 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
27000 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
27020 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
27030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27040 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
27050 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
27060 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
27070 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
27080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
27090 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
270a0 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
270b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
270e0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
270f0 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27110 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27140 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
27150 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
27160 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
27170 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
27180 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
27190 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
271a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
271b0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
271c0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
271d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
271e0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
27200 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
27210 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
27220 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
27230 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
27240 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
27250 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
27260 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
27270 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
27280 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20  SchemaName ){.  
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
272a0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
272b0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63  r(db, TK_ID, zSc
272c0 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20  hemaName);.     
272d0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
272e0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
272f0 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
27300 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29  pLeft, pExpr, 0)
27310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27320 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
27330 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
27340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27350 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
27360 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
27370 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
27380 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
27390 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
273a0 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
273b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
273c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
273d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
273e0 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
273f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27400 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
27410 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
27420 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
27430 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
27440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
27450 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61  okenInit(&sColna
27460 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
27470 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27480 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
27490 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
274a0 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
274b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
274c0 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  New && (p->selFl
274d0 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
274e0 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
274f0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
27500 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
27510 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65  X = &pNew->a[pNe
27520 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  w->nExpr-1];.   
27530 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
27540 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
27550 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
27560 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
27570 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  up(db, pSub->pEL
27580 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29  ist->a[j].zSpan)
27590 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
275a0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
275b0 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
275c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
275d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
275e0 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
275f0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
27600 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20  "%s.%s.%s",.    
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27630 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
27640 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43  me, zTabName, zC
27650 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
27660 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
27670 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
27680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27690 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
276a0 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20   pX->bSpanIsTab 
276b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
276c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
276d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
276e0 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
276f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27700 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
27710 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
27720 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
27730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
27740 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27750 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
27760 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
27770 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
27780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27790 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
277a0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
277b0 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
277c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
277d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
277e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
277f0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
27800 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
27810 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
27820 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
27830 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
27840 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
27850 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
27860 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
27870 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
27880 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
27890 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
278a0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
278b0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
278c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  );.    return WR
278d0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e  C_Abort;.  }.#en
278e0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
278f0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
27900 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
27910 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
27920 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
27930 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
27940 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
27950 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
27960 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
27970 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
27980 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
27990 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
279a0 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
279b0 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
279c0 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
279d0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
279e0 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
279f0 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
27a00 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
27a10 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
27a20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
27a30 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
27a40 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
27a50 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
27a60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
27a70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
27a80 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
27a90 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
27aa0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
27ab0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
27ac0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
27ad0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
27ae0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27af0 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
27b00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
27b10 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
27b20 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
27b30 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
27b40 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
27b50 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
27b60 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
27b70 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
27b80 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
27b90 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
27ba0 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
27bb0 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
27bc0 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
27bd0 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
27be0 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
27bf0 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
27c00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
27c10 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
27c20 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
27c30 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
27c40 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
27c50 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
27c60 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
27c70 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
27c80 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
27c90 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
27ca0 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
27cb0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
27cc0 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
27cd0 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
27ce0 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
27cf0 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
27d00 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
27d10 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
27d20 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
27d30 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
27d40 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
27d50 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
27d60 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
27d70 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
27d80 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
27d90 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
27da0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
27db0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
27dc0 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
27dd0 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
27de0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
27df0 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
27e00 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
27e10 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
27e20 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
27e30 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
27e40 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
27e50 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
27e60 3b 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63 74  ;.  if( (pSelect
27e70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27e80 4d 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 29  MultiValue)==0 )
27e90 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
27ea0 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
27eb0 74 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20  tPopWith;.  }.  
27ec0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
27ed0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
27ee0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
27ef0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
27f00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
27f10 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
27f20 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
27f30 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
27f40 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
27f50 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
27f60 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
27f70 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
27f80 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
27f90 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
27fa0 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
27fb0 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
27fc0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
27fd0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
27fe0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
27ff0 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
28000 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
28010 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
28020 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
28030 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
28040 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
28050 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
28060 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
28070 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
28080 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
28090 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
280a0 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
280b0 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
280c0 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
280d0 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
280e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
280f0 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
28100 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
28110 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
28120 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
28130 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
28140 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
28150 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
28160 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
28170 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
28180 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
28190 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
281a0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
281b0 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
281c0 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
281d0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
281e0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
281f0 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
28200 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
28210 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
28220 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
28230 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
28240 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
28250 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
28260 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
28270 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
28280 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
28290 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
282a0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
282b0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
282c0 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
282d0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
282e0 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
282f0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
28300 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
28310 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
28320 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
28330 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
28340 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
28350 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
28360 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
28370 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
28380 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
28390 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
283a0 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
283b0 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
283c0 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
283d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
283e0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
283f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
28400 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
28410 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
28420 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
28430 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
28440 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
28450 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
28460 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
28470 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
28480 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
28490 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
284a0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
284b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
284c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
284d0 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
284e0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
284f0 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
28500 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
28510 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
28520 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
28530 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
28540 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
28550 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
28560 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
28570 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
28580 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
28590 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
285a0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
285b0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
285c0 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
285d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
285e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
285f0 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
28600 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
28610 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
28620 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
28630 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
28640 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
28650 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
28660 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
28670 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
28680 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
28690 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
286a0 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
286b0 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
286c0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
286d0 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
286e0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
286f0 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
28700 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
28710 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
28720 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
28730 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
28740 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
28750 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
28760 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
28770 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
28780 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
28790 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
287a0 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
287b0 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
287c0 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
287d0 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
287e0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
287f0 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
28800 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
28810 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
28820 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
28830 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
28840 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
28850 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
28860 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
28870 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
28880 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
28890 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
288a0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
288b0 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
288c0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
288d0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
288e0 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  >db;.  if( db->m
288f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
28900 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73  turn;.  if( p->s
28910 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
28920 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
28930 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
28940 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c  ctExpand(pParse,
28950 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   p);.  if( pPars
28960 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
28970 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
28980 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
28990 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
289a0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
289b0 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
289c0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
289d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
289e0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
289f0 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
28a00 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  nfo(pParse, p);.
28a10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
28a20 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
28a30 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
28a40 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
28a50 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
28a60 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
28a70 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
28a80 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
28a90 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
28aa0 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
28ab0 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
28ac0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
28ad0 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73  code that stores
28ae0 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
28af0 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a   those memory.**
28b00 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
28b10 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
28b20 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
28b30 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
28b40 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
28b50 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
28b60 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
28b70 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
28b80 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
28b90 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e  nt nReg = pAggIn
28ba0 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67  fo->nFunc + pAgg
28bb0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  Info->nColumn;. 
28bc0 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72   if( nReg==0 ) r
28bd0 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51  eturn;.#ifdef SQ
28be0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
28bf0 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
28c00 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72  AggInfo register
28c10 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  s are within the
28c20 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64   range specified
28c30 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f   by.  ** AggInfo
28c40 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e  .mnReg..AggInfo.
28c50 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72  mxReg */.  asser
28c60 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66  t( nReg==pAggInf
28c70 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66  o->mxReg-pAggInf
28c80 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20  o->mnReg+1 );.  
28c90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
28ca0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
28cb0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
28cc0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
28cd0 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
28ce0 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
28cf0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   && pAggInfo->aC
28d00 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  ol[i].iMem<=pAgg
28d10 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
28d20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
28d30 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
28d40 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
28d50 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  t( pAggInfo->aFu
28d60 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  nc[i].iMem>=pAgg
28d70 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
28d80 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
28d90 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c  ->aFunc[i].iMem<
28da0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
28db0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
28dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28dd0 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
28de0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  , pAggInfo->mnRe
28df0 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g, pAggInfo->mxR
28e00 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63  eg);.  for(pFunc
28e10 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
28e20 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
28e30 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
28e40 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Func++){.    if(
28e50 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
28e60 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
28e70 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
28e80 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
28e90 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
28ea0 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
28eb0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
28ec0 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
28ed0 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
28ee0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
28ef0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28f00 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
28f10 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
28f20 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
28f30 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
28f40 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
28f50 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
28f60 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
28f70 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
28f80 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
28f90 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
28fa0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
28fb0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
28fc0 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
28fd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28fe0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
28ff0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
29000 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
29010 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
29030 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
29040 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
29050 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
29060 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
29070 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
29080 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
29090 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
290a0 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
290b0 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
290c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
290d0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
290e0 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
290f0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
29100 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
29110 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
29120 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
29130 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
29140 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
29150 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
29160 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
29170 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
29180 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
29190 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
291a0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
291b0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
291c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
291d0 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
291e0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c  lect) );.    sql
291f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
29200 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
29210 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
29220 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
29230 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
29240 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
29250 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
29260 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
29270 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
29280 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
29290 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
292a0 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
292b0 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
292c0 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
292d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
292e0 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
292f0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
29300 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
29310 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
29320 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
29330 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
29340 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
29350 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
29360 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
29370 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
29380 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
29390 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
293a0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
293b0 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
293c0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
293d0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
293e0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
293f0 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
29400 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
29410 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
29420 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
29430 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
29440 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
29450 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
29460 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29470 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
29480 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
29490 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
294a0 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
294b0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
294c0 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
294d0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
294e0 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
294f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
29500 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
29510 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
29520 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   0, SQLITE_ECEL_
29530 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DUP);.    }else{
29540 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
29550 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
29560 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
29570 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
29580 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
29590 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
295a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
295b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
295c0 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72  Arg==0 );  /* Er
295d0 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f  ror condition */
295e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
295f0 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20   nArg>1 );   /* 
29600 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f  Also an error */
29610 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
29620 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
29630 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
29640 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
29650 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29660 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  F->pFunc->funcFl
29670 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
29680 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
29690 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
296a0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
296b0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
296c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
296d0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
296e0 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
296f0 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
29700 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
29710 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
29720 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
29730 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
29740 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
29750 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
29760 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
29770 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
29780 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
29790 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
297a0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
297b0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
297c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
297d0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
297e0 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
297f0 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
29800 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
29810 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
29820 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
29830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29840 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
29850 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
29860 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
29870 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
29880 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29890 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
298a0 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67  Step0, 0, regAgg
298b0 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20  , pF->iMem,.    
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298d0 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
298e0 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
298f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29900 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
29910 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
29920 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
29930 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
29940 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
29950 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
29960 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
29970 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
29980 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
29990 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
299a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
299b0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
299c0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
299d0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
299e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
299f0 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
29a00 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61  populating the a
29a10 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
29a20 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ters, clear the 
29a30 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
29a40 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
29a50 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75   any of the requ
29a60 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ired column valu
29a70 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  es are already p
29a80 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20  resent .  ** in 
29a90 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74  registers, sqlit
29aa0 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79  e3ExprCode() may
29ab0 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f   use OP_SCopy to
29ac0 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a   copy the value.
29ad0 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d    ** to pC->iMem
29ae0 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d  . But by the tim
29af0 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75  e the value is u
29b00 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  sed, the origina
29b10 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20  l register.  ** 
29b20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73  may have been us
29b30 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ed, invalidating
29b40 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
29b50 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74  buffer holding t
29b60 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20  he.  ** text or 
29b70 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20  blob value. See 
29b80 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63  ticket [883034dc
29b90 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  b5]..  **.  ** A
29ba0 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20  nother solution 
29bb0 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e  would be to chan
29bc0 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20  ge the OP_SCopy 
29bd0 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63  used to copy cac
29be0 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  hed.  ** values 
29bf0 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20  to an OP_Copy.. 
29c00 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74   */.  if( regHit
29c10 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54   ){.    addrHitT
29c20 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
29c30 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
29c40 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43  , regHit); VdbeC
29c50 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
29c60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
29c70 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
29c80 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
29c90 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
29ca0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
29cb0 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
29cc0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
29cd0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
29ce0 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
29cf0 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
29d00 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
29d10 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
29d20 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
29d30 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
29d40 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
29d50 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
29d60 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
29d70 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
29d80 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
29d90 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
29da0 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
29db0 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
29dc0 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
29dd0 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
29de0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
29df0 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
29e00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
29e10 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
29e20 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
29e30 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
29e40 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
29e50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
29e60 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
29e70 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
29e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29e90 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
29ea0 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
29eb0 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
29ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29ed0 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
29ee0 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
29ef0 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
29f00 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
29f10 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f  2 ){.    int bCo
29f20 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26  ver = (pIdx!=0 &
29f30 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
29f40 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
29f50 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b  eyIndex(pIdx)));
29f60 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20  .    char *zEqp 
29f70 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
29f80 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43  (pParse->db, "SC
29f90 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22  AN TABLE %s%s%s"
29fa0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
29fb0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62  zName,.        b
29fc0 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20  Cover ? " USING 
29fd0 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22  COVERING INDEX "
29fe0 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62   : "",.        b
29ff0 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e  Cover ? pIdx->zN
2a000 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a  ame : "".    );.
2a010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a020 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70  ddOp4(.        p
2a030 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
2a040 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
2a050 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
2a060 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41  0, zEqp, P4_DYNA
2a070 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  MIC.    );.  }.}
2a080 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2a090 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
2a0a0 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
2a0b0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2a0c0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
2a0d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
2a0e0 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
2a0f0 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
2a100 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
2a110 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
2a120 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
2a130 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
2a140 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
2a150 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
2a160 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
2a170 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
2a180 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2a190 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
2a1a0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
2a1b0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
2a1c0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
2a1d0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
2a1e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2a1f0 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
2a200 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2a210 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a220 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
2a230 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
2a240 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
2a250 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
2a260 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
2a270 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
2a280 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
2a290 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2a2a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2a2b0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2a2c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
2a2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a2e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2a2f0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
2a300 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
2a310 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
2a320 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
2a330 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
2a340 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
2a350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2a360 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2a370 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
2a380 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
2a390 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
2a3a0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
2a3b0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
2a3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a3d0 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
2a3e0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
2a3f0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
2a400 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
2a410 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
2a420 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
2a430 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
2a440 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
2a450 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  = 0;  /* List of
2a460 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
2a470 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
2a480 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
2a490 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
2a4a0 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
2a4b0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
2a4c0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
2a4d0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2a4e0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2a4f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2a500 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
2a510 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
2a520 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
2a530 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
2a540 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
2a550 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
2a560 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2a570 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
2a580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2a590 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
2a5a0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
2a5b0 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
2a5c0 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
2a5d0 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
2a5e0 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
2a5f0 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53  T keyword */.  S
2a600 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20  ortCtx sSort;   
2a610 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e        /* Info on
2a620 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
2a630 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2a640 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
2a650 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
2a660 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
2a670 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
2a680 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
2a690 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
2a6a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2a6b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
2a6c0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
2a6d0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2a6e0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2a6f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
2a700 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a710 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
2a720 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  t iRestoreSelect
2a730 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
2a740 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65  lectId;.  pParse
2a750 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50  ->iSelectId = pP
2a760 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2a770 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  tId++;.#endif.. 
2a780 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2a790 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
2a7a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2a7b0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
2a7c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2a7d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2a7e0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2a7f0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
2a800 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
2a810 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
2a820 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
2a830 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
2a840 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2a850 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61  CE_ENABLED.  pPa
2a860 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
2a870 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52  nt++;.  SELECTTR
2a880 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20  ACE(1,pParse,p, 
2a890 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69  ("begin processi
2a8a0 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20  ng:\n"));.  if( 
2a8b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2a8c0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2a8d0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2a8e0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2a8f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2a900 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2a910 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2a920 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
2a930 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
2a940 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2a950 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2a960 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  !=SRT_Fifo );.  
2a970 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2a980 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2a990 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
2a9a0 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72  Queue );.  asser
2a9b0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
2a9c0 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
2a9d0 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a  t!=SRT_Queue );.
2a9e0 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
2a9f0 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
2aa00 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
2aa10 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
2aa20 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
2aa30 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
2aa40 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
2aa50 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2aa60 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
2aa70 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2aa80 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20  card ||.        
2aa90 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
2aaa0 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70  =SRT_Queue  || p
2aab0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2aac0 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20  _DistFifo ||.   
2aad0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2aae0 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
2aaf0 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  eue || pDest->eD
2ab00 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a  est==SRT_Fifo);.
2ab10 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
2ab20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
2ab30 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
2ab40 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
2ab50 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
2ab60 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
2ab70 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
2ab80 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
2ab90 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2aba0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
2abb0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
2abc0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
2abd0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
2abe0 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
2abf0 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
2ac00 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d  arse, p, 0);.  m
2ac10 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c  emset(&sSort, 0,
2ac20 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b   sizeof(sSort));
2ac30 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  .  sSort.pOrderB
2ac40 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2ac50 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2ac60 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61  >pSrc;.  if( pPa
2ac70 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
2ac80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
2ac90 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
2aca0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _end;.  }.  asse
2acb0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
2acc0 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70   );.  isAgg = (p
2acd0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2ace0 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23  Aggregate)!=0;.#
2acf0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2ad00 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2ad10 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2ad20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53  & 0x100 ){.    S
2ad30 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
2ad40 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74  ,pParse,p, ("aft
2ad50 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
2ad60 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
2ad70 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2ad80 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2ad90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54  }.#endif..  /* T
2ada0 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ry to flatten su
2adb0 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
2adc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69  FROM clause up i
2add0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65  nto the main que
2ade0 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  ry.  */.#if !def
2adf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2ae00 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
2ae10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2ae20 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
2ae30 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
2ae40 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
2ae50 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2ae60 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ae70 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2ae80 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2ae90 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2aea0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2aeb0 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
2aec0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2aed0 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
2aee0 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2aef0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2af00 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74   /* Catch mismat
2af10 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72  ch in the declar
2af20 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20  ed columns of a 
2af30 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d  view and the num
2af40 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f  ber of.    ** co
2af50 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  lumns in the SEL
2af60 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a  ECT on the RHS *
2af70 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  /.    if( pTab->
2af80 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69  nCol!=pSub->pELi
2af90 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
2afa0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2afb0 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65  sg(pParse, "expe
2afc0 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
2afd0 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74  for '%s' but got
2afe0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
2b000 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e  ->nCol, pTab->zN
2b010 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ame, pSub->pELis
2b020 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
2b030 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2b040 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 41  ;.    }..    isA
2b050 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
2b060 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2b070 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
2b080 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
2b090 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
2b0a0 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
2b0b0 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
2b0c0 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
2b0d0 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
2b0e0 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
2b0f0 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
2b100 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
2b110 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
2b120 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2b130 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
2b140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
2b150 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
2b160 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2b170 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  c;.    if( db->m
2b180 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2b190 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2b1a0 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
2b1b0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2b1c0 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  ){.      sSort.p
2b1d0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2b1e0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
2b1f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
2b200 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20  t a pointer the 
2b210 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
2b220 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ruction, allocat
2b230 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69  ing a new VDBE i
2b240 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20  f one.  ** does 
2b250 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
2b260 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  t */.  v = sqlit
2b270 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2b280 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
2b290 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2b2a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2b2b0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2b2c0 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
2b2d0 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
2b2e0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
2b2f0 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
2b300 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
2b310 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
2b320 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2b330 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2b340 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2b350 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2b360 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2b370 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2b380 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2b390 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2b3a0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2b3b0 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2b3c0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2b3d0 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2b3e0 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2b3f0 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
2b400 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
2b410 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2b420 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2b430 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
2b440 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
2b450 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
2b460 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
2b470 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2b480 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2b490 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2b4a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2b4b0 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  W).  for(i=0; i<
2b4c0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2b4d0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2b4e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2b4f0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2b500 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2b510 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
2b520 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
2b530 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
2b540 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2b550 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2b560 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68   /* Sometimes th
2b570 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62  e code for a sub
2b580 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65  query will be ge
2b590 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61  nerated more tha
2b5a0 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69  n.    ** once, i
2b5b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2b5c0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48  s part of the WH
2b5d0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ERE clause in a 
2b5e0 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a  LEFT JOIN,.    *
2b5f0 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  * for example.  
2b600 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f  In that case, do
2b610 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20   not regenerate 
2b620 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69  the code to mani
2b630 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69  fest.    ** a vi
2b640 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75  ew or the co-rou
2b650 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tine to implemen
2b660 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66  t a view.  The f
2b670 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20  irst instance.  
2b680 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65    ** is sufficie
2b690 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73  nt, though the s
2b6a0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e  ubroutine to man
2b6b0 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64  ifest the view d
2b6c0 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  oes need.    ** 
2b6d0 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67  to be invoked ag
2b6e0 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2b6f0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2b700 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ub ){.      if( 
2b710 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
2b720 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  outine==0 ){.   
2b730 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b740 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2b750 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ub, pItem->regRe
2b760 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64  turn, pItem->add
2b770 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20  rFillSub);.     
2b780 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
2b790 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
2b7a0 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
2b7b0 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
2b7c0 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
2b7d0 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
2b7e0 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
2b7f0 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  erred to by this
2b800 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
2b810 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
2b820 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
2b830 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
2b840 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
2b850 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
2b860 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
2b870 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
2b880 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
2b890 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
2b8a0 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
2b8b0 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
2b8c0 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
2b8d0 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
2b8e0 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
2b8f0 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
2b900 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
2b910 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
2b920 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
2b930 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f  ..    /* Make co
2b940 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74  pies of constant
2b950 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65   WHERE-clause te
2b960 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  rms in the outer
2b970 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20   query down.    
2b980 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75  ** inside the su
2b990 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61  bquery.  This ca
2b9a0 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75  n help the subqu
2b9b0 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20  ery to run more 
2b9c0 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20  efficiently..   
2b9d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
2b9e0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
2b9f0 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20  & JT_OUTER)==0. 
2ba00 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57      && pushDownW
2ba10 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53  hereTerms(db, pS
2ba20 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  ub, p->pWhere, p
2ba30 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20  Item->iCursor). 
2ba40 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54     ){.#if SELECT
2ba50 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2ba60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2ba70 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2ba80 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45  00 ){.        SE
2ba90 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2baa0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
2bab0 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75   WHERE-clause pu
2bac0 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20  sh-down:\n"));. 
2bad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
2bae0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2baf0 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  p, 0);.      }.#
2bb00 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2bb10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2bb20 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2bb30 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
2bb40 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75  **.    ** The su
2bb50 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d  bquery is implem
2bb60 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
2bb70 75 74 69 6e 65 20 69 66 20 61 6c 6c 20 6f 66 20  utine if all of 
2bb80 74 68 65 73 65 20 61 72 65 20 74 72 75 65 3a 0a  these are true:.
2bb90 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 54 68      **   (1)  Th
2bba0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 67 75  e subquery is gu
2bbb0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74  aranteed to be t
2bbc0 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73  he outer loop (s
2bbd0 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a 2a  o that it.    **
2bbe0 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74          does not
2bbf0 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6d 70   need to be comp
2bc00 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  uted more than o
2bc10 6e 63 65 29 0a 20 20 20 20 2a 2a 20 20 20 28 32  nce).    **   (2
2bc20 29 20 20 54 68 65 20 41 4c 4c 20 6b 65 79 77 6f  )  The ALL keywo
2bc30 72 64 20 61 66 74 65 72 20 53 45 4c 45 43 54 20  rd after SELECT 
2bc40 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 28 41 70  is omitted.  (Ap
2bc50 70 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 0a 20  plications are. 
2bc60 20 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6c 6c     **        all
2bc70 6f 77 65 64 20 74 6f 20 73 61 79 20 22 53 45 4c  owed to say "SEL
2bc80 45 43 54 20 41 4c 4c 22 20 69 6e 73 74 65 61 64  ECT ALL" instead
2bc90 20 6f 66 20 6a 75 73 74 20 22 53 45 4c 45 43 54   of just "SELECT
2bca0 22 20 74 6f 20 64 69 73 61 62 6c 65 0a 20 20 20  " to disable.   
2bcb0 20 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 75   **        the u
2bcc0 73 65 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65  se of co-routine
2bcd0 73 2e 29 0a 20 20 20 20 2a 2a 20 20 20 28 33 29  s.).    **   (3)
2bce0 20 20 43 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72    Co-routines ar
2bcf0 65 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 20 75  e not disabled u
2bd00 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 74 65 73  sing sqlite3_tes
2bd10 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 20 20 20 20  t_control().    
2bd20 2a 2a 20 20 20 20 20 20 20 20 77 69 74 68 20 53  **        with S
2bd30 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2bd40 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2e 0a 20 20  PTIMIZATIONS..  
2bd50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    **.    ** TODO
2bd60 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65  : Are there othe
2bd70 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65  r reasons beside
2bd80 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f   (1) to use a co
2bd90 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20  -routine.    ** 
2bda0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a  implementation?.
2bdb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
2bdc0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61  ==0.     && (pTa
2bdd0 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20  bList->nSrc==1. 
2bde0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
2bdf0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67  TabList->a[1].fg
2be00 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45  .jointype&(JT_LE
2be10 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
2be20 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20  )  /* (1) */.   
2be30 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67    && (p->selFlag
2be40 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 20 20  s & SF_All)==0  
2be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be70 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
2be80 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2be90 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2bea0 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29  E_SubqCoroutine)
2beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bec0 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 29 7b 0a  * (3) */.    ){.
2bed0 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65        /* Impleme
2bee0 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  nt a co-routine 
2bef0 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e  that will return
2bf00 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2bf10 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2bf20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68    ** set on each
2bf30 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
2bf40 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
2bf50 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
2bf60 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2bf70 28 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74  (v)+1;.      pIt
2bf80 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2bf90 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2bfa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2bfb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
2bfc0 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  itCoroutine, pIt
2bfd0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30  em->regReturn, 0
2bfe0 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
2bff0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2c000 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  , "%s", pItem->p
2c010 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2c020 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
2c030 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
2c040 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2c050 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
2c060 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
2c070 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2c080 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70  turn);.      exp
2c090 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2c0a0 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
2c0b0 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
2c0c0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
2c0d0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2c0e0 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
2c0f0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
2c100 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
2c110 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65  gEst = pSub->nSe
2c120 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70  lectRow;.      p
2c130 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2c140 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  utine = 1;.     
2c150 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c   pItem->regResul
2c160 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
2c170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c180 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
2c190 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2c1a0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
2c1b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2c1c0 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20   addrTop-1);.   
2c1d0 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
2c1e0 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
2c1f0 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
2c200 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2c210 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
2c220 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e  hat will fill an
2c230 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2c240 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74   with.      ** t
2c250 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2c260 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49  is subquery.  pI
2c270 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2c280 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20   will point.    
2c290 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72    ** to the addr
2c2a0 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ess of the gener
2c2b0 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e  ated subroutine.
2c2c0 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2c2d0 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  rn.      ** is a
2c2e0 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
2c2f0 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2c300 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
2c310 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20  n address.      
2c320 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70  */.      int top
2c330 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Addr;.      int 
2c340 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  onceAddr = 0;.  
2c350 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b      int retAddr;
2c360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2c370 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2c380 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49  b==0 );.      pI
2c390 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
2c3a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2c3b0 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d  .      topAddr =
2c3c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c3d0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2c3e0 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  , 0, pItem->regR
2c3f0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49  eturn);.      pI
2c400 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2c410 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20   = topAddr+1;.  
2c420 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
2c430 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d  g.isCorrelated==
2c440 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2c450 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
2c460 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
2c470 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
2c480 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
2c490 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
2c4a0 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  er, then we only
2c4b0 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
2c4c0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2c4d0 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20  e subquery.     
2c4e0 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20     ** once. */. 
2c4f0 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20         onceAddr 
2c500 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
2c510 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
2c520 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2c530 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c540 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
2c550 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
2c560 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2c570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c580 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
2c590 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
2c5a0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
2c5b0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2c5c0 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
2c5d0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2c5e0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2c5f0 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
2c600 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2c610 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2c620 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2c630 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2c640 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2c650 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
2c660 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
2c670 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
2c680 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
2c690 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
2c6a0 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
2c6b0 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41  .      if( onceA
2c6c0 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  ddr ) sqlite3Vdb
2c6d0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63  eJumpHere(v, onc
2c6e0 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65  eAddr);.      re
2c6f0 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
2c700 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2c710 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72  Return, pItem->r
2c720 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2c730 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2c740 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d   "end %s", pItem
2c750 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2c760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c770 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f  beChangeP1(v, to
2c780 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b  pAddr, retAddr);
2c790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
2c7a0 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
2c7b0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
2c7c0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2c7d0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2c7e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70  elect_end;.    p
2c7f0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
2c800 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
2c810 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
2c820 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56  }.#endif..  /* V
2c830 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20  arious elements 
2c840 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f  of the SELECT co
2c850 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20  pied into local 
2c860 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20  variables for.  
2c870 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a  ** convenience *
2c880 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
2c890 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65  pEList;.  pWhere
2c8a0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
2c8b0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
2c8c0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
2c8d0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
2c8e0 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
2c8f0 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
2c900 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
2c910 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  !=0;..#if SELECT
2c920 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2c930 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2c940 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
2c950 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2c960 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
2c970 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f  ,("After all FRO
2c980 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69  M-clause analysi
2c990 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  s:\n"));.    sql
2c9a0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2c9b0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2c9c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2c9d0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
2c9e0 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
2c9f0 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
2ca00 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
2ca10 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
2ca20 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
2ca30 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2ca40 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
2ca50 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
2ca60 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
2ca70 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
2ca80 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
2ca90 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
2caa0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2cab0 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
2cac0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
2cad0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
2cae0 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
2caf0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2cb00 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
2cb10 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
2cb20 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2cb30 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
2cb40 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
2cb50 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
2cb60 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
2cb70 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
2cb80 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
2cb90 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
2cba0 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
2cbb0 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
2cbc0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
2cbd0 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
2cbe0 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
2cbf0 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
2cc00 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
2cc10 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
2cc20 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
2cc30 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
2cc40 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
2cc50 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
2cc60 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
2cc70 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
2cc80 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
2cc90 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
2cca0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
2ccb0 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
2ccc0 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
2ccd0 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
2cce0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2ccf0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2cd00 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
2cd10 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
2cd20 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2cd30 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
2cd40 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
2cd50 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
2cd60 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
2cd70 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
2cd80 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
2cd90 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
2cda0 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
2cdb0 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
2cdc0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
2cdd0 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
2cde0 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
2cdf0 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
2ce00 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
2ce10 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
2ce20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
2ce30 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2ce40 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
2ce50 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2ce60 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2ce70 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
2ce80 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
2ce90 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2cea0 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
2ceb0 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
2cec0 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
2ced0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2cee0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2cef0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2cf00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2cf10 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
2cf20 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
2cf30 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
2cf40 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
2cf50 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
2cf60 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
2cf70 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
2cf80 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
2cf90 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
2cfa0 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
2cfb0 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
2cfc0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
2cfd0 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
2cfe0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2cff0 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
2d000 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
2d010 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
2d020 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
2d030 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
2d040 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
2d050 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2d060 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
2d070 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
2d080 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
2d090 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
2d0a0 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
2d0b0 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
2d0c0 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
2d0d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2d0e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2d0f0 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
2d100 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2d110 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
2d120 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
2d130 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
2d140 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
2d150 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
2d160 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
2d170 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
2d180 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d190 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2d1a0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
2d1b0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
2d1c0 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
2d1d0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
2d1e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
2d1f0 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
2d200 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2d210 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
2d220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
2d230 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2d240 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
2d250 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
2d260 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
2d270 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2d280 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
2d290 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
2d2a0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d2b0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
2d2c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d2d0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
2d2e0 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
2d2f0 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
2d300 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
2d310 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
2d320 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
2d330 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2d340 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53  abel(v);.  p->nS
2d350 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20  electRow = 320; 
2d360 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f   /* 4 billion ro
2d370 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  ws */.  computeL
2d380 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
2d390 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
2d3a0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
2d3b0 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
2d3c0 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
2d3d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2d3e0 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
2d3f0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2d400 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
2d410 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
2d420 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
2d430 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
2d440 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
2d450 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
2d460 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
2d470 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
2d480 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
2d490 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2d4a0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
2d4b0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
2d4c0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2d4d0 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
2d4e0 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
2d4f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2d500 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d520 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
2d530 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
2d540 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d560 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
2d570 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2d580 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
2d590 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
2d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5b0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2d5c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2d5d0 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
2d5e0 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
2d5f0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2d600 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
2d610 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
2d620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
2d630 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2d640 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2d650 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
2d660 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
2d670 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
2d680 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
2d690 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
2d6a0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
2d6b0 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
2d6c0 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
2d6d0 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
2d6e0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
2d6f0 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
2d700 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  ( WHERE_USE_LIMI
2d710 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  T==SF_FixedLimit
2d720 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   );.    wctrlFla
2d730 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  gs |= p->selFlag
2d740 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
2d750 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  t;..    /* Begin
2d760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2d770 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66  an. */.    pWInf
2d780 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2d790 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2d7a0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2d7b0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a  sSort.pOrderBy,.
2d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d7e0 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46  ->pEList, wctrlF
2d7f0 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74  lags, p->nSelect
2d800 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Row);.    if( pW
2d810 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2d820 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
2d830 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
2d840 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
2d850 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
2d860 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
2d870 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
2d880 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
2d890 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
2d8a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d8b0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2d8c0 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
2d8d0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
2d8e0 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
2d8f0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2d900 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2d910 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2d920 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d930 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2d940 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
2d950 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
2d960 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2d970 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f  Info);.      sSo
2d980 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  rt.bOrderedInner
2d990 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68  Loop = sqlite3Wh
2d9a0 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ereOrderedInnerL
2d9b0 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  oop(pWInfo);.   
2d9c0 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
2d9d0 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
2d9e0 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
2d9f0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2da00 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2da10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2da20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
2da30 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
2da40 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
2da50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
2da60 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
2da70 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
2da80 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
2da90 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
2daa0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
2dab0 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
2dac0 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
2dad0 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
2dae0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
2daf0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
2db00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2db10 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
2db20 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
2db30 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
2db40 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
2db50 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
2db60 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c  loop. */.    sel
2db70 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2db80 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
2db90 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
2dba0 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
2dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbc0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
2dbd0 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
2dbe0 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
2dbf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2dc00 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
2dc10 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
2dc20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
2dc30 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
2dc40 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2dc50 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2dc60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2dc70 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
2dc80 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
2dc90 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2dca0 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
2dcb0 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
2dcc0 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
2dcd0 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
2dce0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
2dcf0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
2dd00 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
2dd10 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
2dd20 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
2dd30 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
2dd40 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
2dd50 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
2dd60 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
2dd70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
2dd80 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
2dd90 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
2dda0 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
2ddb0 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
2ddc0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
2ddd0 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
2dde0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2ddf0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
2de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de10 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
2de20 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
2de30 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
2de40 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
2de50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
2de60 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
2de70 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
2de80 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
2de90 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
2dea0 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
2deb0 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
2dec0 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
2ded0 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
2dee0 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
2def0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
2df00 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
2df10 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
2df20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
2df30 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
2df40 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
2df50 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
2df60 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
2df70 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
2df80 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
2df90 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
2dfa0 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
2dfb0 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
2dfc0 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
2dfd0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
2dfe0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
2dff0 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
2e000 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
2e010 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
2e020 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
2e030 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
2e040 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
2e050 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
2e060 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
2e070 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
2e080 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2e090 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
2e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e0b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2e0c0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
2e0d0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2e0e0 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
2e0f0 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
2e100 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
2e110 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
2e120 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
2e130 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
2e140 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
2e150 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2e160 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
2e170 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
2e180 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
2e190 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
2e1a0 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
2e1b0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2e1c0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2e1d0 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2e1e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e1f0 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69  assert( 66==sqli
2e200 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
2e210 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
2e220 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70  SelectRow>66 ) p
2e230 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36  ->nSelectRow = 6
2e240 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
2e250 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
2e260 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
2e270 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  );.      p->nSel
2e280 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
2e290 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
2e2a0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
2e2b0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
2e2c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
2e2d0 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
2e2e0 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
2e2f0 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
2e300 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
2e310 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2e320 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
2e330 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
2e340 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
2e350 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
2e360 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
2e370 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
2e380 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
2e390 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
2e3a0 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
2e3b0 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
2e3c0 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
2e3d0 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
2e3e0 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
2e3f0 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
2e400 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
2e410 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
2e420 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
2e430 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
2e440 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
2e450 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
2e460 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
2e470 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
2e480 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
2e490 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
2e4a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
2e4b0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2e4c0 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
2e4d0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
2e4e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
2e4f0 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
2e500 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
2e510 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
2e520 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
2e530 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
2e540 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
2e550 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
2e560 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2e570 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
2e580 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2e590 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
2e5a0 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
2e5b0 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
2e5c0 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
2e5d0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2e5e0 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
2e5f0 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
2e600 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2e610 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2e620 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
2e630 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
2e640 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
2e650 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
2e660 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
2e670 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
2e680 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
2e690 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ;.    sAggInfo.m
2e6a0 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
2e6b0 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
2e6c0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2e6d0 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
2e6e0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
2e6f0 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
2e700 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
2e710 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
2e720 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2e730 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
2e740 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
2e750 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2e760 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
2e770 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
2e780 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
2e790 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2e7a0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
2e7b0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
2e7c0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2e7d0 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
2e7e0 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
2e7f0 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
2e800 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
2e810 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
2e820 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2e830 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
2e840 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
2e850 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2e860 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
2e870 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
2e880 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
2e890 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2e8a0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
2e8b0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
2e8c0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
2e8d0 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
2e8e0 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
2e8f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2e900 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
2e910 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
2e920 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2e930 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2e940 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
2e950 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
2e960 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
2e970 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
2e980 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
2e990 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
2e9a0 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
2e9b0 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
2e9c0 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
2e9d0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2e9e0 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
2e9f0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
2ea00 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
2ea10 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
2ea20 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  p by clause */. 
2ea30 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20       int addr1; 
2ea40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73           /* A-vs
2ea50 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a  -B comparision j
2ea60 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ump */.      int
2ea70 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
2ea80 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
2ea90 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
2eaa0 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
2eab0 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  w */.      int r
2eac0 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f  egOutputRow;   /
2ead0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
2eae0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
2eaf0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
2eb00 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2eb10 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20  rSetAbort;   /* 
2eb20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
2eb30 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
2eb40 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2eb50 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f  opOfLoop;  /* To
2eb60 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
2eb70 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  oop */.      int
2eb80 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
2eb90 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
2eba0 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
2ebb0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
2ebc0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2ebd0 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  Reset;      /* S
2ebe0 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
2ebf0 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
2ec00 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  mulator */.     
2ec10 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
2ec20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
2ec30 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
2ec40 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
2ec50 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tine */..      /
2ec60 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
2ec70 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
2ec80 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
2ec90 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
2eca0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
2ecb0 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
2ecc0 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
2ecd0 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
2ece0 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
2ecf0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
2ed00 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
2ed10 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72   all, the OP_Sor
2ed20 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74  terOpen instruct
2ed30 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
2ed40 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
2ed50 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
2ed60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
2ed70 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2ed80 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2ed90 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
2eda0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
2edb0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2edc0 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67  pGroupBy, 0, sAg
2edd0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a  gInfo.nColumn);.
2ede0 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
2edf0 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
2ee00 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
2ee10 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
2ee20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2ee30 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
2ee40 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2ee50 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
2ee60 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
2ee70 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2ee80 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
2ee90 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
2eea0 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
2eeb0 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
2eec0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
2eed0 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
2eee0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2eef0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
2ef00 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
2ef10 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
2ef20 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
2ef30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ef40 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2ef50 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
2ef60 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2ef70 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
2ef80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ef90 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
2efa0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2efb0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
2efc0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
2efd0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2efe0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2eff0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2f000 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
2f010 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2f020 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2f030 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2f040 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
2f050 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f060 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2f070 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
2f080 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2f090 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
2f0a0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2f0b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f0c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2f0d0 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
2f0e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2f0f0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
2f100 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
2f110 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2f120 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2f130 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
2f140 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
2f150 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
2f160 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
2f170 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
2f180 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
2f190 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
2f1a0 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
2f1b0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
2f1c0 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
2f1d0 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
2f1e0 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
2f1f0 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
2f200 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
2f210 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
2f220 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
2f230 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
2f240 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
2f250 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
2f260 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
2f270 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2f280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f290 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2f2a0 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2f2b0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
2f2c0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2f2d0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2f2e0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
2f2f0 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
2f300 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
2f310 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70  BY | (orderByGrp
2f320 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   ? WHERE_SORTBYG
2f330 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20  ROUP : 0), 0.   
2f340 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
2f350 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2f360 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2f370 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2f380 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2f390 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e  nfo)==pGroupBy->
2f3a0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2f3b0 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
2f3c0 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
2f3d0 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
2f3e0 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
2f3f0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
2f400 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
2f410 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
2f420 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2f430 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
2f440 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
2f450 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
2f460 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
2f470 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
2f480 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
2f490 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
2f4a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f4b0 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
2f4c0 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
2f4d0 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
2f4e0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
2f4f0 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
2f500 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
2f510 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
2f520 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
2f530 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
2f540 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
2f550 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2f560 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
2f570 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
2f580 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
2f590 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
2f5a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2f5b0 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2f5c0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
2f5d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
2f5e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
2f5f0 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
2f600 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2f610 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
2f620 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
2f630 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
2f640 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
2f650 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
2f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f670 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
2f680 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
2f690 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2f6a0 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
2f6b0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
2f6c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2f6d0 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b  nCol = nGroupBy;
2f6e0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2f6f0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
2f700 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2f710 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2f720 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2f730 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
2f740 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
2f750 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2f760 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
2f770 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2f780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2f790 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
2f7a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2f7b0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
2f7c0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2f7d0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2f7e0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2f7f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2f800 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
2f810 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
2f820 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  gBase, 0, 0);.  
2f830 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
2f840 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
2f850 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
2f860 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2f870 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2f880 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2f890 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
2f8a0 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
2f8b0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
2f8c0 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
2f8d0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
2f8e0 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
2f8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2f900 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
2f910 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73  olumnToReg(pPars
2f920 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f940 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
2f950 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
2f960 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b  ol->iTable, r1);
2f970 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
2f980 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f9a0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
2f9b0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2f9c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2f9d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2f9e0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
2f9f0 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
2fa00 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
2fa10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fa20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
2fa30 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67  rterInsert, sAgg
2fa40 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2fa50 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2fa60 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
2fa70 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
2fa80 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
2fa90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2faa0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
2fab0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
2fac0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2fad0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2fae0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2faf0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2fb00 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54  IdxPTab = sortPT
2fb10 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
2fb20 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72  b++;.        sor
2fb30 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65  tOut = sqlite3Ge
2fb40 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2fb50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fb60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2fb70 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f  P_OpenPseudo, so
2fb80 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c  rtPTab, sortOut,
2fb90 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
2fba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fbb0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
2fbc0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
2fbd0 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
2fbe0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2fbf0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55  omment((v, "GROU
2fc00 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64  P BY sort")); Vd
2fc10 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2fc20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2fc30 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
2fc40 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
2fc50 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2fc60 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
2fc70 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
2fc80 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d  the index or tem
2fc90 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65  porary table use
2fca0 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42  d by the GROUP B
2fcb0 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20  Y sort.      ** 
2fcc0 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64  will naturally d
2fcd0 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74  eliver rows in t
2fce0 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65  he order require
2fcf0 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42  d by the ORDER B
2fd00 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  Y.      ** claus
2fd10 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70  e, cancel the ep
2fd20 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70  hemeral table op
2fd30 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  en coded earlier
2fd40 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2fd50 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   ** This is an o
2fd60 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68  ptimization - th
2fd70 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
2fd80 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72   should result r
2fd90 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20  egardless..     
2fda0 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49   ** Use the SQLI
2fdb0 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20  TE_GroupByOrder 
2fdc0 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45  flag with SQLITE
2fdd0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
2fde0 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ZER to .      **
2fdf0 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70   disable this op
2fe00 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
2fe10 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
2fe20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
2fe30 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74  rderByGrp && Opt
2fe40 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
2fe50 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75  (db, SQLITE_Grou
2fe60 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20  pByOrder) .     
2fe70 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72    && (groupBySor
2fe80 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72  t || sqlite3Wher
2fe90 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f  eIsSorted(pWInfo
2fea0 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  )).      ){.    
2feb0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
2fec0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  By = 0;.        
2fed0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2fee0 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
2fef0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
2ff00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2ff10 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
2ff20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2ff30 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
2ff40 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
2ff50 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
2ff60 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
2ff70 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
2ff80 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
2ff90 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
2ffa0 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
2ffb0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
2ffc0 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
2ffd0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
2ffe0 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
2fff0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
30000 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
30010 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
30020 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
30030 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
30040 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
30050 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
30060 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
30070 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
30080 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72  e);.      if( gr
30090 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
300a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
300b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
300c0 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66  terData, sAggInf
300d0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  o.sortingIdx,.  
300e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300f0 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c          sortOut,
30100 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20   sortPTab);.    
30110 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
30120 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
30130 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
30140 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
30150 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
30160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30170 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
30180 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42   sortPTab, j, iB
30190 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
301a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
301b0 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
301c0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
301d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
301e0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
301f0 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
30200 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
30210 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30230 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
30240 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
30250 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
30260 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
30270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
30280 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
30290 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
302a0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
302b0 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
302c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
302d0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
302e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
302f0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
30300 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29  1+1, 0, addr1+1)
30310 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
30320 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
30330 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
30340 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
30350 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
30360 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
30370 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
30380 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
30390 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
303a0 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
303b0 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
303c0 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
303d0 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
303e0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
303f0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
30400 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
30410 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
30420 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
30430 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
30440 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
30450 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
30460 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
30470 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
30480 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
30490 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
304a0 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
304b0 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
304c0 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
304d0 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
304e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
304f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
30500 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
30510 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
30520 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
30530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30540 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
30550 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
30560 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
30570 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
30580 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
30590 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
305a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
305b0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
305c0 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
305d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
305e0 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
305f0 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
30600 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
30610 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30620 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
30630 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
30640 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
30650 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
30660 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
30670 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
30680 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
30690 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
306a0 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
306b0 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
306c0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
306d0 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
306e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
306f0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
30700 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
30710 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
30720 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
30730 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30740 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
30750 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61  eger, 1, iUseFla
30760 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
30770 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
30780 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
30790 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
307a0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
307b0 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
307c0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
307d0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
307e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
307f0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
30800 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
30810 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
30820 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  OfLoop);.       
30830 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
30840 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
30860 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
30870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30880 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
30890 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
308a0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
308b0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
308c0 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
308d0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
308e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
308f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
30900 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
30910 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
30920 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
30930 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
30940 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
30950 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
30960 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
30970 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30980 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
30990 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  v, addrEnd);..  
309a0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
309b0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
309c0 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
309d0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
309e0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
309f0 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
30a00 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
30a10 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
30a20 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
30a30 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
30a40 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
30a50 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
30a60 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
30a70 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
30a80 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
30a90 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
30aa0 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
30ab0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
30ac0 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
30ad0 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
30ae0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
30af0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
30b00 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
30b10 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
30b20 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
30b30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
30b40 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
30b50 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
30b60 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
30b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30b80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
30b90 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
30ba0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
30bb0 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
30bc0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
30bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30be0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
30bf0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
30c00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30c10 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
30c20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
30c30 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
30c40 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
30c50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
30c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30c70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
30c80 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
30c90 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
30ca0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
30cb0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
30cc0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
30cd0 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
30ce0 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
30cf0 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
30d00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
30d10 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
30d20 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
30d30 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
30d40 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
30d50 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
30d60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
30d70 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
30d80 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
30d90 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
30da0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
30db0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
30dc0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
30dd0 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f  pEList, -1, &sSo
30de0 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
30df0 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74            &sDist
30e00 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
30e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
30e30 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
30e40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30e50 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30e60 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
30e70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
30e80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
30e90 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
30ea0 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
30eb0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
30ec0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
30ed0 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
30ee0 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
30ef0 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
30f00 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
30f10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
30f20 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  v, addrReset);. 
30f30 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
30f40 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
30f50 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
30f60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30f70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
30f80 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20  regReset);.     
30f90 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
30fa0 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e  pGroupBy.  Begin
30fb0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
30fc0 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50  es without GROUP
30fd0 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65   BY: */.    else
30fe0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
30ff0 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66  t *pDel = 0;.#if
31000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31010 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
31020 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
31030 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d       if( (pTab =
31040 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70   isSimpleCount(p
31050 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30  , &sAggInfo))!=0
31060 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
31070 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  f isSimpleCount(
31080 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  ) returns a poin
31090 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73  ter to a Table s
310a0 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20  tructure, then. 
310b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
310c0 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  L statement is o
310d0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20  f the form:.    
310e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
310f0 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
31100 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20  (*) FROM <tbl>. 
31110 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31120 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54    ** where the T
31130 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72  able structure r
31140 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e  eturned represen
31150 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a  ts table <tbl>..
31160 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31170 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65     ** This state
31180 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f  ment is so commo
31190 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74  n that it is opt
311a0 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79  imized specially
311b0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
311c0 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75   OP_Count instru
311d0 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65  ction is execute
311e0 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20  d either on the 
311f0 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61  intkey table tha
31200 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
31210 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66  tains the data f
31220 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f  or table <tbl> o
31230 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20  r on one of its 
31240 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20  indexes. It.    
31250 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72      ** is better
31260 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
31270 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20  op on an index, 
31280 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  as indexes are a
31290 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  lmost.        **
312a0 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61   always spread a
312b0 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73  cross less pages
312c0 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72   than their corr
312d0 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73  esponding tables
312e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
312f0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
31300 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
31310 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
31320 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
31330 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ema);.        co
31340 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70  nst int iCsr = p
31350 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
31360 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
31370 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20  scan b-tree */. 
31380 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
31390 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
313a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
313b0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
313c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49   */.        KeyI
313d0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
313e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
313f0 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
31400 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f  scanned index */
31410 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
31420 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31440 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e   Best index foun
31450 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
31460 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
31470 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20  pTab->tnum;     
31480 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
31490 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64   page of scanned
314a0 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
314b0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
314c0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
314d0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
314e0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
314f0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
31500 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
31510 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
31520 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
31530 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68  for the index th
31540 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73  at has the lowes
31550 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20  t scan cost..   
31560 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31570 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20  ** (2011-04-15) 
31580 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c  Do not do a full
31590 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72   scan of an unor
315a0 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20  dered index..   
315b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
315c0 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20  ** (2013-10-03) 
315d0 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65  Do not count the
315e0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61   entries in a pa
315f0 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20  rtial index..   
31600 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31610 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74  ** In practice t
31620 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
31630 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ture will not be
31640 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c   used. It is onl
31650 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  y .        ** pa
31660 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f  ssed to keep OP_
31670 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a  OpenRead happy..
31680 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31690 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
316a0 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d  (pTab) ) pBest =
316b0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
316c0 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
316d0 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
316e0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
316f0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
31700 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
31710 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
31720 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
31730 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49      && pIdx->szI
31740 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
31750 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20  bRow.           
31760 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  && pIdx->pPartId
31770 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20  xWhere==0.      
31780 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20       && (!pBest 
31790 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  || pIdx->szIdxRo
317a0 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f  w<pBest->szIdxRo
317b0 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  w).          ){.
317c0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
317d0 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
317e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
317f0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
31800 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
31810 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
31820 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
31830 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
31840 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
31850 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
31860 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
31870 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
31880 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
31890 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
318a0 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
318b0 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
318c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
318d0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
318e0 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
318f0 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  t, iDb, 1);.    
31900 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
31910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
31920 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
31930 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
31940 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
31950 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
31960 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
31970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
31980 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
31990 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
319a0 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
319b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
319c0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
319d0 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
319e0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
319f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
31a00 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
31a10 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
31a20 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
31a30 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
31a40 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
31a50 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
31a60 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
31a70 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
31a80 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31a90 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
31aa0 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
31ab0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
31ac0 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
31ad0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
31ae0 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
31af0 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
31b00 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
31b10 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
31b20 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
31b30 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
31b40 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
31b50 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
31b60 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
31b70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
31b80 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
31b90 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
31ba0 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
31bb0 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
31bc0 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
31bd0 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
31be0 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
31bf0 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
31c00 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
31c10 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
31c20 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
31c30 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
31c40 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
31c50 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
31c60 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
31c70 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
31c80 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
31c90 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
31ca0 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
31cb0 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
31cc0 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
31cd0 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
31ce0 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
31cf0 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
31d00 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
31d10 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
31d20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
31d30 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  havior as follow
31d40 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
31d50 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
31d60 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
31d70 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
31d80 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
31d90 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
31da0 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
31db0 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
31dc0 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
31dd0 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
31de0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
31df0 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
31e00 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
31e10 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
31e20 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
31e30 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
31e40 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
31e50 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
31e60 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
31e70 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
31e80 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
31e90 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
31ea0 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
31eb0 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
31ec0 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
31ed0 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
31ee0 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
31ef0 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
31f00 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
31f10 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
31f20 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
31f30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
31f40 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
31f50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
31f60 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52   flag = WHERE_OR
31f70 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
31f80 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61        .        a
31f90 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
31fa0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
31fb0 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
31fc0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
31fd0 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b  p->pHaving==0 ){
31fe0 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  .          flag 
31ff0 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73  = minMaxQuery(&s
32000 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61  AggInfo, &pMinMa
32010 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
32020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
32030 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61  ag==0 || (pMinMa
32040 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d  x!=0 && pMinMax-
32050 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20  >nExpr==1) );.. 
32060 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
32070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
32080 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
32090 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
320a0 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  inMax, 0);.     
320b0 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
320c0 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Max;.          a
320d0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
320e0 63 46 61 69 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d  cFailed || pMinM
320f0 61 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ax!=0 );.       
32100 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
32110 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
32120 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
32130 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
32140 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52  = flag!=WHERE_OR
32150 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a  DERBY_MIN ?1:0;.
32160 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
32170 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
32180 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
32190 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
321a0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
321b0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
321c0 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
321d0 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
321e0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
321f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
32200 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
32210 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
32220 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
32230 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
32240 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
32250 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32260 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
32270 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
32280 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Info);.        p
32290 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
322a0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
322b0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
322c0 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c  re, pMinMax,0,fl
322d0 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ag,0);.        i
322e0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
322f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32300 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
32310 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
32320 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
32330 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
32340 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
32350 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
32360 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
32370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
32380 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e  inMax==0 || pMin
32390 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  Max->nExpr==1 );
323a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
323b0 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
323c0 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a  ed(pWInfo)>0 ){.
323d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
323e0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c  3VdbeGoto(v, sql
323f0 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
32400 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20  bel(pWInfo));.  
32410 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
32420 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
32430 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
32440 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
32450 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
32460 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
32470 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32480 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
32490 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
324a0 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
324b0 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
324c0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
324d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f      }..      sSo
324e0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
324f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
32500 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
32510 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
32520 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
32530 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
32540 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
32550 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
32560 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20  st, -1, 0, 0, . 
32570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32580 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
32590 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
325a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
325b0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
325c0 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
325d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
325e0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
325f0 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
32600 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
32610 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
32620 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
32630 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
32640 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
32650 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
32660 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
32670 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
32680 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
32690 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
326a0 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
326b0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
326c0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
326d0 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
326e0 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
326f0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
32700 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
32710 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
32720 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
32730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32740 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
32750 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
32760 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
32770 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
32780 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
32790 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
327a0 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
327b0 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
327c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
327d0 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
327e0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
327f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
32800 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
32810 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
32820 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
32830 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
32840 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
32850 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
32860 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
32870 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
32880 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
32890 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
328a0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
328b0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
328c0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
328d0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
328e0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
328f0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
32900 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
32910 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
32920 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
32930 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
32940 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
32950 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
32960 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
32970 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
32980 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
32990 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
329a0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
329b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
329c0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
329d0 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
329e0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
329f0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
32a00 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
32a10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
32a20 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
32a30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
32a40 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
32a50 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45  aFunc);.#if SELE
32a60 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
32a70 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
32a80 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70  pParse,p,("end p
32a90 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
32aa0 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
32ab0 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
32ac0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
32ad0 0a                                               .