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

Artifact c1e669e01cb37c0683108a10e929615112572666053381df786806113b9a3ac4:


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 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
1000: 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
1010: 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53  e->db,TK_ASTERIS
1020: 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  K,0));.  }.  pNe
1030: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  w->pEList = pELi
1040: 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  st;.  pNew->op =
1050: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e   TK_SELECT;.  pN
1060: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73  ew->selFlags = s
1070: 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  elFlags;.  pNew-
1080: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
1090: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
10a0: 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
10b0: 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65 77  E_ENABLED.  pNew
10c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20  ->zSelName[0] = 
10d0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65 77  0;.#endif.  pNew
10e0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
10f0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1100: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
1110: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  = -1;.  pNew->nS
1120: 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
1130: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1140: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1150: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
1160: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72  >db, sizeof(*pSr
1170: 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  c));.  pNew->pSr
1180: 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77  c = pSrc;.  pNew
1190: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
11a0: 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  e;.  pNew->pGrou
11b0: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
11c0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
11d0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65  = pHaving;.  pNe
11e0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  w->pOrderBy = pO
11f0: 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  rderBy;.  pNew->
1200: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  pPrior = 0;.  pN
1210: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
1220: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
1230: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
1240: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1250: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  t;.  pNew->pWith
1260: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1270: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
1280: 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  imit!=0 || pPars
1290: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 50 61  e->nErr>0 || pPa
12a0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
12b0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
12c0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
12d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
12e0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
12f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
1300: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29   pNew!=&standin)
1310: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1330: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
1340: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
1350: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
1360: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
1370: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
1380: 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45   pNew;.}..#if SE
1390: 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
13a0: 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  D./*.** Set the 
13b0: 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74  name of a Select
13c0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
13d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
13e0: 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20  Name(Select *p, 
13f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1400: 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a  e){.  if( p && z
1410: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1420: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1430: 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29  eof(p->zSelName)
1440: 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22  , p->zSelName, "
1450: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
1460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1470: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
1480: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
1490: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
14a0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
14b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
14d0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
14e0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
14f0: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
1500: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
1510: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1520: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
1530: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
1540: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
1550: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1560: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1570: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1580: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1590: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
15a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
15b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
15c0: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
15d0: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
15e0: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
15f0: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
1600: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
1610: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
1620: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
1630: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
1640: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1660: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1670: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1680: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1690: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
16a0: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
16b0: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
16c0: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
16d0: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
16e0: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
16f0: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
1700: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
1710: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
1720: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
1730: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
1740: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
1750: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1760: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1770: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1780: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1790: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17a0: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
17b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
17c0: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
17d0: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
17e0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
17f0: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
1800: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1830: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
1840: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1850: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1860: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1870: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1880: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1890: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
18a0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
18b0: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
18c0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
18d0: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
18e0: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
18f0: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
1900: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
1910: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
1920: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
1930: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
1940: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
1950: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1960: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1970: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1980: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
19a0: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
19b0: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
19c0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
19e0: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
19f0: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a10: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
1a20: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
1a30: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
1a50: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1a60: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1a70: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1a80: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1a90: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1ac0: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1ae0: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1af0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
1b00: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
1b10: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
1b20: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
1b30: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
1b40: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1b50: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1b60: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1b70: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1b80: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1b90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1ba0: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1bb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1bc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1bd0: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1be0: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1bf0: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1c10: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1c20: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c40: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1c50: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1c60: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1c70: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1c80: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1c90: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1ca0: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1cb0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1cc0: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1cd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ce0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1cf0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1d00: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1d10: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1d20: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1d30: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1d40: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1d50: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1d60: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1d70: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1d80: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1d90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1da0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1db0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1dc0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1dd0: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1de0: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1df0: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1e00: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1e10: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1e20: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1e30: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1e40: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1e50: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1e60: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1e90: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1ea0: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1eb0: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1ec0: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1ed0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1ee0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1ef0: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1f00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1f10: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1f20: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1f30: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1f40: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1f50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1f60: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1f70: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1f80: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1f90: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1fa0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1fb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1fc0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1fe0: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1ff0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
2000: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
2010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
2020: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2030: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
2040: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
2050: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
2060: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
2070: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
2080: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
2090: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
20a0: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
20b0: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
20c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
20d0: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
20e0: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
20f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
2100: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
2110: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
2120: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
2130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
2140: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2150: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2160: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2170: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2180: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2190: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
21a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
21b0: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
21c0: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
21d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
21e0: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
21f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
2200: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
2210: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2230: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
2240: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
2250: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2260: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2270: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2280: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2290: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
22a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22c0: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22d0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
22e0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
22f0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2300: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
2310: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
2320: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
2330: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
2340: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
2350: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2360: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2370: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2380: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2390: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
23a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
23b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
23c0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
23d0: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
23e0: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
23f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2400: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2430: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2440: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
2450: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2460: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2470: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2480: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2490: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
24a0: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
24b0: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
24c0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
24d0: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
24e0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
24f0: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
2500: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
2510: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
2520: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
2530: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
2540: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
2550: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2560: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2570: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2580: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2590: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
25a0: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
25b0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
25c0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
25d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2600: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2610: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2630: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
2640: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2650: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2680: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2690: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
26a0: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
26d0: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2710: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
2720: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2730: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
2740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2750: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2760: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2770: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2780: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
27b0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
27c0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
27d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
27e0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
27f0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
2800: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2810: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2820: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
2830: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
2840: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
2850: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2870: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2890: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
28a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
28b0: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
28c0: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
28d0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28e0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28f0: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
2900: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
2910: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2920: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
2930: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
2940: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
2950: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2960: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a  _EQ, pE1, pE2);.
2970: 20 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f    if( pEq && isO
2980: 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  uterJoin ){.    
2990: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
29a0: 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  pEq, EP_FromJoin
29b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
29c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29d0: 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  pEq, EP_TokenOnl
29e0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
29f0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2a20: 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  Eq->iRightJoinTa
2a30: 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e  ble = (i16)pE2->
2a40: 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  iTable;.  }.  *p
2a50: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2a60: 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57  ExprAnd(db, *ppW
2a70: 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f  here, pEq);.}../
2a80: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
2a90: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2aa0: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
2ab0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2ac0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
2ad0: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
2ae0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
2af0: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
2b00: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
2b10: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2b20: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
2b30: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
2b40: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
2b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
2b60: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
2b70: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
2b80: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
2b90: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
2ba0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
2bb0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
2bc0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
2bd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2be0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
2bf0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
2c00: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
2c10: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
2c20: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
2c30: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
2c40: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
2c50: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
2c60: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
2c70: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
2c80: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
2c90: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2ca0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
2cb0: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
2cc0: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
2cd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2ce0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
2cf0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2d00: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
2d10: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
2d20: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
2d30: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
2d40: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
2d50: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
2d60: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
2d70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
2d80: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
2d90: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
2da0: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
2db0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
2dc0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
2dd0: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
2de0: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
2df0: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
2e00: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2e10: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
2e20: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
2e30: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
2e40: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
2e50: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
2e60: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
2e70: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
2e80: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
2e90: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
2ea0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2eb0: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
2ec0: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
2ed0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
2ee0: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
2ef0: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
2f00: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
2f10: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
2f20: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
2f30: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
2f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2f50: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
2f60: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
2f70: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
2f80: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2f90: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
2fa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2fb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2fc0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
2fd0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2fe0: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2ff0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
3000: 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52  duce);.    p->iR
3010: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
3020: 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20  (i16)iTable;.   
3030: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3040: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3050: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3060: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3070: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3080: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3090: 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45          setJoinE
30a0: 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  xpr(p->x.pList->
30b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
30c0: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
30d0: 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78   }.    setJoinEx
30e0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
30f0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
3100: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3110: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3120: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3130: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3140: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3150: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3160: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3170: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3180: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3190: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
31a0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
31b0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
31c0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
31d0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
31e0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
31f0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
3200: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3210: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3220: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3230: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3240: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3250: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3260: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3270: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3280: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3290: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
32a0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
32b0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
32c0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
32d0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
32e0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
32f0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
3300: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3310: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3320: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3330: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3340: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3350: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3360: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3370: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3380: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3390: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
33a0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
33b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33c0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
33d0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
33e0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
33f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3420: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3430: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3460: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3470: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3480: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3490: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
34a0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
34b0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
34c0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
34d0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
34e0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
34f0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3500: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3510: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3520: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3530: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3540: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3550: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3560: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
3570: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
3580: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
3590: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
35a0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
35b0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
35c0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
35d0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
35e0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
35f0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3600: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3610: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3620: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3630: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3640: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3650: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3660: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3670: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3680: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3690: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
36a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36b0: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
36c0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
36d0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
36e0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
36f0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3710: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3720: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3730: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3740: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3750: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3760: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3770: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3780: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3790: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
37a0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
37b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
37c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
37d0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
37e0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
37f0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3800: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3810: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3820: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3830: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3840: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3850: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3860: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3870: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3880: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3890: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
38a0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
38b0: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
38c0: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
38d0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
38e0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
38f0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3900: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3930: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3950: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3960: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3970: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3980: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3990: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
39a0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
39b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
39c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
39d0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
39e0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
39f0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3a00: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3a10: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3a20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3a30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
3a40: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
3a50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3a60: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
3a70: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
3a80: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
3a90: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
3aa0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
3ab0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
3ac0: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
3ad0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
3ae0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
3af0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
3b00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
3b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3b20: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
3b30: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
3b40: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
3b50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3b60: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
3b70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3b80: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3b90: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
3ba0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
3bb0: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
3bc0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3bd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
3be0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
3bf0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
3c00: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
3c10: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
3c20: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
3c30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3c40: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
3c50: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
3c60: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
3c70: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
3c80: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
3c90: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
3ca0: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
3cb0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
3cc0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
3cd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
3ce0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3cf0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3d00: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
3d10: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
3d20: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
3d30: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
3d40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
3d60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3d70: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
3d80: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
3d90: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3da0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
3db0: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
3dc0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
3dd0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
3de0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
3df0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e00: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e10: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
3e20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e30: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
3e40: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3e50: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3e60: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
3e70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3e80: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
3ea0: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
3eb0: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
3ec0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
3ed0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
3ee0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
3ef0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3f00: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3f10: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3f20: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
3f30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3f40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3f50: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
3f60: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
3f70: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
3f80: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
3f90: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
3fa0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
3fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fd0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3fe0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3ff0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
4000: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4030: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4050: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
4060: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
4070: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
4080: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
4090: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
40a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
40b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
40c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
40d0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
40e0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
40f0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
4100: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
4110: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
4120: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
4130: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
4140: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
4150: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
4160: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
4170: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
4180: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a  o the end */.);.
4190: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
41a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70  code that will p
41b0: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69  ush the record i
41c0: 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44  n registers regD
41d0: 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72  ata.** through r
41e0: 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f  egData+nData-1 o
41f0: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
4200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4210: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
4220: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4230: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4240: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
4250: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
4260: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4270: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f  tion about the O
4280: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
4290: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
42a0: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
42b0: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
42c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
42d0: 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20  t regData,      
42e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
42f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4300: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
4310: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
4320: 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20  gData,       /* 
4330: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4340: 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f  olding data befo
4350: 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20  re packing */.  
4360: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
4370: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4380: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
4390: 74 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a  the data array *
43a0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
43b0: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
43c0: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
43d0: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
43e0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
43f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4400: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4430: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4440: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
4450: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
4460: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4470: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
4480: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
4490: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
44a0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
44b0: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
44c0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
44d0: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
44e0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
4510: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4520: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
4560: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4570: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
4580: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
45b0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
45c0: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
45d0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
4600: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
4610: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
4640: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
4650: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
4660: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
4690: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
46a0: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
46b0: 53 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Seq==1 );.  asse
46c0: 72 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20  rt( nData==1 || 
46d0: 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67  regData==regOrig
46e0: 44 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44  Data || regOrigD
46f0: 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
4700: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
4710: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
4720: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
4730: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
4740: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70  = regData - nExp
4750: 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73  r - bSeq;.  }els
4760: 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  e{.    regBase =
4770: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
4780: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
4790: 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20  Mem += nBase;.  
47a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  }.  assert( pSel
47b0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20  ect->iOffset==0 
47c0: 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  || pSelect->iLim
47d0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69  it!=0 );.  iLimi
47e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  t = pSelect->iOf
47f0: 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e  fset ? pSelect->
4800: 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c  iOffset+1 : pSel
4810: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70  ect->iLimit;.  p
4820: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20  Sort->labelDone 
4830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4840: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c  eLabel(v);.  sql
4850: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4860: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
4870: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65  rt->pOrderBy, re
4880: 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61  gBase, regOrigDa
4890: 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
48b0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20  LITE_ECEL_DUP | 
48c0: 28 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51  (regOrigData? SQ
48d0: 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20  LITE_ECEL_REF : 
48e0: 30 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  0));.  if( bSeq 
48f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4900: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4910: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4920: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4930: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
4940: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
4950: 30 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a  0 && nData>0 ){.
4960: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4970: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
4980: 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65  regData, regBase
4990: 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61  +nExpr+bSeq, nDa
49a0: 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ta);.  }.  sqlit
49b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
49c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
49d0: 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e  egBase+nOBSat, n
49e0: 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67  Base-nOBSat, reg
49f0: 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e  Record);.  if( n
4a00: 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69  OBSat>0 ){.    i
4a10: 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20  nt regPrevKey;  
4a20: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f   /* The first nO
4a30: 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  BSat columns of 
4a40: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
4a50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4a60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64  First;    /* Add
4a70: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49  ress of the OP_I
4a80: 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  fNot opcode */. 
4a90: 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20     int addrJmp; 
4aa0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4ab0: 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f  of the OP_Jump o
4ac0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62  pcode */.    Vdb
4ad0: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f  eOp *pOp;      /
4ae0: 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70  * Opcode that op
4af0: 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a  ens the sorter *
4b00: 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20  /.    int nKey; 
4b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b20: 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79  r of sorting key
4b30: 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64   columns, includ
4b40: 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  ing OP_Sequence 
4b50: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
4b60: 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  pKI;     /* Orig
4b70: 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20  inal KeyInfo on 
4b80: 74 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65  the sorter table
4b90: 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76   */..    regPrev
4ba0: 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Key = pParse->nM
4bb0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
4bc0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d  ->nMem += pSort-
4bd0: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65  >nOBSat;.    nKe
4be0: 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72  y = nExpr - pSor
4bf0: 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71  t->nOBSat + bSeq
4c00: 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29  ;.    if( bSeq )
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 49 66 4e 6f  ddOp1(v, OP_IfNo
4c40: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  t, regBase+nExpr
4c50: 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ); .    }else{. 
4c60: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
4c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c80: 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p1(v, OP_Sequenc
4c90: 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45  eTest, pSort->iE
4ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
4cb0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4cc0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4cd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4ce0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76  Compare, regPrev
4cf0: 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53  Key, regBase, pS
4d00: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4d10: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
4d20: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
4d30: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
4d40: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
4d50: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4d60: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4d70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79    pOp->p2 = nKey
4d80: 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b   + nData;.    pK
4d90: 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  I = pOp->p4.pKey
4da0: 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Info;.    memset
4db0: 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72  (pKI->aSortOrder
4dc0: 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64  , 0, pKI->nField
4dd0: 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a  ); /* Makes OP_J
4de0: 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62  ump below testab
4df0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
4e00: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4e10: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
4e20: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
4e30: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
4e40: 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a 20 20  >nXField>2 );.  
4e50: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
4e60: 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
4e70: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4e80: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4e90: 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20  , nOBSat,.      
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69 65 6c       pKI->nXFiel
4ed0: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
4ee0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
4ef0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
4f00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f10: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
4f20: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
4f30: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
4f40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4f50: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
4f60: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
4f70: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
4f80: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4f90: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
4fa0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
4fb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4fc0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
4fd0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
4fe0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
4ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5000: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
5010: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
5020: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5030: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
5040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5050: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
5060: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
5070: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
5080: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5090: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
50a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
50b0: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
50c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50d0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
50e0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
50f0: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
5100: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5110: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5120: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
5130: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
5140: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5150: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
5160: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
5170: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
5180: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
5190: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
51b0: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
51c0: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
51d0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
51e0: 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73            regBas
51f0: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
5200: 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69  nOBSat);.  if( i
5210: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
5220: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72   addr;.    int r
5230: 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69  1 = 0;.    /* Fi
5240: 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e  ll the sorter un
5250: 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  til it contains 
5260: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
5270: 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d  ries.  (The iLim
5280: 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  it.    ** regist
5290: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
52a0: 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20  d with value of 
52b0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20  LIMIT+OFFSET.)  
52c0: 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72  After the sorter
52d0: 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70  .    ** fills up
52e0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61  , delete the lea
52f0: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5300: 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63  sorter after eac
5310: 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a  h insert..    **
5320: 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68   Thus we never h
5330: 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  old more than th
5340: 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72  e LIMIT+OFFSET r
5350: 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74  ows in memory at
5360: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64   once */.    add
5370: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
5380: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
5390: 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  tZero, iLimit); 
53a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
53c0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
53d0: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
53e0: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
53f0: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5400: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5410: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
5420: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
5430: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5440: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
5450: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
5460: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
5470: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
5480: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
5490: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
54a0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
54b0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
54c0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
54d0: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
54e0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
54f0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5500: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5510: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
5520: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
5530: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
5540: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
5550: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
5560: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
5570: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
5580: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
5590: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
55a0: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
55b0: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
55c0: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
55d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
55e0: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
55f0: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5600: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5610: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
5620: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
5630: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
5640: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5650: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
5660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5670: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5680: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
5690: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
56a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
56b0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
56c0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
56d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
56e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
56f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5700: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5710: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5720: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
5730: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5740: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5750: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5760: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5770: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5780: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5790: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
57a0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
57b0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
57c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
57d0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
57e0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
57f0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5800: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5810: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5830: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
5840: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
5850: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
5860: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
5870: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
5880: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5890: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
58a0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
58b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
58c0: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
58d0: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
58e0: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
58f0: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5900: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5910: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5920: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
5930: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
5940: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
5950: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
5960: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
5970: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
5980: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5990: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
59a0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
59b0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
59c0: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
59d0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
59e0: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
59f0: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5a00: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5a10: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
5a20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5a30: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
5a40: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5a50: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5a60: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
5a70: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
5a80: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5a90: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5aa0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5ab0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5ac0: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5ad0: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5ae0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5af0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5b00: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5b10: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5b20: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5b30: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5b40: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5b50: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5b60: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5b70: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5b80: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5ba0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5bb0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5bc0: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5bd0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5be0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5bf0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5c00: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c20: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
5c30: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
5c40: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
5c50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5c60: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
5c70: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
5c80: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5c90: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5ca0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5cb0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5cc0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5cd0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5ce0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5cf0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5d00: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
5d10: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
5d20: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
5d30: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
5d40: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
5d50: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
5d60: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72  this row.  If sr
5d70: 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20  cTab is.** zero 
5d80: 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61  or more, then da
5d90: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
5da0: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
5db0: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
5dc0: 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20   .** to get the 
5dd0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
5de0: 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74  s and the collat
5df0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
5e00: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
5e10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
5e20: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
5e30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5e50: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5e60: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
5e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5e80: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
5e90: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
5ea0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
5eb0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
5ec0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5ed0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
5ee0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
5ef0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5f00: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5f10: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5f20: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5f30: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5f40: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5f50: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5f60: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5f70: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5f80: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5f90: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5fa0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5fb0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5fc0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5fd0: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
5fe0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
5ff0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6000: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
6010: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
6020: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
6030: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
6040: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6060: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
6070: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
6080: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
6090: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
60a0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
60b0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
60c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
60d0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
60e0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
60f0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6100: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6110: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6120: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6130: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6140: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6150: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6160: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
6170: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
6180: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
6190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61a0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
61b0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
61c0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
61d0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
61e0: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
61f0: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6200: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6210: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6220: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6230: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6240: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6250: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6260: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
6270: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
6280: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
6290: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
62a0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
62b0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
62c0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
62d0: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
62e0: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
62f0: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6300: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6310: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6320: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6330: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6340: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6350: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6360: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
6370: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
6380: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
6390: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
63a0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
63b0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
63c0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
63d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
63e0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
63f0: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6400: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6410: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
6430: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
6440: 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e  stinct = pDistin
6450: 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e  ct ? pDistinct->
6460: 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52  eTnctType : WHER
6470: 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
6480: 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20  .  if( pSort && 
6490: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d  pSort->pOrderBy=
64a0: 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a  =0 ) pSort = 0;.
64b0: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26    if( pSort==0 &
64c0: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
64d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  {.    assert( iC
64e0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
64f0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6500: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6510: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
6520: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
6530: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
6540: 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  */.  nResultCol 
6550: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
6560: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
6570: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
6580: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
6590: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
65a0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
65b0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
65c0: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
65d0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
65e0: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
65f0: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
6600: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6610: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
6620: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
6630: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
6640: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
6650: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
6660: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
6670: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
6680: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
6690: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
66a0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
66b0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
66c0: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
66d0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
66e0: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
66f0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
6700: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
6710: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
6720: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
6730: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
6740: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
6750: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
6760: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
6770: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
6780: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
6790: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
67a0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
67b0: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
67c0: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
67d0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
67e0: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
67f0: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
6800: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
6810: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6820: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
6830: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
6840: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
6850: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
6860: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
6870: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
6880: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
6890: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
68a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
68b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
68c0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
68d0: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
68e0: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
68f0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
6900: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
6910: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
6920: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6930: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
6940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
6950: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
6960: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
6970: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
6980: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
6990: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
69a0: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
69b0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
69c0: 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67  .    u8 ecelFlag
69d0: 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  s;.    if( eDest
69e0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
69f0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6a00: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6a10: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6a20: 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49  ecelFlags = SQLI
6a30: 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20  TE_ECEL_DUP;.   
6a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63   }else{.      ec
6a50: 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  elFlags = 0;.   
6a60: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
6a70: 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d   && hasDistinct=
6a80: 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  =0 && eDest!=SRT
6a90: 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65  _EphemTab && eDe
6aa0: 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  st!=SRT_Table ){
6ab0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
6ac0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
6ad0: 20 70 45 4c 69 73 74 20 74 68 61 74 20 69 73 20   pEList that is 
6ae0: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
6af0: 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20  ression in.     
6b00: 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
6b10: 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d 3e   clause (pSort->
6b20: 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20 74  pOrderBy), set t
6b30: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20  he associated . 
6b40: 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79       ** iOrderBy
6b50: 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65  Col value to one
6b60: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 69   more than the i
6b70: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44 45  ndex of the ORDE
6b80: 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20 65  R BY .      ** e
6b90: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e  xpression within
6ba0: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74 68   the sort-key th
6bb0: 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  at pushOntoSorte
6bc0: 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  r() will generat
6bd0: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  e..      ** This
6be0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 45 4c 69   allows the pELi
6bf0: 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f  st field to be o
6c00: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
6c10: 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20  sorted record,. 
6c20: 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73       ** saving s
6c30: 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63  pace and CPU cyc
6c40: 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65  les.  */.      e
6c50: 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  celFlags |= (SQL
6c60: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
6c70: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
6c80: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  );.      for(i=p
6c90: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c  Sort->nOBSat; i<
6ca0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
6cb0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6cc0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
6cd0: 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53       if( (j = pS
6ce0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ort->pOrderBy->a
6cf0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
6d00: 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
6d10: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d      pEList->a[j-
6d20: 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  1].u.x.iOrderByC
6d30: 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e  ol = i+1-pSort->
6d40: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20  nOBSat;.        
6d50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6d60: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
6d70: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
6d80: 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65  ==SRT_Set || eDe
6d90: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20  st==SRT_Mem .   
6da0: 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74          || eDest
6db0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6dc0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  || eDest==SRT_Ou
6dd0: 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20  tput );.    }.  
6de0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 73    nResultCol = s
6df0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
6e00: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70 45  prList(pParse,pE
6e10: 4c 69 73 74 2c 72 65 67 52 65 73 75 6c 74 2c 30  List,regResult,0
6e20: 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d  ,ecelFlags);.  }
6e30: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
6e40: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
6e50: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
6e60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6e70: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
6e80: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
6e90: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
6ea0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
6eb0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
6ec0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
6ed0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
6ee0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74  inct ){.    swit
6ef0: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
6f00: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
6f10: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6f20: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
6f30: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
6f40: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
6f50: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
6f60: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
6f70: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
6f80: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
6f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6fa0: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
6fb0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
6fc0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
6fd0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
6fe0: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
6ff0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
7000: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7010: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
7020: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
7030: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
7040: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
7050: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
7060: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20  esultCol;..     
7070: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
7080: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
7090: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
70a0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
70b0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
70c0: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
70d0: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
70e0: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
70f0: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
7100: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
7110: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
7120: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
7130: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
7140: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
7150: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
7160: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
7170: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
7180: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
7190: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
71a0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
71b0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
71c0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
71d0: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
71e0: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
71f0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
7200: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
7210: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
7220: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
7230: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
7240: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
7250: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
7260: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
7270: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
7280: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
7290: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20  ResultCol;.     
72a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
72b0: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
72c0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
72d0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
72e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
72f0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
7300: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
7310: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
7320: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
7330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7340: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
7350: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
7360: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
7370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
7380: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7390: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
73a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
73b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
73c0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
73d0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
73e0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
73f0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
7400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7420: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7430: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
7440: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
7450: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
7460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7470: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
7480: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
7490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
74a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
74b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74c0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
74d0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
74e0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
74f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7500: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
7510: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
7520: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
7530: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7540: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7550: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
7560: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
7570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7580: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
7590: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
75a0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
75b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
75c0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
75d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
75e0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
75f0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
7600: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
7610: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
7620: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
7630: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
7640: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
7650: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7670: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
7680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7690: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
76a0: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
76b0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
76c0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
76d0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
76e0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
76f0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
7700: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
7710: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
7720: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
7730: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
7740: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
7750: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
7760: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
7770: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
7780: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
7790: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
77a0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
77b0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
77c0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
77d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
77e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
77f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7800: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
7810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7820: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
7830: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7840: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
7850: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7860: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7870: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7880: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
7890: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
78a0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
78b0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
78c0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
78d0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
78e0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
78f0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
7900: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
7910: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
7920: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
7930: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
7940: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7950: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7970: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7980: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
7990: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
79a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
79b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
79c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
79d0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
79e0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
79f0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7a00: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7a10: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7a20: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
7a30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7a40: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7a50: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7a60: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7a70: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7a80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7a90: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7aa0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7ab0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ac0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7ad0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7ae0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7af0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7b00: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7b10: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7b20: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7b30: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7b40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7b50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7b60: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7b70: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7b80: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7b90: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7ba0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7bb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7bc0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7bd0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7be0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7bf0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7c00: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7c10: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7c20: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
7c30: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
7c40: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7c50: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7c60: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7c70: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7c80: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7c90: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7ca0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7cb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7cc0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7cd0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7ce0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7cf0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7d00: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7d10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7d20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7d30: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7d40: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7d50: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7d60: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7d70: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7d80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7d90: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7db0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7dc0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7dd0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
7de0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
7df0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7e00: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
7e10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7e20: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7e30: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7e40: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7e50: 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78  t, p, r1+nPrefix
7e60: 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c  Reg,regResult,1,
7e70: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7e80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7e90: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
7ea0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7eb0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
7ec0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ed0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7ee0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
7ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f00: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7f10: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7f20: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7f30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7f40: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7f50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7f60: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f70: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7f90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
7fa0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
7fb0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7fd0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7fe0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
7ff0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
8000: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
8010: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
8020: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
8030: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
8040: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
8050: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
8060: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
8070: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
8080: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
8090: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
80a0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
80b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
80c0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
80d0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
80e0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
80f0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
8100: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
8110: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
8120: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
8130: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
8140: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
8150: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
8160: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
8170: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
8180: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
8190: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
81a0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
81b0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
81c0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
81d0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
81e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
81f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
8200: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8210: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
8220: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
8230: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
8240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8250: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
8260: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8270: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
8280: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
8290: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
82a0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
82b0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
82c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
82d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
82e0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
82f0: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
8300: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
8310: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
8320: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8330: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8340: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8350: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8360: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8380: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8390: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83a0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
83b0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
83d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
83e0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
83f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8400: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8410: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
8420: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
8430: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
8440: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
8450: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
8460: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
8470: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8480: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8490: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
84a0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
84b0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
84c0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
84d0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
84e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
84f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8500: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
8510: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
8520: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
8530: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
8540: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
8550: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
8560: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
8570: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
8580: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
8590: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
85a0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
85b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
85c0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
85d0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
85e0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
85f0: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
8600: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
8610: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
8620: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
8630: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
8640: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
8650: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
8660: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
8670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8680: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
8690: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
86a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
86b0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
86c0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
86d0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
86e0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
86f0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
8700: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
8710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8720: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
8730: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8740: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
8750: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
8760: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
8770: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
8780: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
8790: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
87a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
87b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
87c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
87d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
87e0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
87f0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8800: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
8810: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
8820: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
8830: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
8840: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
8850: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
8860: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
8890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
88a0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
88b0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
88c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
88d0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
88e0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
88f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8910: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
8920: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
8930: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8950: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
8960: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
8970: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8980: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
8990: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
89a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
89b0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
89c0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
89d0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
89e0: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
89f0: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
8a00: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
8a10: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
8a20: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
8a30: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
8a40: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
8a50: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
8a60: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
8a70: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
8a80: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
8a90: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
8aa0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
8ab0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
8ac0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
8ad0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
8ae0: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
8af0: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
8b00: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
8b10: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
8b20: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
8b30: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
8b40: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
8b50: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
8b60: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
8b70: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
8b80: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
8b90: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
8ba0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
8bb0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
8bc0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
8bd0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
8be0: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
8bf0: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
8c00: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
8c10: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
8c20: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8c30: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
8c40: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
8c50: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
8c60: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
8c70: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
8c80: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8c90: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
8ca0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8cb0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
8cc0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
8cd0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
8ce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
8cf0: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
8d00: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
8d10: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
8d20: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
8d30: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
8d40: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
8d50: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
8d60: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
8d70: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
8d80: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
8d90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8db0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8dc0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8dd0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
8de0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8df0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8e00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8e10: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
8e20: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8e30: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
8e40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
8e50: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
8e60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8e70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8e80: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
8e90: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
8ea0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8eb0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
8ec0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
8ed0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8ee0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
8ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8f00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8f10: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
8f40: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
8f50: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
8f80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8f90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8fa0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
8fb0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
8fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8fd0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8fe0: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
8ff0: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
9000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9010: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9020: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9030: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
9040: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
9050: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
9060: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
9070: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9080: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
9090: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
90a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
90b0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
90c0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
90d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
90e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
90f0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
9100: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
9110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
9120: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
9130: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
9140: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
9150: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
9160: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
9170: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
9180: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
9190: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
91a0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
91b0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
91c0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
91d0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
91e0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
91f0: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
9200: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
9210: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
9220: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
9230: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9240: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
9250: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
9260: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9270: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
9280: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
9290: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
92a0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
92b0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
92c0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
92d0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
92e0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
92f0: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
9300: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
9310: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
9320: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
9330: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
9340: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
9350: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9360: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
9370: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
9380: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
9390: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
93a0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
93b0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
93c0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
93d0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
93e0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
93f0: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
9400: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9410: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
9420: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
9430: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
9440: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
9450: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
9460: 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c  +1) - sizeof(Col
9470: 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66  lSeq*);.  KeyInf
9480: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
9490: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
94a0: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
94b0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
94c0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
94d0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
94e0: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
94f0: 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28     p->nField = (
9500: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58  u16)N;.    p->nX
9510: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a  Field = (u16)X;.
9520: 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43      p->enc = ENC
9530: 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  (db);.    p->db 
9540: 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = db;.    p->nRe
9550: 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  f = 1;.    memse
9560: 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74  t(&p[1], 0, nExt
9570: 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ra);.  }else{.  
9580: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
9590: 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t(db);.  }.  ret
95a0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
95b0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  Deallocate a Key
95c0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  Info object.*/.v
95d0: 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oid sqlite3KeyIn
95e0: 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20  foUnref(KeyInfo 
95f0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
9600: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9610: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
9620: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
9630: 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c  p->nRef==0 ) sql
9640: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e  ite3DbFreeNN(p->
9650: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
9660: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20  *.** Make a new 
9670: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79  pointer to a Key
9680: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b  Info object.*/.K
9690: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
96a0: 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66  eyInfoRef(KeyInf
96b0: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
96c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
96d0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
96e0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
96f0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66  return p;.}..#if
9700: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9710: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
9720: 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20  UE if a KeyInfo 
9730: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68  object can be ch
9740: 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e  ange.  The KeyIn
9750: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e  fo object.** can
9760: 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64   only be changed
9770: 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73 74   if this is just
9780: 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65   a single refere
9790: 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63  nce to the objec
97a0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
97b0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
97c0: 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ly inside of ass
97d0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
97e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
97f0: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
9800: 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20  le(KeyInfo *p){ 
9810: 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d  return p->nRef==
9820: 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1; }.#endif /* S
9830: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
9840: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
9850: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
9860: 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e  generate a KeyIn
9870: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
9880: 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  t records.** the
9890: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
98a0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70  nce for each exp
98b0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20  ression in that 
98c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
98d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78  .**.** If the Ex
98e0: 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44  prList is an ORD
98f0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
9900: 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68  Y clause then th
9910: 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b  e resulting.** K
9920: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
9930: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
9940: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
9950: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
9960: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
9970: 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49   that clause.  I
9980: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
9990: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
99a0: 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20   of a SELECT.** 
99b0: 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  then the KeyInfo
99c0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
99d0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
99e0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
99f0: 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  tual.** index to
9a00: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53   implement a DIS
9a10: 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a  TINCT test..**.*
9a20: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
9a30: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
9a40: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
9a50: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  d from malloc.  
9a60: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
9a70: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
9a80: 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e  nsible for seein
9a90: 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
9aa0: 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
9ab0: 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f  lly.** freed..*/
9ac0: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
9ad0: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
9ae0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
9af0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
9b00: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9b10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9b20: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
9b30: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
9b40: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
9b50: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
9b60: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
9b70: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
9b80: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
9b90: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
9ba0: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
9bb0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
9bc0: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
9bd0: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20   the end */.){. 
9be0: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
9bf0: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
9c00: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9c10: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
9c20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9c30: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
9c40: 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69  ;..  nExpr = pLi
9c50: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
9c60: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
9c70: 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
9c80: 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78 74 72  pr-iStart, nExtr
9c90: 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  a+1);.  if( pInf
9ca0: 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  o ){.    assert(
9cb0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
9cc0: 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f  sWriteable(pInfo
9cd0: 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69  ) );.    for(i=i
9ce0: 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69  Start, pItem=pLi
9cf0: 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c  st->a+iStart; i<
9d00: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
9d10: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  m++){.      Coll
9d20: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
9d30: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9d40: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
9d50: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
9d60: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
9d70: 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
9d80: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
9d90: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
9da0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 43 6f  [i-iStart] = pCo
9db0: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
9dc0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53  >aSortOrder[i-iS
9dd0: 74 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73  tart] = pItem->s
9de0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
9df0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e    }.  return pIn
9e00: 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d  fo;.}../*.** Nam
9e10: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
9e20: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
9e30: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
9e40: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
9e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
9e60: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
9e70: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
9e80: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
9e90: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
9ea0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
9eb0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
9ec0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
9ed0: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
9ee0: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
9ef0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
9f00: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
9f10: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
9f20: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
9f30: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
9f40: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
9f50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9f60: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
9f70: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
9f80: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
9f90: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
9fa0: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
9fb0: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
9fc0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
9fd0: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
9fe0: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
9ff0: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
a000: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
a010: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
a020: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
a030: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
a040: 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45  .**.**   "USE TE
a050: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78  MP B-TREE FOR xx
a060: 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78  x".**.** where x
a070: 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49  xx is one of "DI
a080: 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20  STINCT", "ORDER 
a090: 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59  BY" or "GROUP BY
a0a0: 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68  ". Exactly which
a0b0: 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65  .** is determine
a0c0: 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20  d by the zUsage 
a0d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
a0e0: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
a0f0: 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20  TempTable(Parse 
a100: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
a110: 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20  har *zUsage){.  
a120: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
a130: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
a140: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a150: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
a160: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
a170: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
a180: 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54  b, "USE TEMP B-T
a190: 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73  REE FOR %s", zUs
a1a0: 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
a1b0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a1c0: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
a1d0: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
a1e0: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
a1f0: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
a200: 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65  .** Assign expre
a210: 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75  ssion b to lvalu
a220: 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e  e a. A second, n
a230: 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66  o-op, version of
a240: 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69   this macro.** i
a250: 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20  s provided when 
a260: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
a270: 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20  AIN is defined. 
a280: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
a290: 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74  code.** in sqlit
a2a0: 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73  e3Select() to as
a2b0: 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73  sign values to s
a2c0: 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20  tructure member 
a2d0: 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a  variables that.*
a2e0: 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20  * only exist if 
a2f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
a300: 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  AIN is not defin
a310: 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75  ed without pollu
a320: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65  ting the.** code
a330: 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69   with #ifndef di
a340: 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64  rectives..*/.# d
a350: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
a360: 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20  Integer(a, b) a 
a370: 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f  = b..#else./* No
a380: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
a390: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
a3a0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
a3b0: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
a3c0: 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  ne explainTempTa
a3d0: 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e  ble(y,z).# defin
a3e0: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
a3f0: 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  ger(y,z).#endif.
a400: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a410: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
a420: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
a430: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
a440: 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a  UND_SELECT)./*.*
a450: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
a460: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
a470: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
a480: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
a490: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
a4a0: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
a4b0: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
a4c0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
a4d0: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
a4e0: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
a4f0: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
a500: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  f one of the two
a510: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
a520: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
a530: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
a540: 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20  iSub2 (op)".**  
a550: 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51   "COMPOSITE SUBQ
a560: 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64  UERIES iSub1 and
a570: 20 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d   iSub2 USING TEM
a580: 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a  P B-TREE (op)".*
a590: 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31  *.** where iSub1
a5a0: 20 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74   and iSub2 are t
a5b0: 68 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73  he integers pass
a5c0: 65 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  ed as the corres
a5d0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  ponding.** funct
a5e0: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20  ion parameters, 
a5f0: 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65  and op is the te
a600: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
a610: 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  n of the paramet
a620: 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  er.** of the sam
a630: 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61  e name. The para
a640: 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20  meter "op" must 
a650: 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  be one of TK_UNI
a660: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a  ON, TK_EXCEPT,.*
a670: 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f  * TK_INTERSECT o
a680: 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69  r TK_ALL. The fi
a690: 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64  rst form is used
a6a0: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73   if argument bUs
a6b0: 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73  eTmp is .** fals
a6c0: 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  e, or the second
a6d0: 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74   form if it is t
a6e0: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
a6f0: 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  oid explainCompo
a700: 73 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  site(.  Parse *p
a710: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
a720: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
a730: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
a740: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a760: 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   One of TK_UNION
a770: 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e  , TK_EXCEPT etc.
a780: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c   */.  int iSub1,
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7a0: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
a7b0: 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20  y id 1 */.  int 
a7c0: 69 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20  iSub2,          
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a7e0: 75 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a  ubquery id 2 */.
a7f0: 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20    int bUseTmp   
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a810: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
a820: 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73  emp table was us
a830: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
a840: 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  t( op==TK_UNION 
a850: 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  || op==TK_EXCEPT
a860: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
a870: 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41  SECT || op==TK_A
a880: 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  LL );.  if( pPar
a890: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
a8a0: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
a8b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a8c0: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
a8d0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
a8e0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
a8f0: 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55  db, "COMPOUND SU
a900: 42 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20  BQUERIES %d AND 
a910: 25 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62  %d %s(%s)", iSub
a920: 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20  1, iSub2,.      
a930: 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47    bUseTmp?"USING
a940: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22   TEMP B-TREE ":"
a950: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
a960: 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  op).    );.    s
a970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a980: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
a990: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
a9a0: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
a9b0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
a9c0: 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  }.#else./* No-op
a9d0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
a9e0: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
a9f0: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
aa00: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
aa10: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
aa20: 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  (v,w,x,y,z).#end
aa30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
aa40: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
aa50: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
aa60: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
aa70: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
aa80: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
aa90: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
aaa0: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
aab0: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
aac0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
aad0: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
aae0: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
aaf0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
ab00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
ab10: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
ab20: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
ab30: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
ab40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
ab50: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20  erateSortTail(. 
ab60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ab70: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
ab80: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
ab90: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
aba0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
abb0: 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74  ment */.  SortCt
abc0: 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49  x *pSort,   /* I
abd0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68  nformation on th
abe0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
abf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
ac00: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
ac10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
ac20: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
ac30: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
ac40: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
ac50: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
ac60: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
ac70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
aca0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
acb0: 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20    int addrBreak 
acc0: 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f  = pSort->labelDo
acd0: 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ne;            /
ace0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
acf0: 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  xit loop */.  in
ad00: 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d  t addrContinue =
ad10: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
ad20: 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75  Label(v);  /* Ju
ad30: 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74  mp here for next
ad40: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
ad50: 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72  addr;.  int addr
ad60: 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Once = 0;.  int 
ad70: 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  iTab;.  ExprList
ad80: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f   *pOrderBy = pSo
ad90: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  rt->pOrderBy;.  
ada0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
adb0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
adc0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
add0: 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65  SDParm;.  int re
ade0: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
adf0: 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  owid;.  int iCol
ae00: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
ae10: 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20  int iSortTab;   
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72  /* Sorter cursor
ae40: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
ae50: 0a 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61  .  int nSortData
ae60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ae70: 20 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76     /* Trailing v
ae80: 61 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72  alues to read fr
ae90: 6f 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69  om sorter */.  i
aea0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71  nt i;.  int bSeq
aeb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aec0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
aed0: 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  if sorter record
aee0: 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e   includes seq. n
aef0: 6f 2e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  o. */.  struct E
af00: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f  xprList_item *aO
af10: 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74  utEx = p->pEList
af20: 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ->a;..  assert( 
af30: 61 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20  addrBreak<0 );. 
af40: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65   if( pSort->labe
af50: 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  lBkOut ){.    sq
af60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
af70: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f  v, OP_Gosub, pSo
af80: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  rt->regReturn, p
af90: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
afa0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
afb0: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72  beGoto(v, addrBr
afc0: 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eak);.    sqlite
afd0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
afe0: 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  l(v, pSort->labe
aff0: 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  lBkOut);.  }.  i
b000: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43  Tab = pSort->iEC
b010: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65  ursor;.  if( eDe
b020: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
b030: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
b040: 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d  outine || eDest=
b050: 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20  =SRT_Mem ){.    
b060: 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  regRowid = 0;.  
b070: 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74    regRow = pDest
b080: 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f  ->iSdst;.    nSo
b090: 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e  rtData = nColumn
b0a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
b0b0: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
b0c0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
b0d0: 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  se);.    regRow 
b0e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b0f0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
b100: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72  olumn);.    nSor
b110: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
b120: 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f  .  }.  nKey = pO
b130: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20  rderBy->nExpr - 
b140: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
b150: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
b160: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
b170: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
b180: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
b190: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
b1a0: 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20  m;.    iSortTab 
b1b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
b1c0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
b1d0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
b1e0: 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20       addrOnce = 
b1f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b200: 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
b210: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b220: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b230: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b240: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53  P_OpenPseudo, iS
b250: 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  ortTab, regSortO
b260: 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74  ut, nKey+1+nSort
b270: 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61  Data);.    if( a
b280: 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65  ddrOnce ) sqlite
b290: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b2a0: 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
b2b0: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
b2c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b2d0: 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69  OP_SorterSort, i
b2e0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
b2f0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
b300: 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  e(v);.    codeOf
b310: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
b320: 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  et, addrContinue
b330: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b340: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
b350: 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c  orterData, iTab,
b360: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f   regSortOut, iSo
b370: 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71  rtTab);.    bSeq
b380: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
b390: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
b3a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b3b0: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62  v, OP_Sort, iTab
b3c0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64  , addrBreak); Vd
b3d0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b3e0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
b3f0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
b400: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
b410: 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b  iSortTab = iTab;
b420: 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20  .    bSeq = 1;. 
b430: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43   }.  for(i=0, iC
b440: 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c  ol=nKey+bSeq; i<
b450: 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b  nSortData; i++){
b460: 0a 20 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a  .    int iRead;.
b470: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
b480: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
b490: 6c 20 29 7b 0a 20 20 20 20 20 20 69 52 65 61 64  l ){.      iRead
b4a0: 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78   = aOutEx[i].u.x
b4b0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a  .iOrderByCol-1;.
b4c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4d0: 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b   iRead = iCol++;
b4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b4f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b500: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
b510: 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52  Tab, iRead, regR
b520: 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43  ow+i);.    VdbeC
b530: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
b540: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
b550: 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61   ? aOutEx[i].zNa
b560: 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me : aOutEx[i].z
b570: 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77  Span));.  }.  sw
b580: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
b590: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
b5a0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
b5b0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
b5c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b5d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
b5e0: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
b5f0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
b600: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b610: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
b620: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
b630: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
b640: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b650: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
b660: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b670: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
b680: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b690: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
b6a0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
b6b0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
b6c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
b6d0: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
b6e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b6f0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
b700: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
b710: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
b720: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b740: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
b750: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
b760: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
b770: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
b780: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e  Parse, regRow, n
b790: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
b7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b7b0: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
b7c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
b7d0: 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  owid, regRow, nC
b7e0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
b7f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b800: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
b810: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
b820: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
b830: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
b840: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
b850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
b860: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
b870: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b880: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
b890: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
b8a0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
b8b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b8c0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
b8d0: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
b8e0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
b8f0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
b900: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
b910: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
b920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b930: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
b940: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
b950: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
b960: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b970: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
b980: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
b990: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
b9a0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
b9b0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b9c0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b9d0: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
b9e0: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
b9f0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
ba00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ba10: 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  regRowid ){.    
ba20: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
ba30: 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  et ){.      sqli
ba40: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
ba50: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
ba60: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
ba70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
ba80: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ba90: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
baa0: 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Row);.    }.    
bab0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
bac0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
bad0: 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f  gRowid);.  }.  /
bae0: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
baf0: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
bb00: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
bb10: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
bb20: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
bb30: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
bb40: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
bb50: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
bb60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bb70: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
bb80: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
bb90: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
bba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
bbb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bbc0: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
bbd0: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
bbe0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66  age(v);.  }.  if
bbf0: 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  ( pSort->regRetu
bc00: 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  rn ) sqlite3Vdbe
bc10: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
bc20: 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  urn, pSort->regR
bc30: 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65  eturn);.  sqlite
bc40: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
bc50: 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
bc60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
bc70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
bc80: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
bc90: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
bca0: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
bcb0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
bcc0: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
bcd0: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
bce0: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
bcf0: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c  caller..**.** Al
bd00: 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  so try to estima
bd10: 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
bd20: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
bd30: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  e and return tha
bd40: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a  t.** result in *
bd50: 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a  pEstWidth..**.**
bd60: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
bd70: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
bd80: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
bd90: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
bda0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69   from the.** ori
bdb0: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
bdc0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
bdd0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
bde0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a  s a column. The.
bdf0: 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  ** declaration t
be00: 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20  ype for a ROWID 
be10: 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52  field is INTEGER
be20: 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61  . Exactly when a
be30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
be40: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
be50: 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f  column can be co
be60: 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65  mplex in the pre
be70: 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72  sence of subquer
be80: 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75  ies. The.** resu
be90: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
bea0: 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  n in all of the 
beb0: 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54  following SELECT
bec0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a   statements is .
bed0: 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ** considered a 
bee0: 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66  column by this f
bef0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
bf00: 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d   SELECT col FROM
bf10: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
bf20: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
bf30: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
bf40: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
bf50: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20  FROM tbl);.**   
bf60: 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20  SELECT abc FROM 
bf70: 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61  (SELECT col AS a
bf80: 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  bc FROM tbl);.**
bf90: 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61   .** The declara
bfa0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e  tion type for an
bfb0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68  y expression oth
bfc0: 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e  er than a column
bfd0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
bfe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
bff0: 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70   either 3 or 6 p
c000: 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64  arameters depend
c010: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
c020: 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c  r not.** the SQL
c030: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
c040: 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69  N_METADATA compi
c050: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
c060: 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  s used..*/.#ifde
c070: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c080: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
c090: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
c0a0: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29  ype(A,B,C,D,E,F)
c0b0: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
c0c0: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c  A,B,C,D,E,F).#el
c0d0: 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65  se /* if !define
c0e0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
c0f0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29  COLUMN_METADATA)
c100: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c   */.# define col
c110: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
c120: 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  E,F) columnTypeI
c130: 6d 70 6c 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69  mpl(A,B,F).#endi
c140: 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  f.static const c
c150: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49  har *columnTypeI
c160: 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  mpl(.  NameConte
c170: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
c180: 20 2a 70 45 78 70 72 2c 0a 23 69 66 64 65 66 20   *pExpr,.#ifdef 
c190: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c1a0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
c1b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
c1c0: 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  rigDb,.  const c
c1d0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c  har **pzOrigTab,
c1e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
c1f0: 70 7a 4f 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69  pzOrigCol,.#endi
c200: 66 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74  f.  u8 *pEstWidt
c210: 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  h.){.  char cons
c220: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
c230: 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57  int j;.  u8 estW
c240: 69 64 74 68 20 3d 20 31 3b 0a 23 69 66 64 65 66  idth = 1;.#ifdef
c250: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c260: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
c270: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
c280: 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  igDb = 0;.  char
c290: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62   const *zOrigTab
c2a0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
c2b0: 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  st *zOrigCol = 0
c2c0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
c2d0: 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
c2e0: 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
c2f0: 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
c300: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
c310: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
c320: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
c330: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
c340: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
c350: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
c360: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
c370: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
c380: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
c390: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
c3a0: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
c3b0: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
c3c0: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
c3d0: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
c3e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
c3f0: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
c400: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
c410: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
c420: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
c430: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
c440: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
c450: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
c460: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
c470: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
c480: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
c490: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
c4a0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
c4b0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
c4c0: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
c4d0: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
c4e0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
c4f0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
c500: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
c510: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
c520: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
c530: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  MN );.      whil
c540: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
c550: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
c560: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
c570: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
c580: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
c590: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
c5a0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
c5b0: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
c5c0: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
c5d0: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
c5e0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
c5f0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
c600: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
c610: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
c620: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
c630: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
c640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c650: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
c660: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
c670: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
c680: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
c690: 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
c6a0: 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20  time, code such 
c6b0: 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  as "SELECT new.x
c6c0: 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  " within a trigg
c6d0: 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  er would.       
c6e0: 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63   ** cause this c
c6f0: 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e  ondition to run.
c700: 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65    Since then, we
c710: 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72   have restructur
c720: 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a  ed how.        *
c730: 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69  * trigger code i
c740: 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20  s generated and 
c750: 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  so this conditio
c760: 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a  n is no longer .
c770: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
c780: 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ble. However, it
c790: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72   can still be tr
c7a0: 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  ue for statement
c7b0: 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a  s like.        *
c7c0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  * the following:
c7d0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
c7e0: 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
c7f0: 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54  TABLE t1(col INT
c800: 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a  EGER);.        *
c810: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
c820: 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20  CT t1.col) FROM 
c830: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
c840: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
c850: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
c860: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
c870: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31  e expression "t1
c880: 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20  .col" in the .  
c890: 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c        ** sub-sel
c8a0: 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ect. In this cas
c8b0: 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d  e, set the colum
c8c0: 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20  n type to NULL, 
c8d0: 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  even.        ** 
c8e0: 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
c8f0: 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45   really be "INTE
c900: 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a  GER"..        **
c910: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
c920: 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
c930: 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  m, as the column
c940: 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c   type of "t1.col
c950: 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20  " is never.     
c960: 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e     ** used. When
c970: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
c980: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
c990: 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20  xpression .     
c9a0: 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74     ** "(SELECT t
c9b0: 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72  1.col)", the cor
c9c0: 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74  rect type is ret
c9d0: 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54  urned (see the T
c9e0: 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20  K_SELECT.       
c9f0: 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77   ** branch below
ca00: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  .  */.        br
ca10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
ca20: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
ca30: 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d   && pExpr->pTab=
ca40: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69  =pTab );.      i
ca50: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
ca60: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
ca70: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
ca80: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
ca90: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
caa0: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
cab0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
cac0: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
cad0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
cae0: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
caf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
cb00: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
cb10: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
cb20: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
cb30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
cb40: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
cb50: 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e  ALWAYS(iCol<pS->
cb60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
cb70: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
cb80: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
cb90: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
cba0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
cbb0: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
cbc0: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
cbd0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
cbe0: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
cbf0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
cc00: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
cc10: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
cc20: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
cc30: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
cc40: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
cc50: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
cc60: 2a 2a 20 54 68 65 20 41 4c 57 41 59 53 28 29 20  ** The ALWAYS() 
cc70: 69 73 20 62 65 63 61 75 73 65 20 69 43 6f 6c 3e  is because iCol>
cc80: 3d 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  =pS->pEList->nEx
cc90: 70 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  pr will have bee
cca0: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
ccb0: 61 75 67 68 74 20 61 6c 72 65 61 64 79 20 62 79  aught already by
ccc0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
ccd0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
cce0: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
ccf0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
cd00: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
cd10: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
cd20: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
cd30: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
cd40: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
cd50: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
cd60: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  = pNC;.         
cd70: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
cd80: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
cd90: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
cda0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
cdb0: 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54  &zOrigDb,&zOrigT
cdc0: 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65  ab,&zOrigCol, &e
cdd0: 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20  stWidth); .     
cde0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
cdf0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65   if( pTab->pSche
ce00: 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ma ){.        /*
ce10: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
ce20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ce30: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
ce40: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
ce50: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
ce60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ce70: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
ce80: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
ce90: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66  ab->nCol) );.#if
cea0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ceb0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
cec0: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
ced0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
cee0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
cef0: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
cf00: 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64  OrigCol = "rowid
cf10: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
cf20: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  {.          zOri
cf30: 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  gCol = pTab->aCo
cf40: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
cf50: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
cf60: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
cf70: 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pe(&pTab->aCol[i
cf80: 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20  Col],0);.       
cf90: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
cfa0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
cfb0: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
cfc0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
cfd0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
cfe0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
cff0: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
d000: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
d010: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
d020: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
d030: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
d040: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
d050: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
d060: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
d070: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
d080: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
d090: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d0a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
d0b0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
d0c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d0d0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
d0e0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
d0f0: 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pe(&pTab->aCol[i
d100: 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20  Col],0);.       
d110: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
d120: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
d130: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
d140: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
d150: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d160: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
d170: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
d180: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
d190: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
d1a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
d1b0: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
d1c0: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
d1d0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
d1e0: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
d1f0: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
d200: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
d210: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
d220: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
d230: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
d240: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
d250: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
d260: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
d270: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
d280: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
d290: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
d2a0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
d2b0: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
d2c0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
d2d0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
d2e0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
d2f0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
d300: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
d310: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
d320: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
d330: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
d340: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
d350: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
d360: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
d370: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
d380: 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  h); .      break
d390: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
d3a0: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
d3b0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
d3c0: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
d3d0: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
d3e0: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
d3f0: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
d400: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
d410: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
d420: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
d430: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
d440: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
d450: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
d460: 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a  f( pEstWidth ) *
d470: 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57  pEstWidth = estW
d480: 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a  idth;.  return z
d490: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
d4a0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
d4b0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
d4c0: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
d4d0: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
d4e0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
d4f0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
d500: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
d510: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
d520: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d530: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
d540: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
d550: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
d560: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
d570: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
d580: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
d590: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
d5a0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
d5b0: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
d5c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
d5d0: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
d5e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
d5f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
d600: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
d610: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
d620: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
d630: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
d640: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
d650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
d660: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d670: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
d680: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
d690: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
d6a0: 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65  ar *zType;.#ifde
d6b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d6c0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
d6d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d6e0: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
d6f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
d700: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
d710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
d720: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79  Col = 0;.    zTy
d730: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d740: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
d750: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
d760: 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20  OrigCol, 0);..  
d770: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
d780: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
d790: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
d7a0: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
d7b0: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
d7c0: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
d7d0: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
d7e0: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
d7f0: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
d800: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
d810: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
d820: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
d830: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d840: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
d850: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
d860: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d870: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d880: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d890: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
d8a0: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
d8b0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d8c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d8d0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d8e0: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
d8f0: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
d900: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
d910: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
d920: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d930: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , 0, 0, 0, 0);.#
d940: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
d950: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d960: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
d970: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
d980: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d990: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
d9a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d9b0: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
d9c0: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  /.}../*.** Retur
d9d0: 6e 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  n the Table obje
d9e0: 63 63 74 20 69 6e 20 74 68 65 20 53 72 63 4c 69  cct in the SrcLi
d9f0: 73 74 20 74 68 61 74 20 68 61 73 20 63 75 72 73  st that has curs
da00: 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 4f  or iCursor..** O
da10: 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  r return NULL if
da20: 20 6e 6f 20 73 75 63 68 20 54 61 62 6c 65 20 6f   no such Table o
da30: 62 6a 65 63 74 20 65 78 69 73 74 73 20 69 6e 20  bject exists in 
da40: 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
da50: 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 74 61  static Table *ta
da60: 62 6c 65 57 69 74 68 43 75 72 73 6f 72 28 53 72  bleWithCursor(Sr
da70: 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  cList *pList, in
da80: 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e  t iCursor){.  in
da90: 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  t j;.  for(j=0; 
daa0: 6a 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a  j<pList->nSrc; j
dab0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69  ++){.    if( pLi
dac0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
dad0: 3d 3d 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ==iCursor ) retu
dae0: 72 6e 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  rn pList->a[j].p
daf0: 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Tab;.  }.  retur
db00: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  n 0;.}.../*.** G
db10: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
db20: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
db30: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
db40: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
db50: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
db60: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
db70: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
db80: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
db90: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
dba0: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
dbb0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
dbc0: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
dbd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
dbe0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
dbf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
dc00: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
dc10: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
dc20: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
dc30: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
dc40: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
dc50: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
dc60: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
dc70: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
dc80: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54  be;.  int i;.  T
dc90: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
dca0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
dcb0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
dcc0: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
dcd0: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
dce0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
dcf0: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
dd00: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
dd10: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
dd20: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
dd30: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
dd40: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
dd50: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
dd60: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62  olNamesSet || db
dd70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
dd80: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
dd90: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
dda0: 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30  ert( pTabList!=0
ddb0: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   );.  pParse->co
ddc0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
ddd0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
dde0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
ddf0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
de00: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
de10: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
de20: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
de30: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
de40: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
de50: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
de60: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
de70: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
de80: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
de90: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
dea0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
deb0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
dec0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
ded0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
dee0: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
def0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
df00: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
df10: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
df20: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
df30: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
df40: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
df50: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
df60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
df70: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
df80: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  | p->op==TK_AGG_
df90: 43 4f 4c 55 4d 4e 29 0a 20 20 20 20 20 20 20 20  COLUMN).        
dfa0: 20 20 20 26 26 20 28 70 54 61 62 20 3d 20 74 61     && (pTab = ta
dfb0: 62 6c 65 57 69 74 68 43 75 72 73 6f 72 28 70 54  bleWithCursor(pT
dfc0: 61 62 4c 69 73 74 2c 20 70 2d 3e 69 54 61 62 6c  abList, p->iTabl
dfd0: 65 29 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  e))!=0.    ){.  
dfe0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
dff0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
e000: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
e010: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
e020: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
e030: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
e040: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
e050: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
e060: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
e070: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e080: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
e090: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
e0a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
e0b0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
e0c0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
e0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e0e0: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
e0f0: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
e100: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e110: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e120: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
e130: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e140: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e150: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
e160: 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  an), SQLITE_DYNA
e170: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
e180: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
e190: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
e1a0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
e1b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e1c0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e1d0: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
e1e0: 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ame, zCol);.    
e1f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e200: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
e210: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
e220: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  ame, SQLITE_DYNA
e230: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
e240: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
e250: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
e260: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
e270: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54  AME, zCol, SQLIT
e280: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
e290: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
e2a0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
e2b0: 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *z = pEList->a
e2c0: 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
e2d0: 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69   z = z==0 ? sqli
e2e0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e2f0: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20  column%d", i+1) 
e300: 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  : sqlite3DbStrDu
e310: 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  p(db, z);.      
e320: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e330: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
e340: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c  AME_NAME, z, SQL
e350: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
e360: 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
e370: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
e380: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
e390: 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
e3a0: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
e3b0: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
e3c0: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
e3d0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
e3e0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
e3f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e400: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
e410: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
e420: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
e430: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
e440: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
e450: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
e460: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
e470: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
e480: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
e490: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
e4a0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
e4b0: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
e4c0: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
e4d0: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
e4e0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
e4f0: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
e500: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
e510: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e520: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
e530: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
e540: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
e550: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
e560: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
e570: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
e580: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
e590: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 75  .int sqlite3Colu
e5a0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
e5b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e5c0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
e5d0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
e5e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
e5f0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
e600: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
e610: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
e620: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
e630: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
e640: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
e650: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
e660: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
e670: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
e680: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
e690: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
e6a0: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
e6b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e6c0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
e6d0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
e6e0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
e6f0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
e700: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e710: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32 20  unters */.  u32 
e720: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
e730: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
e740: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
e750: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
e760: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
e770: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
e780: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
e790: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
e7a0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
e7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e7c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e7d0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
e7e0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
e7f0: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
e800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
e810: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
e820: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
e830: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
e840: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
e850: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
e860: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
e870: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
e880: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e890: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
e8a0: 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20   */.  Hash ht;  
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8c0: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
e8d0: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
e8e0: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73  */..  sqlite3Has
e8f0: 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66  hInit(&ht);.  if
e900: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
e910: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
e920: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
e930: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
e940: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
e950: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
e960: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
e970: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==0 );.  }else
e980: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
e990: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
e9a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
e9b0: 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20  ==(i16)nCol );. 
e9c0: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a   *pnCol = nCol;.
e9d0: 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b    *paCol = aCol;
e9e0: 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ..  for(i=0, pCo
e9f0: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26  l=aCol; i<nCol &
ea00: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
ea10: 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  led; i++, pCol++
ea20: 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
ea30: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
ea40: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
ea50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
ea60: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
ea70: 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
ea80: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
ea90: 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
eaa0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
eab0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
eac0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
ead0: 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
eae0: 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
eaf0: 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
eb00: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  name */.    }els
eb10: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
eb20: 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a  ColExpr = p;  /*
eb30: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
eb40: 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75  that is the resu
eb50: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  lt column name *
eb60: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
eb70: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
eb80: 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  Table associated
eb90: 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65   with this expre
eba0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ssion */.      w
ebb0: 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
ebc0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
ebd0: 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d        pColExpr =
ebe0: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68   pColExpr->pRigh
ebf0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
ec00: 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29  t( pColExpr!=0 )
ec10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ec20: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
ec30: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
ec40: 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30  ColExpr->pTab!=0
ec50: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
ec60: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
ec70: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
ec80: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
ec90: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
eca0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
ecb0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c       pTab = pCol
ecc0: 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
ecd0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
ece0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
ecf0: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  Key;.        zNa
ed00: 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70  me = iCol>=0 ? p
ed10: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ed20: 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b  zName : "rowid";
ed30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ed40: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
ed50: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
ed60: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
ed70: 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70  Property(pColExp
ed80: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
ed90: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  );.        zName
eda0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a   = pColExpr->u.z
edb0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  Token;.      }el
edc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  se{.        /* U
edd0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
ede0: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
edf0: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
ee00: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
ee10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c       zName = pEL
ee20: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
ee30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ee40: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a     if( zName ){.
ee50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
ee60: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ee70: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
ee80: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  lse{.      zName
ee90: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
eea0: 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c  f(db,"column%d",
eeb0: 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  i);.    }..    /
eec0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
eed0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
eee0: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
eef0: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
ef00: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
ef10: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74   an integer to t
ef20: 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20  he name so that 
ef30: 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75  it becomes uniqu
ef40: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e  e..    */.    cn
ef50: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
ef60: 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74  ( zName && sqlit
ef70: 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20  e3HashFind(&ht, 
ef80: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
ef90: 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74     nName = sqlit
efa0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
efb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61  );.      if( nNa
efc0: 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  me>0 ){.        
efd0: 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a  for(j=nName-1; j
efe0: 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 64  >0 && sqlite3Isd
eff0: 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20  igit(zName[j]); 
f000: 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69  j--){}.        i
f010: 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27  f( zName[j]==':'
f020: 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20   ) nName = j;.  
f030: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d      }.      zNam
f040: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
f050: 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22  tf(db, "%.*z:%u"
f060: 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  , nName, zName, 
f070: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  ++cnt);.      if
f080: 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65  ( cnt>3 ) sqlite
f090: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
f0a0: 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b  eof(cnt), &cnt);
f0b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
f0c0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
f0d0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
f0e0: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
f0f0: 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20  ame(0, pCol);.  
f100: 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73    if( zName && s
f110: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
f120: 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f  (&ht, zName, pCo
f130: 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20  l)==pCol ){.    
f140: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
f150: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
f160: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
f170: 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20  ear(&ht);.  if( 
f180: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f190: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
f1a0: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
f1b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f1c0: 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  db, aCol[j].zNam
f1d0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
f1e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f1f0: 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f  aCol);.    *paCo
f200: 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f  l = 0;.    *pnCo
f210: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
f220: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
f230: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
f240: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f250: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
f260: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
f270: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
f280: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
f290: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
f2a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
f2b0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
f2c0: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
f2d0: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
f2e0: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
f2f0: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
f300: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
f310: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
f320: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
f330: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
f340: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
f350: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
f360: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
f370: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
f380: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
f390: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
f3a0: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
f3b0: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
f3c0: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
f3d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
f3e0: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
f3f0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
f400: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f410: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
f420: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
f430: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
f440: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
f450: 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
f460: 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
f470: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
f480: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
f490: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
f4a0: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
f4b0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
f4c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
f4d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
f4e0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
f4f0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
f500: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
f510: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
f520: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
f530: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
f540: 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d  a;.  u64 szAll =
f550: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
f560: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
f570: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
f580: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
f590: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
f5a0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
f5b0: 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
f5c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
f5d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f5e0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
f5f0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
f600: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
f610: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
f620: 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
f630: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
f640: 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
f650: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
f660: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
f670: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
f680: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
f690: 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  l++){.    const 
f6a0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
f6b0: 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70   int n, m;.    p
f6c0: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
f6d0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
f6e0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
f6f0: 2c 20 30 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73  , 0, 0, &pCol->s
f700: 7a 45 73 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c  zEst);.    szAll
f710: 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b   += pCol->szEst;
f720: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
f730: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
f740: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
f750: 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 28    if( zType && (
f760: 6d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  m = sqlite3Strle
f770: 6e 33 30 28 7a 54 79 70 65 29 29 3e 30 20 29 7b  n30(zType))>0 ){
f780: 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
f790: 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d  e3Strlen30(pCol-
f7a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
f7b0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Col->zName = sql
f7c0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
f7d0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
f7e0: 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20  ame, n+m+2);.   
f7f0: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61     if( pCol->zNa
f800: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  me ){.        me
f810: 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d  mcpy(&pCol->zNam
f820: 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d  e[n+1], zType, m
f830: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  +1);.        pCo
f840: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
f850: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
f860: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f870: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
f880: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
f890: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
f8a0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
f8b0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
f8c0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
f8d0: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
f8e0: 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43  Coll && pCol->zC
f8f0: 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
f900: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
f910: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
f920: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
f930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
f940: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71  b->szTabRow = sq
f950: 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c  lite3LogEst(szAl
f960: 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  l*4);.}../*.** G
f970: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
f980: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
f990: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
f9a0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
f9b0: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
f9c0: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
f9d0: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
f9e0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
f9f0: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
fa00: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
fa10: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
fa20: 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
fa30: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
fa40: 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46  db;.  int savedF
fa50: 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c  lags;..  savedFl
fa60: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
fa70: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
fa80: 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
fa90: 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ames;.  db->flag
faa0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
fab0: 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c  tColNames;.  sql
fac0: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
fad0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
fae0: 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
faf0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
fb00: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
fb10: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
fb20: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
fb30: 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66  >pPrior;.  db->f
fb40: 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67  lags = savedFlag
fb50: 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  s;.  pTab = sqli
fb60: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
fb70: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
fb80: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
fb90: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
fba0: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65   0;.  }.  /* The
fbb0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
fbc0: 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f  tOfSelect() is o
fbd0: 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65  nly used n conte
fbe0: 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73  xts where lookas
fbf0: 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ide.  ** is disa
fc00: 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  bled */.  assert
fc10: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
fc20: 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54  bDisable );.  pT
fc30: 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
fc40: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
fc50: 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77   0;.  pTab->nRow
fc60: 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
fc70: 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
fc80: 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
fc90: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  ) );.  sqlite3Co
fca0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
fcb0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
fcc0: 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
fcd0: 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
fce0: 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Col);.  sqlite3S
fcf0: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
fd00: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
fd10: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
fd20: 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
fd30: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
fd40: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
fd50: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
fd60: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
fd70: 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
fd80: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
fd90: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
fda0: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
fdb0: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
fdc0: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
fdd0: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
fde0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
fdf0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
fe00: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
fe10: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
fe20: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73   in pParse..*/.s
fe30: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
fe40: 4e 4c 49 4e 45 20 56 64 62 65 20 2a 61 6c 6c 6f  NLINE Vdbe *allo
fe50: 63 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  cVdbe(Parse *pPa
fe60: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
fe70: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
fe80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  = sqlite3VdbeCre
fe90: 61 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ate(pParse);.  i
fea0: 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64  f( v ) sqlite3Vd
feb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fec0: 6e 69 74 2c 20 30 2c 20 31 29 3b 0a 20 20 69 66  nit, 0, 1);.  if
fed0: 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
fee0: 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74  vel==0.   && Opt
fef0: 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
ff00: 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49  (pParse->db,SQLI
ff10: 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
ff20: 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72  t).  ){.    pPar
ff30: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
ff40: 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  r = 1;.  }.  ret
ff50: 75 72 6e 20 76 3b 0a 7d 0a 56 64 62 65 20 2a 73  urn v;.}.Vdbe *s
ff60: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
ff70: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
ff80: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
ff90: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 65 74 75 72  ->pVdbe;.  retur
ffa0: 6e 20 76 20 3f 20 76 20 3a 20 61 6c 6c 6f 63 56  n v ? v : allocV
ffb0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a  dbe(pParse);.}..
ffc0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
ffd0: 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
ffe0: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
fff0: 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
10000 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
10010 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78  t and pOffset ex
10020 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d  pressions.  pLim
10030 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68  it and pOffset h
10040 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
10050 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
10060 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
10070 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
10080 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
10090 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
100a0 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
100b0 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
100c0 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
100d0 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
100e0 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
100f0 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
10100 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
10110 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
10120 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
10130 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
10140 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
10150 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
10160 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
10170 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
10180 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
10190 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
101a0 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
101b0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
101c0 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
101d0 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
101e0 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
101f0 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
10200 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e  mit and pOffset.
10210 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
10220 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
10230 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
10240 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
10250 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
10260 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
10270 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
10280 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
10290 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
102a0 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
102b0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
102c0 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
102d0 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
102e0 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
102f0 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
10300 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
10310 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
10320 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
10330 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
10340 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
10350 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70  f pLimit!=0 or p
10360 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65  Offset!=0 do the
10370 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
10380 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65   get.** redefine
10390 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  d.  The UNION AL
103a0 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20  L operator uses 
103b0 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f  this property to
103c0 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65   force.** the re
103d0 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  use of the same 
103e0 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
103f0 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73   registers acros
10400 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45  s multiple.** SE
10410 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
10420 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10430 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
10440 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61  sters(Parse *pPa
10450 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
10460 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56  int iBreak){.  V
10470 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e  dbe *v = 0;.  in
10480 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  t iLimit = 0;.  
10490 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69  int iOffset;.  i
104a0 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69  nt n;.  if( p->i
104b0 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a  Limit ) return;.
104c0 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d  .  /* .  ** "LIM
104d0 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68  IT -1" always sh
104e0 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54  ows all rows.  T
104f0 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a  here is some.  *
10500 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62  * controversy ab
10510 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72  out what the cor
10520 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68  rect behavior sh
10530 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68  ould be..  ** Th
10540 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
10550 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72  entation interpr
10560 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f  ets "LIMIT 0" to
10570 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f   mean.  ** no ro
10580 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ws..  */.  sqlit
10590 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
105a0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
105b0 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
105c0 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d  0 || p->pLimit!=
105d0 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  0 );.  if( p->pL
105e0 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
105f0 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
10600 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
10610 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
10620 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10630 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
10640 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
10650 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
10660 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29  r(p->pLimit, &n)
10670 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10680 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10690 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
106a0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
106b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
106c0 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
106d0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
106e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
106f0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
10700 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
10710 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
10720 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69  >nSelectRow>sqli
10730 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
10740 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
10750 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
10760 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
10770 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  n);.        p->s
10780 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69  elFlags |= SF_Fi
10790 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  xedLimit;.      
107a0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
107b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
107c0 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
107d0 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  imit, iLimit);. 
107e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
107f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
10800 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
10810 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10820 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
10830 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
10840 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
10850 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10860 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
10870 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
10880 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
108a0 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
108b0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
108c0 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
108d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
108e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
108f0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
10900 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
10910 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
10920 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
10930 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10940 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
10950 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
10960 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10970 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
10980 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
10990 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
109a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
109b0 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
109c0 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
109d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
109e0 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
109f0 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
10a00 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  t+1, iOffset);. 
10a10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10a20 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
10a30 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ET"));.    }.  }
10a40 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10a50 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
10a60 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
10a70 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
10a80 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
10a90 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
10aa0 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
10ab0 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
10ac0 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
10ad0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
10ae0 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
10af0 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
10b00 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
10b10 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
10b20 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
10b30 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
10b40 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
10b50 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
10b60 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
10b70 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
10b80 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
10b90 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
10ba0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10bb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
10bc0 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
10bd0 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
10be0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
10bf0 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
10c00 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
10c10 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
10c20 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
10c30 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
10c40 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
10c50 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
10c60 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
10c70 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
10c80 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43  ol>=0 );.  /* iC
10c90 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20  ol must be less 
10ca0 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  than p->pEList->
10cb0 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73  nExpr.  Otherwis
10cc0 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64  e an error would
10cd0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
10ce0 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61  thrown during na
10cf0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e  me resolution an
10d00 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68  d we would not h
10d10 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20  ave gotten.  ** 
10d20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66  this far */.  if
10d30 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57  ( pRet==0 && ALW
10d40 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69  AYS(iCol<p->pELi
10d50 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
10d60 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
10d70 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
10d80 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
10d90 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
10da0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
10db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
10dc0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
10dd0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
10de0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
10df0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
10e00 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
10e10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
10e20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
10e30 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
10e40 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
10e50 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
10e60 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
10e70 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
10e80 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
10e90 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
10ea0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
10eb0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
10ec0 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
10ed0 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
10ee0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
10ef0 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
10f00 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
10f10 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
10f20 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
10f30 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
10f40 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
10f50 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
10f60 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
10f70 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
10f80 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
10f90 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
10fa0 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
10fb0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
10fc0 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
10fd0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10fe0 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
10ff0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
11000 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
11010 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
11020 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
11030 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
11040 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
11050 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
11060 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11070 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
11080 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
11090 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
110a0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
110b0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
110c0 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
110d0 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
110e0 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
110f0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
11100 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
11110 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
11120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11130 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
11140 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
11150 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
11160 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
11170 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
11180 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
11190 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
111a0 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
111b0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
111c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
111d0 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
111e0 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
111f0 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
11200 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
11210 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
11220 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
11230 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
11240 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
11250 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
11260 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
11270 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
11280 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
11290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
112a0 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
112b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
112c0 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
112d0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
112e0 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
112f0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
11300 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
11310 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
11320 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
11330 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
11340 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
11350 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
11360 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
11370 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11390 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
113a0 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
113b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
113c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
113e0 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
11400 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
11410 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
11420 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
11430 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
11440 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11450 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
11460 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
11470 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
11480 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  >a[].fg.isRecurs
11490 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ive flag..**.** 
114a0 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  The setup-query 
114b0 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e  runs once to gen
114c0 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c  erate an initial
114d0 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61   set of rows tha
114e0 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51  t go.** into a Q
114f0 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77  ueue table.  Row
11500 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
11510 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74  from the Queue t
11520 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f  able one by.** o
11530 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78  ne.  Each row ex
11540 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
11550 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20  ue is output to 
11560 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65  pDest.  Then the
11570 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61   single.** extra
11580 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e  cted row (now in
11590 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61   the iCurrent ta
115a0 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65  ble) becomes the
115b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
115c0 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  ** recursive-tab
115d0 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69  le for a recursi
115e0 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54  ve-query run.  T
115f0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
11600 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
11610 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63  .** is added bac
11620 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  k into the Queue
11630 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e   table.  Then an
11640 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74  other row is ext
11650 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
11660 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65  e.** and the ite
11670 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ration continues
11680 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
11690 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
116a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
116b0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65  mpound query ope
116c0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74  rator is UNION t
116d0 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  hen no duplicate
116e0 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a   rows are ever.*
116f0 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
11700 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
11710 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20    The iDistinct 
11720 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f  table keeps a co
11730 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a  py of all rows.*
11740 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72  * that have ever
11750 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
11760 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61  nto Queue and ca
11770 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20  uses duplicates 
11780 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64  to be.** discard
11790 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72  ed.  If the oper
117a0 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c  ator is UNION AL
117b0 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  L, then duplicat
117c0 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  es are allowed..
117d0 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ** .** If the qu
117e0 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52  ery has an ORDER
117f0 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65   BY, then entrie
11800 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74  s in the Queue t
11810 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e  able are kept in
11820 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64  .** ORDER BY ord
11830 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  er and the first
11840 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63   entry is extrac
11850 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63  ted for each cyc
11860 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20  le.  Without.** 
11870 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
11880 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
11890 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a  just a FIFO..**.
118a0 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c  ** If a LIMIT cl
118b0 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64  ause is provided
118c0 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
118d0 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72  tion stops after
118e0 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68   LIMIT rows.** h
118f0 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20  ave been output 
11900 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d  to pDest.  A LIM
11910 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73  IT of zero means
11920 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f   to output no ro
11930 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61  ws and a.** nega
11940 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73  tive LIMIT means
11950 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72   to output all r
11960 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ows.  If there i
11970 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54  s also an OFFSET
11980 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20   clause.** with 
11990 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
119a0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
119b0 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20   OFFSET outputs 
119c0 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61  are discarded ra
119d0 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69  ther.** than bei
119e0 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74  ng sent to pDest
119f0 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75  .  The LIMIT cou
11a00 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  nt does not begi
11a10 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46  n until after OF
11a20 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76  FSET.** rows hav
11a30 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a  e been skipped..
11a40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
11a50 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
11a60 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72  siveQuery(.  Par
11a70 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11a80 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
11a90 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
11aa0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
11ab0 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76   /* The recursiv
11ac0 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63  e SELECT to be c
11ad0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
11ae0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
11af0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
11b00 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
11b10 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
11b20 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
11b30 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
11b40 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
11b50 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
11b60 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
11b70 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
11b80 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  r;  /* Number of
11b90 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
11ba0 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20  recursive table 
11bb0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
11bc0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
11bd0 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
11be0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
11bf0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
11c00 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
11c10 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  tup = p->pPrior;
11c20 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20     /* The setup 
11c30 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61  query */.  int a
11c40 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
11c50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
11c60 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
11c70 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61   int addrCont, a
11c80 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f  ddrBreak;      /
11c90 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42  * CONTINUE and B
11ca0 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a  REAK addresses *
11cb0 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  /.  int iCurrent
11cc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11cd0 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74    /* The Current
11ce0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
11cf0 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20  regCurrent;     
11d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
11d10 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75  ister holding Cu
11d20 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
11d30 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20   int iQueue;    
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d50 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c  * The Queue tabl
11d60 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74  e */.  int iDist
11d70 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20  inct = 0;       
11d80 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72       /* To ensur
11d90 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73  e unique results
11da0 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69   if UNION */.  i
11db0 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46  nt eDest = SRT_F
11dc0 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ifo;         /* 
11dd0 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20  How to write to 
11de0 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63  Queue */.  Selec
11df0 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b  tDest destQueue;
11e00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
11e10 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e  ctDest targettin
11e20 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  g the Queue tabl
11e30 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11e60 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
11e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11e80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
11e90 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  t code */.  Expr
11ea0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
11eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11ec0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11ed0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
11ee0 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20  it, *pOffset;   
11ef0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d      /* Saved LIM
11f00 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
11f10 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c  .  int regLimit,
11f20 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20   regOffset;     
11f30 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73   /* Registers us
11f40 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20  ed by LIMIT and 
11f50 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20  OFFSET */..  /* 
11f60 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61  Obtain authoriza
11f70 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63  tion to do a rec
11f80 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
11f90 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
11fa0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
11fb0 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c  QLITE_RECURSIVE,
11fc0 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
11fd0 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73  rn;..  /* Proces
11fe0 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  s the LIMIT and 
11ff0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20  OFFSET clauses, 
12000 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f  if they exist */
12010 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  .  addrBreak = s
12020 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
12030 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
12040 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20  lectRow = 320;  
12050 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77  /* 4 billion row
12060 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
12070 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
12080 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
12090 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
120a0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66  ->pLimit;.  pOff
120b0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
120c0 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70  ;.  regLimit = p
120d0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f  ->iLimit;.  regO
120e0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
120f0 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  et;.  p->pLimit 
12100 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  = p->pOffset = 0
12110 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
12120 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
12130 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
12140 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
12150 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f  Locate the curso
12160 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
12170 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
12180 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41  .  for(i=0; ALWA
12190 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29  YS(i<pSrc->nSrc)
121a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
121b0 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73  pSrc->a[i].fg.is
121c0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
121d0 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53     iCurrent = pS
121e0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
121f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12200 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
12210 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20  llocate cursors 
12220 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75  numbers for Queu
12230 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  e and Distinct. 
12240 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   The cursor numb
12250 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  er for.  ** the 
12260 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d  Distinct table m
12270 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f  ust be exactly o
12280 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ne greater than 
12290 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20  Queue in order. 
122a0 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f   ** for the SRT_
122b0 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54  DistFifo and SRT
122c0 5f 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69  _DistQueue desti
122d0 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e  nations to work.
122e0 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70   */.  iQueue = p
122f0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
12300 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
12310 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73  NION ){.    eDes
12320 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53  t = pOrderBy ? S
12330 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53  RT_DistQueue : S
12340 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20  RT_DistFifo;.   
12350 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61   iDistinct = pPa
12360 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d  rse->nTab++;.  }
12370 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20  else{.    eDest 
12380 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54  = pOrderBy ? SRT
12390 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66  _Queue : SRT_Fif
123a0 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  o;.  }.  sqlite3
123b0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
123c0 64 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74  destQueue, eDest
123d0 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
123e0 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
123f0 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51  s for Current, Q
12400 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e  ueue, and Distin
12410 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72  ct. */.  regCurr
12420 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ent = ++pParse->
12430 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
12440 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12450 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72  OpenPseudo, iCur
12460 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74  rent, regCurrent
12470 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70  , nCol);.  if( p
12480 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
12490 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
124a0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72   = multiSelectOr
124b0 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61  derByKeyInfo(pPa
124c0 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20  rse, p, 1);.    
124d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
124e0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
124f0 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70  meral, iQueue, p
12500 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
12510 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
12520 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
12530 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
12540 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73  EYINFO);.    des
12550 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20  tQueue.pOrderBy 
12560 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65  = pOrderBy;.  }e
12570 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
12580 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12590 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
125a0 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20  iQueue, nCol);. 
125b0 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74   }.  VdbeComment
125c0 28 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c  ((v, "Queue tabl
125d0 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73  e"));.  if( iDis
125e0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e  tinct ){.    p->
125f0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
12600 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12610 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
12620 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e  hemeral, iDistin
12630 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73  ct, 0);.    p->s
12640 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
12650 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d  esEphemeral;.  }
12660 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68  ..  /* Detach th
12670 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
12680 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f  e from the compo
12690 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
126a0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
126b0 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65  ..  /* Store the
126c0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
126d0 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51  setup-query in Q
126e0 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75  ueue. */.  pSetu
126f0 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  p->pNext = 0;.  
12700 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
12710 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75  ct(pParse, pSetu
12720 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a  p, &destQueue);.
12730 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
12740 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20  = p;.  if( rc ) 
12750 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75  goto end_of_recu
12760 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20  rsive_query;..  
12770 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74  /* Find the next
12780 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75   row in the Queu
12790 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61  e and output tha
127a0 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54  t row */.  addrT
127b0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
127c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
127d0 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64  ind, iQueue, add
127e0 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  rBreak); VdbeCov
127f0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
12800 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78  Transfer the nex
12810 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f  t row in Queue o
12820 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a  ver to Current *
12830 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
12840 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
12850 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20  Row, iCurrent); 
12860 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75  /* To reset colu
12870 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66  mn cache */.  if
12880 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
12890 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
128a0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
128b0 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
128c0 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67  By->nExpr+1, reg
128d0 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73  Current);.  }els
128e0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
128f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12900 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20  owData, iQueue, 
12910 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
12920 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12930 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
12940 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  e, iQueue);..  /
12950 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e  * Output the sin
12960 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
12970 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74  nt */.  addrCont
12980 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
12990 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
129a0 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f  deOffset(v, regO
129b0 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29  ffset, addrCont)
129c0 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  ;.  selectInnerL
129d0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
129e0 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65  ->pEList, iCurre
129f0 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20  nt,.      0, 0, 
12a00 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c  pDest, addrCont,
12a10 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
12a20 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20  f( regLimit ){. 
12a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12a40 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
12a50 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69  umpZero, regLimi
12a60 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
12a70 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
12a80 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
12a90 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
12aa0 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  l(v, addrCont);.
12ab0 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
12ac0 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
12ad0 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69  CT taking the si
12ae0 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
12af0 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ent as.  ** the 
12b00 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65  value for the re
12b10 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53  cursive-table. S
12b20 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
12b30 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20   in the Queue.. 
12b40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
12b50 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
12b60 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  gate ){.    sqli
12b70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12b80 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61  se, "recursive a
12b90 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
12ba0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29   not supported")
12bb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12bc0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
12bd0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
12be0 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
12bf0 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65  Queue);.    asse
12c00 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
12c10 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   );.    p->pPrio
12c20 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a  r = pSetup;.  }.
12c30 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69  .  /* Keep runni
12c40 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69  ng the loop unti
12c50 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65  l the Queue is e
12c60 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mpty */.  sqlite
12c70 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
12c80 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  rTop);.  sqlite3
12c90 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12ca0 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
12cb0 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76  .end_of_recursiv
12cc0 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74  e_query:.  sqlit
12cd0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
12ce0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
12cf0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e  pOrderBy);.  p->
12d00 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
12d10 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  rBy;.  p->pLimit
12d20 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e   = pLimit;.  p->
12d30 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
12d40 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  t;.  return;.}.#
12d50 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12d60 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20  OMIT_CTE */../* 
12d70 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
12d80 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
12d90 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
12da0 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
12db0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
12dc0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
12dd0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
12de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12df0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
12e00 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
12e10 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
12e20 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
12e30 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
12e40 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
12e50 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e  */.);../*.** Han
12e60 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  dle the special 
12e70 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75  case of a compou
12e80 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
12e90 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
12ea0 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73  .** VALUES claus
12eb0 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20  e.  By handling 
12ec0 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61  this as a specia
12ed0 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64  l case, we avoid
12ee0 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69   deep.** recursi
12ef0 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20  on, and thus do 
12f00 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f  not need to enfo
12f10 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  rce the SQLITE_L
12f20 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
12f30 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c  LECT.** on a VAL
12f40 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  UES clause..**.*
12f50 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65  * Because the Se
12f60 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67  lect object orig
12f70 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41  inates from a VA
12f80 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20  LUES clause:.** 
12f90 20 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20    (1) It has no 
12fa0 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a  LIMIT or OFFSET.
12fb0 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72  **   (2) All ter
12fc0 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c  ms are UNION ALL
12fd0 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20  .**   (3) There 
12fe0 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
12ff0 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  lause.*/.static 
13000 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56  int multiSelectV
13010 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a  alues(.  Parse *
13020 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
13030 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13040 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
13050 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13060 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
13070 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
13080 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
13090 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
130a0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
130b0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
130c0 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  s */.){.  Select
130d0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20   *pPrior;.  int 
130e0 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20  nRow = 1;.  int 
130f0 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
13100 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
13110 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b  SF_MultiValue );
13120 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72  .  do{.    asser
13130 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
13140 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20   SF_Values );.  
13150 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
13160 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f  =TK_ALL || (p->o
13170 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
13180 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b  p->pPrior==0) );
13190 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
131a0 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20  pLimit==0 );.   
131b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
131c0 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  set==0 );.    as
131d0 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
131e0 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  0 || p->pEList->
131f0 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d  nExpr==p->pNext-
13200 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
13210 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
13220 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ior==0 ) break;.
13230 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13240 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
13250 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  );.    p = p->pP
13260 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b  rior;.    nRow++
13270 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20  ;.  }while(1);. 
13280 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
13290 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
132a0 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  ior;.    p->pPri
132b0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  or = 0;.    rc =
132c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
132d0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
132e0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
132f0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66  = pPrior;.    if
13300 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
13310 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13320 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
13330 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
13340 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13350 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13360 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
13370 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
13380 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
13390 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
133a0 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
133b0 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
133c0 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
133d0 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
133e0 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
133f0 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
13400 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
13410 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
13420 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
13430 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
13440 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
13450 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
13460 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
13470 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
13480 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
13490 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
134a0 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
134b0 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
134c0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
134d0 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
134e0 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
134f0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
13500 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
13510 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
13520 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
13530 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
13540 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
13550 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
13560 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
13570 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
13580 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
13590 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
135a0 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
135b0 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
135c0 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
135d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
135e0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
135f0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
13600 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
13610 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
13620 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
13640 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
13650 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
13660 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
13670 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
13680 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
13690 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
136a0 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
136b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
136c0 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
136d0 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
136e0 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
136f0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
13700 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
13710 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
13720 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
13730 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
13740 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
13750 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
13760 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
13770 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
13780 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
13790 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
137a0 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
137b0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
137c0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
137d0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
137e0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
137f0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
13800 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
13810 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
13820 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
13830 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
13840 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
13850 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
13860 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
13870 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
13880 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13890 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
138a0 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
138b0 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
138c0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
138d0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
138e0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
138f0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
13900 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
13910 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
13920 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
13930 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
13940 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
13950 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
13960 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
13970 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
13980 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
13990 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
139a0 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
139b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
139c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
139d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
139e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
139f0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
13a00 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20  nt iSub1 = 0;   
13a10 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
13a20 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
13a30 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
13a40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
13a50 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
13a60 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
13a70 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
13a80 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
13a90 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
13aa0 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
13ab0 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
13ac0 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
13ad0 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
13ae0 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
13af0 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
13b00 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
13b10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13b20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
13b30 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
13b40 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
13b50 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
13b60 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
13b70 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
13b80 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
13b90 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
13ba0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
13bb0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
13bc0 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
13bd0 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20  >pPrior;.  dest 
13be0 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
13bf0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
13c00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
13c10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
13c20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13c30 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
13c40 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
13c50 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
13c60 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
13c70 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
13c80 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
13c90 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
13ca0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
13cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13cc0 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
13cd0 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
13ce0 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
13cf0 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
13d00 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
13d10 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
13d20 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
13d30 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13d40 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   }..  v = sqlite
13d50 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13d60 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
13d70 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45   );  /* The VDBE
13d80 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
13d90 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63   by calling func
13da0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72  tion */..  /* Cr
13db0 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
13dc0 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
13dd0 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
13de0 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  y.  */.  if( des
13df0 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  t.eDest==SRT_Eph
13e00 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  emTab ){.    ass
13e10 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
13e20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13e30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
13e40 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73  enEphemeral, des
13e50 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45  t.iSDParm, p->pE
13e60 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
13e70 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
13e80 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
13e90 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64   /* Special hand
13ea0 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ling for a compo
13eb0 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
13ec0 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20  originates as a 
13ed0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20  VALUES clause.. 
13ee0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
13ef0 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69  Flags & SF_Multi
13f00 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20  Value ){.    rc 
13f10 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c  = multiSelectVal
13f20 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ues(pParse, p, &
13f30 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20  dest);.    goto 
13f40 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13f50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
13f60 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54   sure all SELECT
13f70 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
13f80 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  nt have the same
13f90 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
13fa0 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69  nts.  ** in thei
13fb0 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20  r result sets.. 
13fc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
13fd0 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
13fe0 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61  r->pEList );.  a
13ff0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
14000 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d  ->nExpr==pPrior-
14010 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
14020 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
14030 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28  E_OMIT_CTE.  if(
14040 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
14050 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
14060 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52     generateWithR
14070 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50  ecursiveQuery(pP
14080 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
14090 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
140a0 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
140b0 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
140c0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
140d0 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
140e0 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
140f0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
14100 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
14110 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
14120 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
14130 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Dest);.  }else..
14140 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
14150 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
14160 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
14170 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
14180 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
14190 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
141a0 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
141b0 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
141c0 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
141d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
141e0 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
141f0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
14200 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
14210 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
14220 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
14230 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  set;.      pPrio
14240 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
14250 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
14260 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
14270 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
14280 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14290 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
142a0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
142b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
142c0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
142d0 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
142e0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
142f0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
14300 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
14310 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
14320 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
14330 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
14340 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
14350 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
14360 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
14370 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
14380 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
14390 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
143a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
143b0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
143c0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
143d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
143e0 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  Not, p->iLimit);
143f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14400 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
14410 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
14420 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
14430 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
14440 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65     if( p->iOffse
14450 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
14460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14470 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d  (v, OP_OffsetLim
14480 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144a0 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f  p->iLimit, p->iO
144b0 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66  ffset+1, p->iOff
144c0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
144d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
144e0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
144f0 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
14500 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
14510 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14520 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14530 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  p, &dest);.     
14540 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
14550 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
14560 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
14570 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
14580 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
14590 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
145a0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
145b0 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65  gEstAdd(p->nSele
145c0 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e  ctRow, pPrior->n
145d0 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
145e0 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
145f0 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73  imit.       && s
14600 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
14610 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  ger(pPrior->pLim
14620 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20  it, &nLimit).   
14630 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20      && nLimit>0 
14640 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  && p->nSelectRow
14650 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   > sqlite3LogEst
14660 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20  ((u64)nLimit) . 
14670 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14680 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
14690 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
146a0 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20  64)nLimit);.    
146b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64    }.      if( ad
146c0 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dr ){.        sq
146d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
146e0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
146f0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
14700 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14710 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
14720 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
14730 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
14740 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
14750 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
14760 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
14770 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
14780 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30  .      u8 op = 0
14790 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ;       /* One o
147a0 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
147b0 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
147c0 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
147d0 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
147e0 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
147f0 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
14800 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
14810 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
14820 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
14830 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
14840 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
14850 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
14860 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
14870 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
14880 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
14890 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
148a0 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
148b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
148c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
148d0 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  N );.      prior
148e0 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  Op = SRT_Union;.
148f0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
14900 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest==priorOp ){
14910 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
14920 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
14930 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
14940 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
14950 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
14960 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
14970 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
14980 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
14990 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74  0 );      /* Not
149a0 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
149b0 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
149c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
149d0 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29   p->pOffset==0 )
149e0 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c  ;     /* Not all
149f0 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
14a00 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
14a10 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
14a20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
14a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14a40 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
14a50 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
14a60 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
14a70 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
14a80 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
14a90 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
14aa0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
14ab0 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
14ac0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
14ad0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14ae0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
14af0 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  ;.        addr =
14b00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14b10 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14b20 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62  emeral, unionTab
14b30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , 0);.        as
14b40 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
14b50 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
14b60 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64  ;.        p->add
14b70 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
14b80 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  ddr;.        fin
14b90 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73  dRightmost(p)->s
14ba0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
14bb0 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
14bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14bd0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
14be0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
14bf0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
14c00 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
14c10 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
14c20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
14c30 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
14c40 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
14c50 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f  ctDestInit(&unio
14c60 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20  ndest, priorOp, 
14c70 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20  unionTab);.     
14c80 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14c90 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
14ca0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14cb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14cc0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14cd0 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f  e, pPrior, &unio
14ce0 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  ndest);.      if
14cf0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
14d00 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14d10 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
14d20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
14d30 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
14d40 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
14d50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
14d60 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
14d70 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  {.        op = S
14d80 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20  RT_Except;.     
14d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14da0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
14db0 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
14dc0 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
14dd0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
14de0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
14df0 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
14e00 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
14e10 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
14e20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
14e30 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
14e40 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
14e50 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74  .      uniondest
14e60 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
14e70 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14e80 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
14e90 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14ea0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
14eb0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
14ec0 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
14ed0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
14ee0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14ef0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51  OK );.      /* Q
14f00 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
14f10 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
14f20 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
14f30 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
14f40 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
14f50 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
14f60 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
14f70 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
14f80 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
14f90 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
14fa0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
14fb0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70  rderBy);.      p
14fc0 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
14fd0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
14fe0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
14ff0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
15000 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
15010 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
15020 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
15030 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
15040 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
15050 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
15060 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
15070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
15080 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
15090 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
150a0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
150b0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
150c0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
150d0 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
150e0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
150f0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
15100 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
15110 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
15120 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
15130 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
15140 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
15150 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
15160 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
15170 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
15180 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73  t( unionTab==des
15190 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73  t.iSDParm || des
151a0 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
151b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
151c0 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
151d0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
151e0 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
151f0 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
15200 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15210 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
15220 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
15230 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
15240 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
15250 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
15260 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
15270 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
15280 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
15290 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
152a0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
152b0 73 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74  s(pParse, pFirst
152c0 2d 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e  ->pSrc, pFirst->
152d0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
152e0 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
152f0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
15300 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
15310 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
15320 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15330 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
15340 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
15350 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
15360 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
15370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15380 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
15390 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
153a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
153b0 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  v);.        iSta
153c0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
153d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
153e0 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
153f0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
15400 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
15410 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ionTab,.        
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
15440 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
15450 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15460 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15470 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
15480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15490 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
154a0 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
154b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
154c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
154d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
154e0 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
154f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15500 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
15510 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
15520 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15530 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15540 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
15550 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  t( p->op==TK_INT
15560 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20  ERSECT ); {.    
15570 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
15580 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
15590 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
155a0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
155b0 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
155c0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
155d0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
155e0 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
155f0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
15600 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
15610 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
15620 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
15630 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
15640 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
15650 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
15660 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
15670 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
15680 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
15690 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
156a0 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
156b0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
156c0 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
156d0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
156e0 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
156f0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
15700 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
15710 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64  ==0 );..      ad
15720 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
15730 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
15740 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31  nEphemeral, tab1
15750 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
15760 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
15770 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
15780 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
15790 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
157a0 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74  .      findRight
157b0 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
157c0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
157d0 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73  meral;.      ass
157e0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
157f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
15800 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
15810 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
15820 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
15830 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
15840 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
15850 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65  ctDestInit(&inte
15860 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55  rsectdest, SRT_U
15870 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20  nion, tab1);.   
15880 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
15890 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
158a0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
158b0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
158c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
158d0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
158e0 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
158f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
15900 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
15910 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
15920 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
15930 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
15940 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
15950 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
15960 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  2".      */.    
15970 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
15980 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15990 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
159a0 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
159b0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
159c0 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
159d0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
159e0 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61  rOpenEphm[1] = a
159f0 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ddr;.      p->pP
15a00 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
15a10 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
15a20 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
15a30 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
15a40 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
15a50 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
15a60 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
15a70 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
15a80 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  SDParm = tab2;. 
15a90 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15aa0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
15ab0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15ac0 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15ad0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15ae0 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
15af0 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
15b00 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
15b10 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
15b20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
15b30 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
15b40 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
15b50 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
15b60 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
15b70 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
15b80 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
15b90 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
15ba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15bb0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
15bc0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
15bd0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
15be0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
15bf0 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
15c00 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
15c10 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
15c20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
15c30 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
15c40 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
15c50 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
15c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15c70 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
15c80 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
15c90 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
15ca0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
15cb0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
15cc0 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
15cd0 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
15ce0 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
15cf0 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65  or;.        gene
15d00 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
15d10 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e  pParse, pFirst->
15d20 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45  pSrc, pFirst->pE
15d30 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
15d40 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
15d50 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15d60 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
15d70 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
15d80 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15d90 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
15da0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
15db0 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
15dc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15dd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
15de0 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
15df0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15e00 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  v);.      r1 = s
15e10 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
15e20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
15e30 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
15e40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15e50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20  _RowData, tab1, 
15e60 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
15e70 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
15e80 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
15e90 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
15ea0 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
15eb0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
15ec0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15ed0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
15ee0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
15ef0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15f00 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
15f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15f20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
15f30 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
15f40 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
15f50 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15f60 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
15f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15f80 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
15f90 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20   tab1, iStart); 
15fa0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15fc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15fd0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
15fe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ff0 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
16000 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
16010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16020 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
16030 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
16040 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16050 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
16060 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
16070 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
16080 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b   p->op!=TK_ALL);
16090 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
160a0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
160b0 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  es used by .  **
160c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
160d0 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
160e0 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
160f0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
16100 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
16110 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
16120 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
16130 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
16140 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
16150 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
16160 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
16170 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
16180 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
16190 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
161a0 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
161b0 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
161c0 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
161d0 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
161e0 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
161f0 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
16200 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
16210 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
16220 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
16230 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
16240 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73  lFlags & SF_Uses
16250 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20  Ephemeral ){.   
16260 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16280 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
16290 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
162a0 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
162b0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
162c0 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
162d0 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
162e0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
162f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
16300 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
16310 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
16320 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
16330 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
16340 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
16350 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
16360 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
16370 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
16380 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
163a0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
163b0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
163c0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
163d0 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a   p->pNext==0 );.
163e0 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45      nCol = p->pE
163f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
16400 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
16410 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
16420 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  db, nCol, 1);.  
16430 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
16440 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
16450 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
16460 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
16470 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
16480 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c    }.    for(i=0,
16490 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f   apColl=pKeyInfo
164a0 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b  ->aColl; i<nCol;
164b0 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b   i++, apColl++){
164c0 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d  .      *apColl =
164d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
164e0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
164f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
16500 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  *apColl ){.     
16510 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d     *apColl = db-
16520 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
16530 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
16540 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
16550 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
16560 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66  pPrior){.      f
16570 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
16580 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
16590 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64  ddr = pLoop->add
165a0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20  rOpenEphm[i];.  
165b0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30        if( addr<0
165c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
165d0 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65   If [0] is unuse
165e0 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c  d then [1] is al
165f0 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77  so unused.  So w
16600 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20  e can.          
16610 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79  ** always safely
16620 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61   abort as soon a
16630 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73  s the first unus
16640 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64  ed slot is found
16650 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
16660 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64  sert( pLoop->add
16670 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29  rOpenEphm[1]<0 )
16680 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
16690 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
166a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
166b0 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
166c0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
166d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
166e0 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63  geP4(v, addr, (c
166f0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
16700 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
16710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
16730 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
16740 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
16750 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
16760 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16770 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
16780 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
16790 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65  .  }..multi_sele
167a0 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d  ct_end:.  pDest-
167b0 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53  >iSdst = dest.iS
167c0 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  dst;.  pDest->nS
167d0 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74  dst = dest.nSdst
167e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
167f0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
16800 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ete);.  return r
16810 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
16820 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
16830 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
16840 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61  *.** Error messa
16850 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20  ge for when two 
16860 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66  or more terms of
16870 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
16880 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ct have differen
16890 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74  t.** size result
168a0 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   sets..*/.void s
168b0 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e  qlite3SelectWron
168c0 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50  gNumTermsError(P
168d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
168e0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
168f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
16900 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73  _Values ){.    s
16910 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16920 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55  Parse, "all VALU
16930 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ES must have the
16940 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
16950 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65  terms");.  }else
16960 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
16970 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
16980 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
16990 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
169a0 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
169b0 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
169c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
169d0 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
169e0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
169f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
16a00 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75  ode an output su
16a10 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63  broutine for a c
16a20 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65  oroutine impleme
16a30 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20  ntation of a.** 
16a40 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e  SELECT statment.
16a50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20  .**.** The data 
16a60 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20  to be output is 
16a70 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e  contained in pIn
16a80 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20  ->iSdst.  There 
16a90 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73  are.** pIn->nSds
16aa0 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  t columns to be 
16ab0 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69  output.  pDest i
16ac0 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70  s where the outp
16ad0 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ut should.** be 
16ae0 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52  sent..**.** regR
16af0 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d  eturn is the num
16b00 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73  ber of the regis
16b10 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
16b20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  subroutine.** re
16b30 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a  turn address..**
16b40 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30  .** If regPrev>0
16b50 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
16b60 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
16b70 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a  n a vector that.
16b80 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70  ** records the p
16b90 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
16ba0 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73   mem[regPrev] is
16bb0 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20   a flag that is 
16bc0 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72  false.** if ther
16bd0 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72  e has been no pr
16be0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
16bf0 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
16c00 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e  n code is.** gen
16c10 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65  erated to suppre
16c20 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20  ss duplicates.  
16c30 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64  pKeyInfo is used
16c40 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a   for comparing.*
16c50 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  * keys..**.** If
16c60 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64   the LIMIT found
16c70 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73   in p->iLimit is
16c80 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69   reached, jump i
16c90 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a  mmediately to.**
16ca0 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74   iBreak..*/.stat
16cb0 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f  ic int generateO
16cc0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
16cd0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16ce0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
16cf0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
16d00 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
16d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16d20 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
16d30 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  nt */.  SelectDe
16d40 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20  st *pIn,        
16d50 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70  /* Coroutine sup
16d60 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  plying data */. 
16d70 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
16d80 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72  st,      /* Wher
16d90 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61  e to send the da
16da0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ta */.  int regR
16db0 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20  eturn,          
16dc0 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64  /* The return ad
16dd0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a  dress register *
16de0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c  /.  int regPrev,
16df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16e00 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72  revious result r
16e10 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69  egister.  No uni
16e20 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a  queness if 0 */.
16e30 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
16e40 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72  nfo,      /* For
16e50 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20   comparing with 
16e60 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a  previous entry *
16e70 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
16e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
16e90 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68  ump here if we h
16ea0 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a  it the LIMIT */.
16eb0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
16ec0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
16ed0 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20  int iContinue;. 
16ee0 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64   int addr;..  ad
16ef0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
16f00 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16f10 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71    iContinue = sq
16f20 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
16f30 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70  el(v);..  /* Sup
16f40 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
16f50 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45   for UNION, EXCE
16f60 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
16f70 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  T .  */.  if( re
16f80 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74  gPrev ){.    int
16f90 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20   addr1, addr2;. 
16fa0 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
16fb0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16fc0 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65  OP_IfNot, regPre
16fd0 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  v); VdbeCoverage
16fe0 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  (v);.    addr2 =
16ff0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17000 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
17010 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
17020 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
17030 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dst,.           
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17050 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
17060 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
17070 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
17080 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
17090 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
170a0 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69  Jump, addr2+2, i
170b0 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b  Continue, addr2+
170c0 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
170d0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
170e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
170f0 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
17100 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17110 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69   OP_Copy, pIn->i
17120 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
17130 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a   pIn->nSdst-1);.
17140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17150 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
17160 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
17170 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
17180 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
17190 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
171a0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
171b0 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
171c0 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
171d0 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
171e0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
171f0 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
17200 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
17210 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  );..  assert( pD
17220 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
17230 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65  Exists );.  asse
17240 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
17250 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  !=SRT_Table );. 
17260 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e   switch( pDest->
17270 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
17280 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
17290 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
172a0 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
172b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
172c0 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
172d0 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
172e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
172f0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
17300 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
17310 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17330 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
17340 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
17350 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
17360 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
17370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17380 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
17390 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
173a0 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
173b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
173c0 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
173d0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72  ->iSDParm, r1, r
173e0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
173f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
17400 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
17410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
17420 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17430 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
17440 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17450 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
17460 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17470 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
17480 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
17490 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
174a0 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
174b0 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
174c0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
174d0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  "..    */.    ca
174e0 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
174f0 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
17500 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d    testcase( pIn-
17510 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20  >nSdst>1 );.    
17520 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
17530 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17540 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17550 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
17560 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
17570 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17580 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72  st, .          r
17590 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  1, pDest->zAffSd
175a0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
175b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
175c0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
175d0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
175e0 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
175f0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
17600 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
17610 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
17620 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
17630 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20  m, r1,.         
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49    pIn->iSdst, pI
17660 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17670 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17680 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17690 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
176a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
176b0 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
176c0 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
176d0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
176e0 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
176f0 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
17700 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
17710 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
17720 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
17730 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
17740 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
17750 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
17760 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
17770 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
17780 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==1 || pParse->n
17790 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61  Err>0 );  testca
177a0 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d  se( pIn->nSdst!=
177b0 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
177c0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
177d0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
177e0 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
177f0 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
17800 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
17810 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
17820 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
17830 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
17840 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
17850 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
17860 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
17870 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  /..    /* The re
17880 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
17890 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
178a0 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
178b0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
178c0 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68  Dest->iSdst.  Th
178d0 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  en the co-routin
178e0 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e yields..    */
178f0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
17900 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
17910 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
17920 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
17930 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73  pDest->iSdst = s
17940 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
17950 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
17960 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nSdst);.        
17970 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70  pDest->nSdst = p
17980 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20  In->nSdst;.     
17990 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
179a0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
179b0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
179c0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70   pDest->iSdst, p
179d0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
179e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
179f0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
17a00 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
17a10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17a20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
17a30 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76  none of the abov
17a40 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e, then the resu
17a50 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d  lt destination m
17a60 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52  ust be.    ** SR
17a70 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20  T_Output.  This 
17a80 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
17a90 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79   called with any
17aa0 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65   other.    ** de
17ab0 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20  stination other 
17ac0 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61  than the ones ha
17ad0 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53  ndled above or S
17ae0 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a  RT_Output..    *
17af0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54  *.    ** For SRT
17b00 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73  _Output, results
17b10 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
17b20 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
17b30 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a  isters.  .    **
17b40 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73   Then the OP_Res
17b50 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73  ultRow opcode is
17b60 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73   used to cause s
17b70 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f  qlite3_step() to
17b80 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  .    ** return t
17b90 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72  he next row of r
17ba0 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  esult..    */.  
17bb0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
17bc0 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
17bd0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
17be0 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  put );.      sql
17bf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17c00 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
17c10 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
17c20 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
17c30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
17c40 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
17c50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
17c60 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17c70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17c80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
17c90 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
17ca0 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
17cb0 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
17cc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
17cd0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
17ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17cf0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
17d00 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
17d10 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
17d20 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
17d30 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
17d40 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
17d50 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
17d60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
17d70 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
17d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17d90 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
17da0 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
17db0 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
17dc0 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76  /*.** Alternativ
17dd0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
17de0 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  t code generator
17df0 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20   for cases when 
17e00 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f  there.** is an O
17e10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
17e20 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
17e30 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
17e40 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a  ollowing form:.*
17e50 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63  *.**      <selec
17e60 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20  tA>  <operator> 
17e70 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45   <selectB>  ORDE
17e80 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73  R BY <orderbylis
17e90 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74  t>.**.** <operat
17ea0 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e  or> is one of UN
17eb0 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20  ION ALL, UNION, 
17ec0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
17ed0 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a  SECT.  The idea.
17ee0 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f  ** is to code bo
17ef0 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64  th <selectA> and
17f00 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20   <selectB> with 
17f10 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
17f20 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75  use as.** co-rou
17f30 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e  tines.  Then run
17f40 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73   the co-routines
17f50 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64   in parallel and
17f60 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c   merge the resul
17f70 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f  ts.** into the o
17f80 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74  utput.  In addit
17f90 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63  ion to the two c
17fa0 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65  oroutines (calle
17fb0 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a  d selectA and.**
17fc0 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20   selectB) there 
17fd0 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65  are 7 subroutine
17fe0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41  s:.**.**    outA
17ff0 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
18000 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
18010 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctA coroutine in
18020 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
18040 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
18050 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  ry..**.**    out
18060 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  B:    Move the o
18070 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
18080 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectB coroutine i
18090 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
180a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
180b0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
180c0 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65  ery.  (Only gene
180d0 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20  rated for UNION 
180e0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
180f0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45     UNION ALL.  E
18100 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54  XCEPT and INSERT
18110 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75  SECT never outpu
18120 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20  t a row that.** 
18130 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
18140 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a  ars only in B.).
18150 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20  **.**    AltB:  
18160 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
18170 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
18180 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
18190 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20   and A<B..**.** 
181a0 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c     AeqB:    Call
181b0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
181c0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
181d0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
181e0 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67  ==B..**.**    Ag
181f0 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
18200 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
18210 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
18220 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a  tines and A>B..*
18230 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20  *.**    EofA:   
18240 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
18250 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
18260 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a  rom selectA..**.
18270 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43  **    EofB:    C
18280 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
18290 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
182a0 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a  m selectB..**.**
182b0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
182c0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65  ion of the latte
182d0 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e  r five subroutin
182e0 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69  es depend on whi
182f0 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  ch .** <operator
18300 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a  > is used:.**.**
18310 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18320 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20  UNION ALL       
18330 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20    UNION         
18340 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20     EXCEPT       
18350 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20     INTERSECT.** 
18360 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
18370 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
18380 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
18390 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
183a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
183b0 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20    AltB:   outA, 
183c0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
183d0 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
183e0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
183f0 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
18400 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  eqB:   outA, nex
18410 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
18430 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c  tA         outA,
18440 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
18450 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  gtB:   outB, nex
18460 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
18470 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78  xtB          nex
18480 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  tB            ne
18490 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41  xtB.**.**   EofA
184a0 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
184b0 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
184c0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20            halt  
184d0 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a             halt.
184e0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20  **.**   EofB:   
184f0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
18500 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
18510 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
18520 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
18530 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41  * In the AltB, A
18540 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75  eqB, and AgtB su
18550 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f  broutines, an EO
18560 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67  F on A following
18570 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73   nextA.** causes
18580 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
18590 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61  mp to EofA and a
185a0 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f  n EOF on B follo
185b0 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65  wing nextB cause
185c0 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74  s.** an immediat
185d0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20  e jump to EofB. 
185e0 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64   Within EofA and
185f0 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f   EofB, and EOF o
18600 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f  n entry or.** fo
18610 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61  llowing nextX ca
18620 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74  uses a jump to t
18630 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65  he end of the se
18640 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  lect processing.
18650 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  .**.** Duplicate
18660 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20   removal in the 
18670 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
18680 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73  nd INTERSECT cas
18690 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a  es is handled.**
186a0 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70   within the outp
186b0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ut subroutine.  
186c0 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69  The regPrev regi
186d0 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74  ster set holds t
186e0 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  he previously.**
186f0 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20   output value.  
18700 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  A comparison is 
18710 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69  made against thi
18720 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  s value and the 
18730 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69  output.** is ski
18740 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74  pped if the next
18750 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62   results would b
18760 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
18770 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a  e previous..**.*
18780 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
18790 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20  tion plan is to 
187a0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77  implement the tw
187b0 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  o coroutines and
187c0 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75   seven.** subrou
187d0 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65  tines first, the
187e0 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f  n put the contro
187f0 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62  l logic at the b
18800 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69  ottom.  Like thi
18810 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
18820 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20    goto Init.**  
18830 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e     coA: coroutin
18840 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79  e for left query
18850 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a   (A).**     coB:
18860 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
18870 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a  ight query (B).*
18880 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75  *    outA: outpu
18890 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a  t one row of A.*
188a0 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75  *    outB: outpu
188b0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28  t one row of B (
188c0 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20  UNION and UNION 
188d0 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20  ALL only).**    
188e0 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofA: ....**    
188f0 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofB: ....**    
18900 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AltB: ....**    
18910 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AeqB: ....**    
18920 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AgtB: ....**    
18930 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65  Init: initialize
18940 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73   coroutine regis
18950 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ters.**         
18960 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20   yield coA.**   
18970 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29         if eof(A)
18980 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20   goto EofA.**   
18990 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42         yield coB
189a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
189b0 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42  eof(B) goto EofB
189c0 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d  .**    Cmpr: Com
189d0 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20  pare A, B.**    
189e0 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c        Jump AltB,
189f0 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20   AeqB, AgtB.**  
18a00 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a     End: ....**.*
18a10 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20  * We call AltB, 
18a20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41  AeqB, AgtB, EofA
18a30 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72  , and EofB "subr
18a40 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65  outines" but the
18a50 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74  y are not.** act
18a60 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69  ually called usi
18a70 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65  ng Gosub and the
18a80 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e  y do not Return.
18a90 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20    EofA and EofB 
18aa0 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c  loop.** until al
18ab0 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  l data is exhaus
18ac0 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ted then jump to
18ad0 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e   the "end" labe.
18ae0 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a    AltB, AeqB,.**
18af0 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74   and AgtB jump t
18b00 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74  o either L2 or t
18b10 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72  o one of EofA or
18b20 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65   EofB..*/.#ifnde
18b30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
18b40 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74  MPOUND_SELECT.st
18b50 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
18b60 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
18b70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18b80 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
18b90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
18ba0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
18bb0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
18bc0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
18bd0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
18be0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
18bf0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
18c00 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
18c10 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
18c20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
18c30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
18c40 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65  unters */.  Sele
18c50 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
18c60 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
18c70 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
18c80 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
18c90 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
18ca0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
18cb0 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
18cc0 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
18cd0 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20  Dest destA;     
18ce0 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
18cf0 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a  or coroutine A *
18d00 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
18d10 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73  estB;     /* Des
18d20 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
18d30 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e  outine B */.  in
18d40 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20  t regAddrA;     
18d50 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
18d60 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
18d70 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
18d80 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42  /.  int regAddrB
18d90 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18da0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18db0 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  r select-B corou
18dc0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18dd0 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
18de0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18df0 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
18e00 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18e10 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
18e20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18e30 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
18e40 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18e50 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
18e60 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
18e70 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
18e80 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
18e90 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
18ea0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
18eb0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
18ec0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
18ed0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18ee0 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
18ef0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18f00 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
18f10 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18f20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
18f30 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
18f40 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
18f50 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
18f60 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
18f70 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18f80 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
18f90 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
18fa0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18fb0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20   addrEofA_noB;  
18fc0 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20     /* Alternate 
18fd0 61 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73  addrEofA if B is
18fe0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a   uninitialized *
18ff0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
19000 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
19010 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
19020 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
19030 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
19040 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
19050 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
19060 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
19070 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19080 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
19090 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
190a0 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
190b0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
190c0 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
190d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
190e0 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
190f0 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
19100 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
19110 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
19120 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
19130 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
19140 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
19150 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
19160 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
19170 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
19180 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
19190 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
191a0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
191b0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
191c0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
191d0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
191e0 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
191f0 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
19200 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
19210 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
19220 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
19230 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
19240 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
19250 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
19260 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
19270 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
19280 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
19290 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
192a0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
192b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
192c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
192d0 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
192e0 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
192f0 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
19300 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
19310 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
19320 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
19330 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
19340 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
19350 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
19360 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
19370 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
19380 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
19390 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
193a0 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
193b0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
193c0 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
193d0 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
193e0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
193f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
19400 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
19410 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
19420 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
19430 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
19440 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
19450 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19460 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
19470 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
19480 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
19490 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
194a0 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
194b0 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
194c0 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
194d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
194e0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
194f0 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20  int iSub1;      
19500 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
19510 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
19520 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
19530 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
19540 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
19550 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
19560 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
19570 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
19580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
19590 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
195a0 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
195b0 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
195c0 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
195d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
195e0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
195f0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
19600 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
19610 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
19620 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
19630 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
19640 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
19650 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
19660 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  (v);.  labelCmpr
19670 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19680 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20  keLabel(v);...  
19690 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
196a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
196b0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
196c0 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
196d0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
196e0 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
196f0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f  derBy==0 );.  pO
19700 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
19710 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
19720 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f  pOrderBy );.  nO
19730 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
19740 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20  y->nExpr;..  /* 
19750 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74  For operators ot
19760 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
19770 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  LL we have to ma
19780 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a  ke sure that.  *
19790 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
197a0 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65  lause covers eve
197b0 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  ry term of the r
197c0 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a  esult set.  Add.
197d0 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68    ** terms to th
197e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
197f0 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
19800 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54    */.  if( op!=T
19810 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72  K_ALL ){.    for
19820 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (i=1; db->malloc
19830 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d  Failed==0 && i<=
19840 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
19850 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
19860 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19870 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
19880 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
19890 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
198a0 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49  OrderBy; j++, pI
198b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
198c0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
198d0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
198e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
198f0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19900 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61  rByCol==i ) brea
19910 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
19920 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79   if( j==nOrderBy
19930 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
19940 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
19950 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45  Expr(db, TK_INTE
19960 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  GER, 0);.       
19970 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
19980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
19990 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
199a0 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
199b0 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20  EP_IntValue;.   
199c0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
199d0 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  lue = i;.       
199e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
199f0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
19a00 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
19a10 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
19a20 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
19a30 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
19a40 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64  pOrderBy->a[nOrd
19a50 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64  erBy++].u.x.iOrd
19a60 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69  erByCol = (u16)i
19a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19a80 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
19a90 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
19aa0 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64   permutation and
19ab0 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73   keyinfo that is
19ac0 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20   used with.  ** 
19ad0 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  the permutation 
19ae0 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
19af0 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20  e if the next.  
19b00 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  ** row of result
19b10 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c  s comes from sel
19b20 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e  ectA or selectB.
19b30 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69    Also add expli
19b40 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  cit.  ** collati
19b50 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ons to the ORDER
19b60 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
19b70 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68   so that when th
19b80 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a  e subqueries.  *
19b90 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61  * to the right a
19ba0 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20  nd the left are 
19bb0 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20  evaluated, they 
19bc0 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  use the correct.
19bd0 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a    ** collation..
19be0 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20    */.  aPermute 
19bf0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
19c00 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
19c10 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79  f(int)*(nOrderBy
19c20 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61 50   + 1));.  if( aP
19c30 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74  ermute ){.    st
19c40 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19c50 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
19c60 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72  Permute[0] = nOr
19c70 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28 69  derBy;.    for(i
19c80 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =1, pItem=pOrder
19c90 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72  By->a; i<=nOrder
19ca0 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; i++, pItem++
19cb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19cc0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
19cd0 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
19ce0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
19cf0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19d00 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<=p->pEList->nE
19d10 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65  xpr );.      aPe
19d20 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d  rmute[i] = pItem
19d30 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19d40 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l - 1;.    }.   
19d50 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c   pKeyMerge = mul
19d60 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
19d70 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
19d80 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
19d90 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
19da0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
19db0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
19dc0 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
19dd0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
19de0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
19df0 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
19e00 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
19e10 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
19e20 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
19e30 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
19e40 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
19e50 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
19e60 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
19e70 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
19e80 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
19e90 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
19ea0 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
19eb0 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
19ec0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
19ed0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
19ee0 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
19ef0 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
19f00 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
19f10 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
19f20 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
19f30 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
19f40 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
19f50 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
19f60 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
19f70 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
19f80 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
19f90 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
19fa0 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
19fb0 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b  nMem += nExpr+1;
19fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19fd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
19fe0 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
19ff0 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
1a000 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
1a010 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20  lloc(db, nExpr, 
1a020 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  1);.    if( pKey
1a030 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Dup ){.      ass
1a040 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
1a050 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
1a060 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20  KeyDup) );.     
1a070 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
1a080 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
1a090 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b   pKeyDup->aColl[
1a0a0 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  i] = multiSelect
1a0b0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1a0c0 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  p, i);.        p
1a0d0 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
1a0e0 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  er[i] = 0;.     
1a0f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20   }.    }.  }. . 
1a100 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65   /* Separate the
1a110 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69   left and the ri
1a120 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f  ght query from o
1a130 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a  ne another.  */.
1a140 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
1a150 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1a160 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52   = 0;.  sqlite3R
1a170 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
1a180 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  By(pParse, p, p-
1a190 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
1a1a0 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  R");.  if( pPrio
1a1b0 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
1a1c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
1a1d0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
1a1e0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
1a1f0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c  Prior->pOrderBy,
1a200 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a   "ORDER");.  }..
1a210 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1a220 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
1a230 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
1a240 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
1a250 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29  se, p, labelEnd)
1a260 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
1a270 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  t && op==TK_ALL 
1a280 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  ){.    regLimitA
1a290 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a2a0 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42  m;.    regLimitB
1a2b0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a2c0 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
1a2d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1a2e0 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20  opy, p->iOffset 
1a2f0 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ? p->iOffset+1 :
1a300 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20   p->iLimit,.    
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1a330 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71  gLimitA);.    sq
1a340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a350 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c  v, OP_Copy, regL
1a360 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42  imitA, regLimitB
1a370 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a380 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c  regLimitA = regL
1a390 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20  imitB = 0;.  }. 
1a3a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1a3b0 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
1a3c0 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  );.  p->pLimit =
1a3d0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
1a3e0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
1a3f0 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f  Offset);.  p->pO
1a400 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65  ffset = 0;..  re
1a410 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
1a420 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
1a430 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
1a440 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
1a450 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a460 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
1a470 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a480 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
1a490 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
1a4a0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
1a4b0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
1a4c0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1a4d0 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
1a4e0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
1a4f0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1a500 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
1a510 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
1a520 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
1a530 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f   the.  ** left o
1a540 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f  f the compound o
1a550 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41  perator - the "A
1a560 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  " select..  */. 
1a570 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
1a580 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1a590 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
1a5a0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
1a5b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a5c0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1a5d0 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72  egAddrA, 0, addr
1a5e0 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65  SelectA);.  Vdbe
1a5f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66  Comment((v, "lef
1a600 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
1a610 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
1a620 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70  regLimitA;.  exp
1a630 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
1a640 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
1a650 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
1a660 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1a670 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
1a680 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
1a690 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1a6a0 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  (v, regAddrA);. 
1a6b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1a6c0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1a6d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1a6e0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
1a6f0 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
1a700 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
1a710 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
1a720 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
1a730 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
1a740 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1a750 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
1a760 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71   1;.  addr1 = sq
1a770 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a780 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
1a790 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30  ine, regAddrB, 0
1a7a0 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
1a7b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a7c0 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22  , "right SELECT"
1a7d0 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
1a7e0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
1a7f0 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
1a800 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
1a810 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
1a820 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
1a830 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e  = 0;  .  explain
1a840 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
1a850 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
1a860 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
1a870 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1a880 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
1a890 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
1a8a0 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
1a8b0 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
1a8c0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
1a8d0 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
1a8e0 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
1a8f0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1a900 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1a910 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
1a920 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
1a930 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
1a940 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
1a950 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1a960 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1a970 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1a980 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
1a990 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
1a9a0 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
1a9b0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
1a9c0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
1a9e0 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
1a9f0 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
1aa00 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
1aa10 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
1aa20 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
1aa30 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1aa40 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1aa50 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1aa60 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
1aa70 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
1aa80 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
1aa90 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
1aaa0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
1aab0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
1aac0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
1aad0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1aae0 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
1aaf0 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
1ab00 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
1ab10 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
1ab20 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab40 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
1ab50 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1ab70 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
1ab80 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20  abelEnd);.  }.  
1ab90 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
1aba0 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20  ref(pKeyDup);.. 
1abb0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1abc0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
1abd0 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
1abe0 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a  s from select A.
1abf0 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
1ac00 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
1ac10 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d   in select B rem
1ac20 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
1ac30 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
1ac40 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
1ac50 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
1ac60 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66  fA_noB = addrEof
1ac70 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20  A = labelEnd;.  
1ac80 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
1ac90 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1aca0 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69   "eof-A subrouti
1acb0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
1acc0 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
1acd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1ace0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
1acf0 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64  drOutB);.    add
1ad00 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69  rEofA_noB = sqli
1ad10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ad20 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1ad30 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  drB, labelEnd);.
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad60 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ad70 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1ad80 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1ad90 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
1ada0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
1adb0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
1adc0 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
1add0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
1ade0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1adf0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1ae00 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
1ae10 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
1ae20 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
1ae30 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
1ae40 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
1ae50 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
1ae60 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
1ae70 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1ae80 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
1ae90 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
1aea0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
1aeb0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
1aec0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
1aed0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
1aee0 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
1aef0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1af00 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
1af10 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1af20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
1af30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1af40 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1af50 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1af60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1af70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1af80 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61  ld, regAddrA, la
1af90 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  belEnd); VdbeCov
1afa0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1afb0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1afc0 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a   addrEofB);.  }.
1afd0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1afe0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1aff0 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20  e case of A<B.  
1b000 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1b010 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42  ment((v, "A-lt-B
1b020 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1b030 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c    addrAltB = sql
1b040 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b050 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1b060 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1b070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b080 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b090 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1b0a0 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1b0b0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1b0c0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1b0d0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65  lCmpr);..  /* Ge
1b0e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1b0f0 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1b100 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66  f A==B.  */.  if
1b110 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
1b120 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1b130 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65  ddrAltB;.  }else
1b140 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
1b150 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1b160 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
1b170 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b  ;.    addrAltB++
1b180 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
1b190 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1b1a0 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f  v, "A-eq-B subro
1b1b0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1b1c0 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c  drAeqB =.    sql
1b1d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b1e0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1b1f0 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  ddrA, addrEofA);
1b200 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b220 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d  eGoto(v, labelCm
1b230 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  pr);.  }..  /* G
1b240 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1b250 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1b260 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64  of A>B.  */.  Vd
1b270 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1b280 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75  , "A-gt-B subrou
1b290 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
1b2a0 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  gtB = sqlite3Vdb
1b2b0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1b2c0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1b2d0 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
1b2e0 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
1b2f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b300 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1b310 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a   addrOutB);.  }.
1b320 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b330 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b340 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1b350 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1b360 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1b370 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1b380 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
1b390 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
1b3a0 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
1b3b0 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
1b3c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
1b3d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
1b3e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1b3f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1b400 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1b410 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65  rEofA_noB); Vdbe
1b420 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1b430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b440 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1b450 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
1b460 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b470 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d  v);..  /* Implem
1b480 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72  ent the main mer
1b490 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  ge loop.  */.  s
1b4a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1b4b0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43  eLabel(v, labelC
1b4c0 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mpr);.  sqlite3V
1b4d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1b4e0 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20  Permutation, 0, 
1b4f0 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65  0, 0, (char*)aPe
1b500 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52  rmute, P4_INTARR
1b510 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  AY);.  sqlite3Vd
1b520 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
1b530 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53  ompare, destA.iS
1b540 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74  dst, destB.iSdst
1b550 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , nOrderBy,.    
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1b580 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46  Merge, P4_KEYINF
1b590 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
1b5a0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
1b5b0 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20  LAG_PERMUTE);.  
1b5c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b5d0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
1b5e0 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42  drAltB, addrAeqB
1b5f0 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62  , addrAgtB); Vdb
1b600 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1b610 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
1b620 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
1b630 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
1b640 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
1b650 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1b660 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1b670 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53  belEnd);..  /* S
1b680 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
1b690 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a   output columns.
1b6a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
1b6b0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
1b6c0 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  put ){.    Selec
1b6d0 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69  t *pFirst = pPri
1b6e0 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  or;.    while( p
1b6f0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
1b700 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
1b710 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e  >pPrior;.    gen
1b720 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
1b730 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d  (pParse, pFirst-
1b740 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70  >pSrc, pFirst->p
1b750 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
1b760 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1b770 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1b780 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1b790 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1b7a0 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1b7b0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1b7c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1b7d0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1b7e0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1b7f0 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1b800 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1b810 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1b820 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1b830 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1b840 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1b850 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1b860 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1b870 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1b880 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
1b890 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
1b8a0 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
1b8b0 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
1b8c0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
1b8d0 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  Err!=0;.}.#endif
1b8e0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1b8f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1b900 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1b910 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1b920 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  W)../* An instan
1b930 63 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43  ce of the SubstC
1b940 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65  ontext object de
1b950 73 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74  scribes an subst
1b960 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20  itution edit.** 
1b970 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
1b980 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e  on a parse tree.
1b990 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72  .**.** All refer
1b9a0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
1b9b0 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65   in table iTable
1b9c0 20 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61   are to be repla
1b9d0 63 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e  ced by correspon
1b9e0 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ding.** expressi
1b9f0 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a  ons in pEList..*
1ba00 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1ba10 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a   SubstContext {.
1ba20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ba40 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1ba50 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
1ba60 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
1ba70 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66    /* Replace ref
1ba80 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
1ba90 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1baa0 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20  NewTable;       
1bab0 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c       /* New tabl
1bac0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
1bad0 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20  t isLeftJoin;   
1bae0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54          /* Add T
1baf0 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70  K_IF_NULL_ROW op
1bb00 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65  codes on each re
1bb10 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45  placement */.  E
1bb20 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1bb30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c           /* Repl
1bb40 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69  acement expressi
1bb50 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f  ons */.} SubstCo
1bb60 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61  ntext;../* Forwa
1bb70 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
1bb80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1bb90 75 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62  ubstExprList(Sub
1bba0 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72  stContext*, Expr
1bbb0 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1bbc0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1bbd0 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53  SubstContext*, S
1bbe0 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  elect*, int);../
1bbf0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1bc00 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1bc10 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1bc20 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1bc30 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1bc40 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1bc50 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1bc60 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1bc70 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1bc80 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1bc90 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1bca0 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1bcb0 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1bcc0 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1bcd0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1bce0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1bcf0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1bd00 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1bd10 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1bd20 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1bd30 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1bd40 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1bd50 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1bd60 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1bd70 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1bd80 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1bd90 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1bda0 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1bdb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1bdc0 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
1bdd0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1bde0 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1bdf0 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1be00 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1be10 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1be20 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1be30 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1be40 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1be50 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1be60 75 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73  ubstExpr(.  Subs
1be70 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1be80 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  ,  /* Descriptio
1be90 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1bea0 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ution */.  Expr 
1beb0 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
1bec0 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
1bed0 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
1bee0 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1bef0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1bf00 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78  turn 0;.  if( Ex
1bf10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1bf20 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1bf30 29 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67  ) && pExpr->iRig
1bf40 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75  htJoinTable==pSu
1bf50 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20  bst->iTable ){. 
1bf60 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74     pExpr->iRight
1bf70 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62  JoinTable = pSub
1bf80 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1bf90 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
1bfa0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
1bfb0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1bfc0 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29  pSubst->iTable )
1bfd0 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1bfe0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1bff0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1c000 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1c010 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1c020 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
1c030 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74   *pCopy = pSubst
1c040 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  ->pEList->a[pExp
1c050 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1c060 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66  r;.      Expr if
1c070 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61  NullRow;.      a
1c080 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70  ssert( pSubst->p
1c090 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
1c0a0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73  r->iColumn<pSubs
1c0b0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
1c0c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1c0d0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
1c0e0 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
1c0f0 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht==0 );.      i
1c100 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
1c110 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b  Vector(pCopy) ){
1c120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c130 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70  VectorErrorMsg(p
1c140 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70  Subst->pParse, p
1c150 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Copy);.      }el
1c160 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1c170 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74  te3 *db = pSubst
1c180 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
1c190 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74        if( pSubst
1c1a0 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20  ->isLeftJoin && 
1c1b0 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pCopy->op!=TK_CO
1c1c0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1c1d0 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c    memset(&ifNull
1c1e0 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  Row, 0, sizeof(i
1c1f0 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20  fNullRow));.    
1c200 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1c210 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  op = TK_IF_NULL_
1c220 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ROW;.          i
1c230 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d  fNullRow.pLeft =
1c240 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   pCopy;.        
1c250 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62    ifNullRow.iTab
1c260 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65  le = pSubst->iNe
1c270 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  wTable;.        
1c280 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c    pCopy = &ifNul
1c290 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lRow;.        }.
1c2a0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1c2b0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1c2c0 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20  , pCopy, 0);.   
1c2d0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
1c2e0 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1c2f0 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oin ){.         
1c300 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1c310 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e  (pNew, EP_CanBeN
1c320 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ull);.        }.
1c330 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1c340 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1c350 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f  rty(pExpr,EP_Fro
1c360 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1c370 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74      pNew->iRight
1c380 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70  JoinTable = pExp
1c390 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1c3a0 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  le;.          Ex
1c3b0 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
1c3c0 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ew, EP_FromJoin)
1c3d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c3e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1c3f0 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1c400 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
1c410 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
1c420 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1c430 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
1c440 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
1c450 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1c460 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1c470 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  e ){.      pExpr
1c480 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  ->iTable = pSubs
1c490 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1c4a0 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70    }.    pExpr->p
1c4b0 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
1c4c0 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1c4d0 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70  pLeft);.    pExp
1c4e0 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1c4f0 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1c500 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1c510 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1c520 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1c530 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1c540 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1c550 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1c560 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  .pSelect, 1);.  
1c570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1c580 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1c590 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  bst, pExpr->x.pL
1c5a0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1c5b0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1c5c0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1c5d0 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53  bstExprList(.  S
1c5e0 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1c5f0 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1c600 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1c610 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1c620 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
1c630 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1c640 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1c650 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1c660 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
1c670 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1c680 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1c690 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1c6a0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1c6b0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1c6c0 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  pr = substExpr(p
1c6d0 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  Subst, pList->a[
1c6e0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  i].pExpr);.  }.}
1c6f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1c700 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73  stSelect(.  Subs
1c710 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1c720 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e  , /* Description
1c730 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1c740 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
1c750 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1c760 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1c770 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1c780 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1c790 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72  ns */.  int doPr
1c7a0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ior           /*
1c7b0 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20   Do substitutes 
1c7c0 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f  on p->pPrior too
1c7d0 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1c7e0 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1c7f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1c800 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1c810 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1c820 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73  ;.  do{.    subs
1c830 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1c840 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1c850 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1c860 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75  pSubst, p->pGrou
1c870 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45  pBy);.    substE
1c880 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1c890 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
1c8a0 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1c8b0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1c8c0 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
1c8d0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1c8e0 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1c8f0 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1c900 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1c910 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1c920 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1c930 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1c940 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1c950 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1c960 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1c970 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d  t(pSubst, pItem-
1c980 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  >pSelect, 1);.  
1c990 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1c9a0 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
1c9b0 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72         substExpr
1c9c0 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74  List(pSubst, pIt
1c9d0 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1c9e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c9f0 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f    }while( doPrio
1ca00 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72  r && (p = p->pPr
1ca10 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e  ior)!=0 );.}.#en
1ca20 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1ca30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1ca40 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1ca50 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1ca60 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1ca70 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ca80 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1ca90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1caa0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1cab0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1cac0 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1cad0 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1cae0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1caf0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1cb00 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1cb10 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1cb20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1cb30 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1cb40 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1cb50 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1cb60 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1cb70 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1cb80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1cb90 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1cba0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1cbb0 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1cbc0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1cbd0 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1cbe0 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1cbf0 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1cc00 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1cc10 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1cc20 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1cc30 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1cc40 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1cc50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1cc60 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1cc70 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1cc80 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1cc90 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1cca0 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1ccb0 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1ccc0 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1ccd0 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1cce0 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1ccf0 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1cd00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1cd10 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1cd20 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1cd30 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1cd40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1cd50 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1cd60 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1cd70 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1cd80 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1cd90 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1cda0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1cdb0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1cdc0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1cdd0 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1cde0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1cdf0 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1ce00 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1ce10 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1ce20 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1ce30 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1ce40 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1ce50 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1ce60 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1ce70 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1ce80 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1ce90 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1cea0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1ceb0 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1cec0 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
1ced0 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
1cee0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1cef0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
1cf00 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1cf10 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1cf20 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1cf30 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
1cf40 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
1cf50 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1cf60 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 28  n aggregate or (
1cf70 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1cf80 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
1cf90 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20  n.**        and 
1cfa0 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20 71  (2b) the outer q
1cfb0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1cfc0 65 20 73 75 62 71 75 65 72 69 65 73 20 6f 74 68  e subqueries oth
1cfd0 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a  er than the one.
1cfe0 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d 2d 63  **        FROM-c
1cff0 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 74  lause subquery t
1d000 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61  hat is a candida
1d010 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e  te for flattenin
1d020 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20 20 20  g.  (2b is.**   
1d030 20 20 20 20 20 64 75 65 20 74 6f 20 74 69 63 6b       due to tick
1d040 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39  et [2f7170d73bf9
1d050 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30 31 35  abf80] from 2015
1d060 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1d070 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
1d080 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
1d090 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1d0a0 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 20 20   LEFT JOIN.**   
1d0b0 20 20 20 20 20 6f 72 20 74 68 65 20 73 75 62 71       or the subq
1d0c0 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65  uery is not itse
1d0d0 6c 66 20 61 20 6a 6f 69 6e 20 61 6e 64 20 74 68  lf a join and th
1d0e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1d0f0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 61   not.**        a
1d100 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a  n aggregate..**.
1d110 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
1d120 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
1d130 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
1d140 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
1d150 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
1d160 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
1d170 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
1d180 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
1d190 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
1d1a0 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
1d1b0 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
1d1c0 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
1d1d0 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
1d1e0 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
1d1f0 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
1d200 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
1d210 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
1d220 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
1d230 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1d240 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
1d250 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
1d260 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
1d270 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
1d280 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
1d290 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
1d2a0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f  FROM clause.  TO
1d2b0 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72  DO:  For subquer
1d2c0 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20  ies without.**  
1d2d0 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61        A FROM cla
1d2e0 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64  use, consider ad
1d2f0 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75  ding a FROM clau
1d300 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63  se with the spec
1d310 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  ial.**        ta
1d320 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20  ble sqlite_once 
1d330 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
1d340 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f   a single row co
1d350 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20  ntaining a.**   
1d360 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c       single NULL
1d370 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
1d380 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1d390 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1d3a0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1d3b0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
1d3c0 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
1d3d0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1d3e0 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1d3f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d400 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
1d410 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
1d420 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1d430 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30   Restriction (10
1d440 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72  ) was removed fr
1d450 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32  om the code on 2
1d460 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65  005-02-05 but we
1d470 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64  .**        accid
1d480 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68  ently carried th
1d490 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72  e comment forwar
1d4a0 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d  d until 2014-09-
1d4b0 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a  15.  Original.**
1d4c0 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22 54          text: "T
1d4d0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1d4e0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1d4f0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1d500 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20   query .**      
1d510 20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c    does not use L
1d520 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31  IMIT.".**.**  (1
1d530 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1d540 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1d550 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1d560 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
1d570 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
1d580 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65  **)  Not impleme
1d590 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20  nted.  Subsumed 
1d5a0 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
1d5b0 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69   (3).  Was previ
1d5c0 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ously.**        
1d5d0 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72  a separate restr
1d5e0 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20  iction deriving 
1d5f0 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30  from ticket #350
1d600 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ..**.**  (13)  T
1d610 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1d620 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1d630 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1d640 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1d650 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d660 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
1d670 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54  ..**.**  (15)  T
1d680 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1d690 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
1d6a0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
1d6b0 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
1d6c0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1d6d0 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
1d6e0 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
1d6f0 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
1d700 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b  339 and ticket [
1d710 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a  02a8e81d44])..**
1d720 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
1d730 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1d740 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
1d750 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
1d760 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
1d770 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
1d780 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
1d790 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
1d7a0 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
1d7b0 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
1d7c0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
1d7d0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
1d7e0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
1d7f0 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71   (17)  The sub-q
1d800 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f  uery is not a co
1d810 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f  mpound select, o
1d820 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20  r it is a UNION 
1d830 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  ALL .**        c
1d840 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d  ompound clause m
1d850 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20  ade up entirely 
1d860 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  of non-aggregate
1d870 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a   queries, and .*
1d880 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72  *        the par
1d890 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  ent query:.**.**
1d8a0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1d8b0 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f  ot itself part o
1d8c0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
1d8d0 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ect,.**         
1d8e0 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67   * is not an agg
1d8f0 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e  regate or DISTIN
1d900 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a  CT query, and.**
1d910 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1d920 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20  ot a join.**.** 
1d930 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
1d940 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
1d950 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
1d960 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
1d970 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
1d980 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
1d990 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
1d9a0 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1d9b0 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
1d9c0 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
1d9d0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
1d9e0 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1d9f0 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
1da00 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1da10 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
1da20 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
1da30 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
1da40 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
1da50 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
1da60 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
1da70 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
1da80 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
1da90 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
1daa0 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
1dab0 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
1dac0 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
1dad0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
1dae0 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
1daf0 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
1db00 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
1db10 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
1db20 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
1db30 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
1db40 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1db50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1db60 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
1db70 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
1db80 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1db90 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
1dba0 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
1dbb0 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
1dbc0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
1dbd0 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
1dbe0 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
1dbf0 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
1dc00 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
1dc10 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
1dc20 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1dc30 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1dc40 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
1dc50 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
1dc60 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
1dc70 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
1dc80 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
1dc90 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
1dca0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
1dcb0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
1dcc0 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
1dcd0 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
1dce0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1dcf0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1dd00 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
1dd10 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
1dd20 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
1dd30 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
1dd40 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1dd50 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1dd60 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
1dd70 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
1dd80 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
1dd90 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
1dda0 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
1ddb0 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
1ddc0 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
1ddd0 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
1dde0 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
1ddf0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1de00 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
1de10 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
1de20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
1de30 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
1de40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1de50 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
1de60 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
1de70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
1de80 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
1de90 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
1dea0 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62  *  (21)  The sub
1deb0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1dec0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1ded0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1dee0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1def0 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
1df00 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
1df10 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
1df20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1df30 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1df40 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29  CTE..**.**  (23)
1df50 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73 20    The parent is 
1df60 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1df70 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62 2d  CTE, or the sub-
1df80 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a  query is not a.*
1df90 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1dfa0 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72 65  d query. This re
1dfb0 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
1dfc0 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
1dfd0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
1dfe0 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
1dff0 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
1e000 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
1e010 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
1e020 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
1e030 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
1e040 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
1e050 32 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  24)  The subquer
1e060 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1e070 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20  egate that uses 
1e080 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
1e090 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20  () or .**       
1e0a0 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
1e0b0 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74  ons.  (Without t
1e0c0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c  his restriction,
1e0d0 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a   a query like:.*
1e0e0 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  *        "SELECT
1e0f0 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
1e100 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74  max(y), x FROM t
1e110 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65  1)" would not ne
1e120 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20  cessarily.**    
1e130 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76      return the v
1e140 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68  alue X for which
1e150 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29   Y was maximal.)
1e160 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  .**.**.** In thi
1e170 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
1e180 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1e190 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1e1a0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
1e1b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1e1c0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
1e1d0 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
1e1e0 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
1e1f0 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
1e200 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
1e210 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
1e220 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1e230 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1e240 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
1e250 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
1e260 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
1e270 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1e280 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
1e290 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1e2a0 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
1e2b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1e2c0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
1e2d0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1e2e0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
1e2f0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
1e300 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1e310 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
1e320 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
1e330 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
1e340 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
1e350 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
1e360 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1e370 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1e380 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1e390 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1e3a0 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
1e3b0 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
1e3c0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
1e3d0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
1e3e0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
1e3f0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
1e400 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
1e410 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
1e420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e430 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
1e440 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
1e450 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
1e460 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
1e470 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
1e480 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1e490 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1e4a0 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
1e4b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
1e4c0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
1e4d0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1e4e0 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
1e4f0 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75  Parent;    /* Cu
1e500 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20  rrent UNION ALL 
1e510 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74 68 65  term of the othe
1e520 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c  r query */.  Sel
1e530 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
1e540 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
1e550 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
1e560 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  " */.  Select *p
1e570 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f  Sub1;      /* Po
1e580 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
1e590 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e  htmost select in
1e5a0 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
1e5b0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
1e5c0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
1e5d0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1e5e0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
1e5f0 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
1e600 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
1e610 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
1e620 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
1e630 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
1e640 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
1e650 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1e660 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
1e670 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
1e680 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
1e690 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
1e6a0 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
1e6b0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
1e6c0 65 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a  ewParent = -1;/*
1e6d0 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62   Replacement tab
1e6e0 6c 65 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a  le for iParent *
1e6f0 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f  /.  int isLeftJo
1e700 69 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  in = 0; /* True 
1e710 69 66 20 70 53 75 62 20 69 73 20 74 68 65 20 72  if pSub is the r
1e720 69 67 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c  ight side of a L
1e730 45 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a  EFT JOIN */    .
1e740 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1e750 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1e760 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
1e770 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
1e780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e790 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1e7a0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1e7b0 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
1e7c0 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
1e7d0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
1e7e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1e7f0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  >db;..  /* Check
1e800 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
1e810 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
1e820 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
1e830 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
1e840 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
1e850 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
1e860 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c  ==0 );  /* Unabl
1e870 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d  e to flatten com
1e880 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f  pound queries */
1e890 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
1e8a0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1e8b0 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
1e8c0 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20  tener) ) return 
1e8d0 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
1e8e0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1e8f0 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
1e900 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
1e910 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
1e920 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
1e930 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
1e940 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
1e950 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
1e960 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
1e970 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
1e980 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75  0 );.  if( subqu
1e990 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1e9a0 69 66 28 20 69 73 41 67 67 20 29 20 72 65 74 75  if( isAgg ) retu
1e9b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e9e0 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20  ion (1)   */.   
1e9f0 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e   if( pSrc->nSrc>
1ea00 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1ea30 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20  tion (2a)  */.  
1ea40 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65    if( (p->pWhere
1ea50 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1ea60 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50  rty(p->pWhere,EP
1ea70 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20 20 20  _Subquery)).    
1ea80 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72   || (sqlite3Expr
1ea90 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c  ListFlags(p->pEL
1eaa0 69 73 74 29 20 26 20 45 50 5f 53 75 62 71 75 65  ist) & EP_Subque
1eab0 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28  ry)!=0.     || (
1eac0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
1ead0 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79  lags(p->pOrderBy
1eae0 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29  ) & EP_Subquery)
1eaf0 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1eb00 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1eb40 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20  on (2b)  */.    
1eb50 7d 0a 20 20 7d 0a 0a 20 20 70 53 75 62 53 72 63  }.  }..  pSubSrc
1eb60 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
1eb70 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
1eb80 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
1eb90 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
1eba0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1ebb0 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
1ebc0 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
1ebd0 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
1ebe0 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1ebf0 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
1ec00 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
1ec10 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1ec20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
1ec30 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
1ec40 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
1ec50 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
1ec60 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1ec70 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
1ec80 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
1ec90 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
1eca0 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
1ecb0 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
1ecc0 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
1ecd0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1ece0 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
1ecf0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1ed00 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1ed10 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
1ed20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
1ed30 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1ed60 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
1ed70 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1ed80 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21   & SF_Compound)!
1ed90 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  =0 && pSub->pLim
1eda0 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
1edb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ede0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1edf0 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
1ee00 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
1ee10 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1ee40 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
1ee50 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1ee60 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72   SF_Distinct ) r
1ee70 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ee80 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1ee90 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (5)  */.  if( 
1eea0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1eeb0 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
1eec0 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
1eed0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1eee0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1eef0 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a  s (8)(9) */.  }.
1ef00 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1ef10 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1ef20 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79  )!=0 && subquery
1ef30 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65  IsAgg ){.     re
1ef40 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1ef50 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ef60 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  6)  */.  }.  if(
1ef70 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
1ef80 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1ef90 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1efd0 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
1efe0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
1eff0 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
1f000 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f020 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f030 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
1f040 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
1f050 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
1f060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1f070 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f080 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
1f090 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
1f0a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1f0b0 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
1f0c0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1f0d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1f0e0 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
1f0f0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1f100 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f110 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20 74  Recursive );.  t
1f120 65 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73  estcase( pSub->s
1f130 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 69 6e  elFlags & SF_Min
1f140 4d 61 78 41 67 67 20 29 3b 0a 20 20 69 66 28 20  MaxAgg );.  if( 
1f150 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1f160 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 7c 53   (SF_Recursive|S
1f170 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b 0a  F_MinMaxAgg) ){.
1f180 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1f190 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32   Restrictions (2
1f1a0 32 29 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a 20  2) and (24) */. 
1f1b0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1f1c0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1f1d0 73 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70  sive) && pSub->p
1f1e0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
1f1f0 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1f200 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20  ction (23) */.  
1f210 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
1f220 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f230 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1f240 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
1f250 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
1f260 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1f270 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c   be a join itsel
1f280 66 2e 20 20 45 78 61 6d 70 6c 65 20 6f 66 20 77  f.  Example of w
1f290 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
1f2a0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1f2b0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1f2c0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
1f2d0 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
1f2e0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1f2f0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1f300 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1f310 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1f320 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1f330 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
1f340 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
1f350 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
1f360 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
1f370 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
1f380 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f390 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f3a0 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
1f3b0 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65  e outer.  ** que
1f3c0 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ry cannot be an 
1f3d0 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
1f3e0 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20   is an artifact 
1f3f0 6f 66 20 74 68 65 20 77 61 79 20 61 67 67 72 65  of the way aggre
1f400 67 61 74 65 73 0a 20 20 2a 2a 20 61 72 65 20 70  gates.  ** are p
1f410 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65  rocessed - there
1f420 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d   is no mechanism
1f430 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1f440 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 20   the LEFT JOIN. 
1f450 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64   ** table should
1f460 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20   be all-NULL..  
1f470 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
1f480 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23   tickets #306, #
1f490 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a  350, and #3300..
1f4a0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
1f4b0 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
1f4c0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
1f4d0 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f   ){.    isLeftJo
1f4e0 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  in = 1;.    if( 
1f4f0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20  pSubSrc->nSrc>1 
1f500 7c 7c 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  || isAgg ){.    
1f510 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1f520 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a  estriction (3) *
1f530 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  /.    }.  }.#ifd
1f540 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
1f550 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c 73 65  IFNULLROW.  else
1f560 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20   if( iFrom>0 && 
1f570 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 2f 2a  !isAgg ){.    /*
1f580 20 53 65 74 74 69 6e 67 20 69 73 4c 65 66 74 4a   Setting isLeftJ
1f590 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75 73 65 73  oin to -1 causes
1f5a0 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f 70   OP_IfNullRow op
1f5b0 63 6f 64 65 73 20 74 6f 20 62 65 20 67 65 6e 65  codes to be gene
1f5c0 72 61 74 65 64 20 66 6f 72 0a 20 20 20 20 2a 2a  rated for.    **
1f5d0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1f5e0 20 74 6f 20 61 6e 79 20 72 65 73 75 6c 74 20 63   to any result c
1f5f0 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75 62 71 75  olumn from subqu
1f600 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e 2c 20 65  ery in a join, e
1f610 76 65 6e 20 74 68 6f 75 67 68 0a 20 20 20 20 2a  ven though.    *
1f620 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6e  * they are not n
1f630 65 63 65 73 73 61 72 79 2e 20 20 54 68 69 73 20  ecessary.  This 
1f640 77 69 6c 6c 20 73 74 72 65 73 73 2d 74 65 73 74  will stress-test
1f650 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f   the OP_IfNullRo
1f660 77 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  w opcode. */.   
1f670 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31   isLeftJoin = -1
1f680 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1f690 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
1f6a0 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
1f6b0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1f6c0 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
1f6d0 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
1f6e0 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
1f6f0 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
1f700 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
1f710 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
1f720 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
1f730 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
1f740 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
1f750 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
1f760 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
1f770 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
1f780 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1f790 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
1f7a0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
1f7b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f7c0 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
1f7d0 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a  ion 20 */.    }.
1f7e0 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
1f7f0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f800 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1f810 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
1f820 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f830 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
1f840 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
1f850 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
1f860 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
1f870 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1f880 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1f890 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1f8a0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
1f8b0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
1f8c0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1f8d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1f8e0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1f8f0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
1f900 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
1f910 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53  assert( pSub->pS
1f920 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  rc!=0 );.      a
1f930 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c  ssert( pSub->pEL
1f940 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62  ist->nExpr==pSub
1f950 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
1f960 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
1f970 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1f980 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1f990 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
1f9a0 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
1f9b0 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
1f9c0 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
1f9d0 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d         || pSub1-
1f9e0 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20  >pSrc->nSrc<1.  
1f9f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
1fa00 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1fa10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fa20 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
1fa30 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  rc>1 );.    }.. 
1fa40 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1fa50 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28  n 18. */.    if(
1fa60 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
1fa70 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1fa80 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1fa90 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
1faa0 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
1fab0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1fac0 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69  rBy->a[ii].u.x.i
1fad0 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
1fae0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1faf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1fb00 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63  ***** If we reac
1fb10 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c  h this point, fl
1fb20 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
1fb30 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20  itted. *****/.  
1fb40 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
1fb50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e  arse,p,("flatten
1fb60 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d   %s.%p from term
1fb70 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
1fb80 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d             pSub-
1fb90 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c  >zSelName, pSub,
1fba0 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20   iFrom));..  /* 
1fbb0 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75  Authorize the su
1fbc0 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72  bquery */.  pPar
1fbd0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1fbe0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61   = pSubitem->zNa
1fbf0 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69  me;.  TESTONLY(i
1fc00 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43   =) sqlite3AuthC
1fc10 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1fc20 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
1fc30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65  , 0);.  testcase
1fc40 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59  ( i==SQLITE_DENY
1fc50 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   );.  pParse->zA
1fc60 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
1fc70 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
1fc80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62  .  /* If the sub
1fc90 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1fca0 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
1fcb0 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20  ement, then (by 
1fcc0 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a  restrictions.  *
1fcd0 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76  * 17 and 18 abov
1fce0 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20  e) it must be a 
1fcf0 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68  UNION ALL and th
1fd00 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d  e parent query m
1fd10 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20  ust .  ** be of 
1fd20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20  the form:.  **. 
1fd30 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c   **     SELECT <
1fd40 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20  expr-list> FROM 
1fd50 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77  (<sub-query>) <w
1fd60 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20  here-clause> .  
1fd70 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64  **.  ** followed
1fd80 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59   by any ORDER BY
1fd90 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f  , LIMIT and/or O
1fda0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
1fdb0 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63  his block.  ** c
1fdc0 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65  reates N-1 copie
1fdd0 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  s of the parent 
1fde0 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e  query without an
1fdf0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
1fe00 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45  T or .  ** OFFSE
1fe10 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f  T clauses and jo
1fe20 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ins them to the 
1fe30 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  left-hand-side o
1fe40 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  f the original. 
1fe50 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20   ** using UNION 
1fe60 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49  ALL operators. I
1fe70 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73  n this case N is
1fe80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
1fe90 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63  imple.  ** selec
1fea0 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  t statements in 
1feb0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
1fec0 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a  -query..  **.  *
1fed0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
1fee0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1fef0 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20  a+1 FROM (.  ** 
1ff00 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20         SELECT x 
1ff10 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
1ff20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1ff30 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1ff40 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T y FROM tab.  *
1ff50 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
1ff60 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
1ff70 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46  ELECT abs(z*2) F
1ff80 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20  ROM tab2.  **   
1ff90 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f    ) WHERE a!=5 O
1ffa0 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
1ffb0 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20   ** Transformed 
1ffc0 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  into:.  **.  ** 
1ffd0 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46      SELECT x+1 F
1ffe0 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b  ROM tab WHERE x+
1fff0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
20000 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
20010 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d   SELECT y+1 FROM
20020 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d   tab WHERE y+1!=
20030 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
20040 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
20050 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20  LECT abs(z*2)+1 
20060 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20  FROM tab2 WHERE 
20070 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20  abs(z*2)+1!=5.  
20080 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
20090 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63  1.  **.  ** We c
200a0 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f  all this the "co
200b0 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
200c0 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a  flattening"..  *
200d0 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75  /.  for(pSub=pSu
200e0 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b  b->pPrior; pSub;
200f0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
20100 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
20110 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c  *pNew;.    ExprL
20120 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
20130 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
20140 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
20150 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45  p->pLimit;.    E
20160 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70  xpr *pOffset = p
20170 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53  ->pOffset;.    S
20180 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
20190 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
201a0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
201b0 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b      p->pSrc = 0;
201c0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
201d0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69   0;.    p->pLimi
201e0 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f  t = 0;.    p->pO
201f0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
20200 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  New = sqlite3Sel
20210 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29  ectDup(db, p, 0)
20220 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
20230 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
20240 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29   pSub->zSelName)
20250 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74  ;.    p->pOffset
20260 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
20270 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
20280 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  it;.    p->pOrde
20290 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
202a0 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
202b0 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20  rc;.    p->op = 
202c0 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  TK_ALL;.    if( 
202d0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
202e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
202f0 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ior;.    }else{.
20300 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69        pNew->pPri
20310 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
20320 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20     if( pPrior ) 
20330 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
20340 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  pNew;.      pNew
20350 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
20360 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
20370 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  New;.      SELEC
20380 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c  TTRACE(2,pParse,
20390 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f  p,.         ("co
203a0 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
203b0 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74 65  flattener create
203c0 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c  s %s.%p as peer\
203d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65  n",.         pNe
203e0 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65  w->zSelName, pNe
203f0 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  w));.    }.    i
20400 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
20410 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
20420 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
20430 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69  flattening the i
20440 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
20450 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
20460 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75   .  ** in the ou
20470 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
20480 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d    pSub = pSub1 =
20490 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
204a0 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  ct;..  /* Delete
204b0 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
204c0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
204d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
204e0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
204f0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
20500 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
20510 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
20520 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20530 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  db, pSubitem->zN
20540 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
20550 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
20560 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70  em->zAlias);.  p
20570 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
20580 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  se = 0;.  pSubit
20590 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
205a0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
205b0 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  s = 0;.  pSubite
205c0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  m->pSelect = 0;.
205d0 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65  .  /* Defer dele
205e0 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f  ting the Table o
205f0 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
20600 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
20610 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f  ubquery until co
20620 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73  de generation is
20630 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20  .  ** complete, 
20640 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20  since there may 
20650 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72  still exist Expr
20660 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68  .pTab entries th
20670 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f  at.  ** refer to
20680 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76   the subquery ev
20690 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e  en after flatten
206a0 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33  ing.  Ticket #33
206b0 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53  46..  **.  ** pS
206c0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20  ubitem->pTab is 
206d0 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  always non-NULL 
206e0 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74  by test restrict
206f0 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61  ions and tests a
20700 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bove..  */.  if(
20710 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d   ALWAYS(pSubitem
20720 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
20730 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44    Table *pTabToD
20740 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  el = pSubitem->p
20750 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
20760 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d  bToDel->nTabRef=
20770 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73  =1 ){.      Pars
20780 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
20790 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
207a0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  vel(pParse);.   
207b0 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e     pTabToDel->pN
207c0 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70  extZombie = pTop
207d0 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
207e0 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  b;.      pToplev
207f0 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d  el->pZombieTab =
20800 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20   pTabToDel;.    
20810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
20820 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d  bToDel->nTabRef-
20830 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  -;.    }.    pSu
20840 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
20850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
20860 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
20870 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
20880 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f   term in a compo
20890 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a  und-subquery.  *
208a0 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73  * flattening (as
208b0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
208c0 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f  ).  If we are do
208d0 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
208e0 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61  kind.  ** of fla
208f0 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74  ttening - a flat
20900 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61  tening other tha
20910 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
20920 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
20930 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69   -.  ** then thi
20940 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73  s loop only runs
20950 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   once..  **.  **
20960 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73   This loop moves
20970 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
20980 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
20990 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
209a0 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
209b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
209c0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
209d0 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
209e0 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
209f0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
20a00 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
20a10 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
20a20 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
20a30 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
20a40 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
20a50 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
20a60 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
20a70 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
20a80 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
20a90 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
20aa0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
20ab0 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
20ac0 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
20ad0 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
20ae0 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
20af0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
20b00 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
20b10 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
20b20 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ing in..  */.  f
20b30 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50  or(pParent=p; pP
20b40 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70  arent; pParent=p
20b50 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20  Parent->pPrior, 
20b60 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
20b70 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62  r){.    int nSub
20b80 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e  Src;.    u8 join
20b90 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
20ba0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
20bb0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
20bc0 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
20bd0 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
20be0 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
20bf0 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
20c00 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
20c10 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
20c20 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
20c30 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
20c40 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
20c50 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
20c60 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
20c70 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
20c80 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
20c90 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
20ca0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
20cb0 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
20cc0 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
20cd0 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
20ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
20cf0 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70  sert( pParent!=p
20d00 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20   );  /* 2nd and 
20d10 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73  subsequent times
20d20 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
20d30 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20  p */.      pSrc 
20d40 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  = pParent->pSrc 
20d50 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
20d60 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c  Append(db, 0, 0,
20d70 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
20d80 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
20d90 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
20da0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
20db0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20dc0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20dd0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
20de0 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c  uses a single sl
20df0 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ot of the FROM c
20e00 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
20e10 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e  er.    ** query.
20e20 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
20e30 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  y has more than 
20e40 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69  one element in i
20e50 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  ts FROM clause,.
20e60 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61      ** then expa
20e70 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
20e80 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65  ry to make space
20e90 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20   for it to hold 
20ea0 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  all elements.   
20eb0 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75   ** of the subqu
20ec0 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ery..    **.    
20ed0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
20ee0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c  **.    **    SEL
20ef0 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c  ECT * FROM tabA,
20f00 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
20f10 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62  sub1, sub2), tab
20f20 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  B;.    **.    **
20f30 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
20f40 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20   has 3 slots in 
20f50 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  its FROM clause.
20f60 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68    One slot of th
20f70 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
20f80 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65  uery (the middle
20f90 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62   slot) is used b
20fa0 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  y the subquery. 
20fb0 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   The next.    **
20fc0 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77   block of code w
20fd0 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f  ill expand the o
20fe0 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
20ff0 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74  clause to 4 slot
21000 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69  s..    ** The mi
21010 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70  ddle slot is exp
21020 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f  anded to two slo
21030 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ts in order to m
21040 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a  ake space.    **
21050 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65   for the two ele
21060 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f  ments in the FRO
21070 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
21080 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  subquery..    */
21090 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
210a0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  >1 ){.      pPar
210b0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  ent->pSrc = pSrc
210c0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
210d0 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
210e0 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
210f0 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
21100 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
21110 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
21120 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
21130 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66  }..    /* Transf
21140 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  er the FROM clau
21150 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  se terms from th
21160 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
21170 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
21180 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20   query..    */. 
21190 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
211a0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
211b0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
211c0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d  Delete(db, pSrc-
211d0 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69  >a[i+iFrom].pUsi
211e0 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ng);.      asser
211f0 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  t( pSrc->a[i+iFr
21200 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63  om].fg.isTabFunc
21210 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72  ==0 );.      pSr
21220 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
21230 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
21240 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20       iNewParent 
21250 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e  = pSubSrc->a[i].
21260 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d  iCursor;.      m
21270 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
21280 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
21290 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
212a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
212b0 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69  >a[iFrom].fg.joi
212c0 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
212d0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
212e0 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
212f0 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
21300 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
21310 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
21320 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
21330 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
21340 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
21350 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
21360 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
21370 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
21380 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
21390 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
213a0 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
213b0 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
213c0 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
213d0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
213e0 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
213f0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
21400 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
21410 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
21420 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
21430 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
21440 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21450 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
21460 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
21470 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
21480 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
21490 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
214a0 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
214b0 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
214c0 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
214d0 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
214e0 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
214f0 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
21500 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
21510 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
21520 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
21530 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
21540 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
21550 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
21560 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
21570 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
21580 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69  DbStrDup(db, pLi
21590 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
215a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
215b0 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
215c0 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
215d0 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
215e0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
215f0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
21600 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
21610 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
21620 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20  t, any non-zero 
21630 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75  iOrderByCol valu
21640 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  es indicate that
21650 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52   the.      ** OR
21660 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78  DER BY column ex
21670 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e  pression is iden
21680 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72  tical to the iOr
21690 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20  derByCol'th.    
216a0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
216b0 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
216c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75  CT statement pSu
216d0 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76  b. Since these v
216e0 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64  alues.      ** d
216f0 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  o not necessaril
21700 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  y correspond to 
21710 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43  columns in SELEC
21720 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72  T statement pPar
21730 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65  ent,.      ** ze
21740 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74  ro them before t
21750 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f  ransfering the O
21760 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
21770 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21780 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73  * Not doing this
21790 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72   may cause an er
217a0 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75  ror if a subsequ
217b0 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ent call to this
217c0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
217d0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  on attempts to f
217e0 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e  latten a compoun
217f0 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f  d sub-query into
21800 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a   pParent.      *
21810 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  * (the only way 
21820 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
21830 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75  is if the compou
21840 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a  nd sub-query is.
21850 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
21860 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d  ly part of pSub-
21870 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b  >pSrc). See tick
21880 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e  et [d11a6e908f].
21890 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
218a0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
218b0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
218c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
218d0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
218e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
218f0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
21900 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
21910 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
21920 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
21930 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
21940 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21950 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  pSub->pPrior==0 
21960 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
21970 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
21980 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
21990 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
219a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72  .    }.    pWher
219b0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
219c0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
219d0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ere, 0);.    if(
219e0 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b   isLeftJoin>0 ){
219f0 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  .      setJoinEx
21a00 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50  pr(pWhere, iNewP
21a10 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
21a20 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
21a30 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Agg ){.      ass
21a40 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48  ert( pParent->pH
21a50 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
21a60 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
21a70 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57  ng = pParent->pW
21a80 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
21a90 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  ent->pWhere = pW
21aa0 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
21ab0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
21ac0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
21ad0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
21ae0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
21af0 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30  pSub->pHaving, 0
21b00 29 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  ), pParent->pHav
21b10 69 6e 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ing.      );.   
21b20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21b30 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
21b40 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
21b50 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
21b60 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
21b70 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
21b80 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
21b90 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
21ba0 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
21bb0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57  e3ExprAnd(db, pW
21bc0 68 65 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70  here, pParent->p
21bd0 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Where);.    }.  
21be0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
21bf0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
21c00 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
21c10 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73  x;.      x.pPars
21c20 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
21c30 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61    x.iTable = iPa
21c40 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e  rent;.      x.iN
21c50 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61  ewTable = iNewPa
21c60 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73  rent;.      x.is
21c70 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66  LeftJoin = isLef
21c80 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70  tJoin;.      x.p
21c90 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45  EList = pSub->pE
21ca0 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73  List;.      subs
21cb0 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72  tSelect(&x, pPar
21cc0 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ent, 0);.    }. 
21cd0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61   .    /* The fla
21ce0 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
21cf0 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
21d00 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
21d10 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
21d20 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
21d30 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ct. .    */.    
21d40 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67  pParent->selFlag
21d50 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c  s |= pSub->selFl
21d60 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
21d70 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  t;.  .    /*.   
21d80 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
21d90 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
21da0 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
21db0 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
21dc0 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   y;.    **.    *
21dd0 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
21de0 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
21df0 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
21e00 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
21e10 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64  ut this.    ** d
21e20 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
21e30 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
21e40 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  negative..    */
21e50 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
21e60 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
21e70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d  Parent->pLimit =
21e80 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
21e90 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69       pSub->pLimi
21ea0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
21eb0 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
21ec0 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
21ed0 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
21ee0 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
21ef0 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
21f00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
21f10 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
21f20 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  b1);..#if SELECT
21f30 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
21f40 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
21f50 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
21f60 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
21f70 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
21f80 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e  ,("After flatten
21f90 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ing:\n"));.    s
21fa0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
21fb0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
21fc0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
21fd0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
21fe0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
21ff0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
22000 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
22010 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
22020 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e  */....#if !defin
22030 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
22040 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
22050 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
22060 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b  _VIEW)./*.** Mak
22070 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65  e copies of rele
22080 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  vant WHERE claus
22090 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f  e terms of the o
220a0 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a  uter query into.
220b0 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
220c0 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e  use of subquery.
220d0 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
220e0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
220f0 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
22100 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
22110 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e  t1) WHERE x=5 AN
22120 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72  D y=10;.**.** Tr
22130 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
22140 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
22150 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
22160 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
22170 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
22180 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a  5 AND c-d=10).**
22190 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41       WHERE x=5 A
221a0 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
221b0 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20  he hope is that 
221c0 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20  the terms added 
221d0 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65  to the inner que
221e0 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20  ry will make it 
221f0 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e  more.** efficien
22200 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  t..**.** Do not 
22210 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74  attempt this opt
22220 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a  imization if:.**
22230 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 20 69 6e  .**   (1) The in
22240 6e 65 72 20 71 75 65 72 79 20 69 73 20 61 6e 20  ner query is an 
22250 61 67 67 72 65 67 61 74 65 2e 20 20 28 49 6e 20  aggregate.  (In 
22260 74 68 61 74 20 63 61 73 65 2c 20 77 65 27 64 20  that case, we'd 
22270 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20  really want.**  
22280 20 20 20 20 20 74 6f 20 63 6f 70 79 20 74 68 65       to copy the
22290 20 6f 75 74 65 72 20 57 48 45 52 45 2d 63 6c 61   outer WHERE-cla
222a0 75 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74  use terms onto t
222b0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
222c0 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
222d0 20 69 6e 6e 65 72 20 71 75 65 72 79 2e 20 20 42   inner query.  B
222e0 75 74 20 74 68 65 79 20 70 72 6f 62 61 62 6c 79  ut they probably
222f0 20 77 6f 6e 27 74 20 68 65 6c 70 20 74 68 65 72   won't help ther
22300 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68  e so do not both
22310 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  er.).**.**   (2)
22320 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
22330 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69 76   is the recursiv
22340 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d  e part of a comm
22350 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73  on table express
22360 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  ion..**.**   (3)
22370 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
22380 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   has a LIMIT cla
22390 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20 63  use (since the c
223a0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48  hanges to the WH
223b0 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f  ERE.**       clo
223c0 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20  se would change 
223d0 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  the meaning of t
223e0 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a  he LIMIT)..**.**
223f0 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72     (4) The inner
22400 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69   query is the ri
22410 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
22420 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68   LEFT JOIN.  (Th
22430 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20  e caller.**     
22440 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20    enforces this 
22450 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69 6e 63  restriction sinc
22460 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  e this routine d
22470 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f  oes not have eno
22480 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66  ugh.**       inf
22490 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77  ormation to know
224a0 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54  .).**.**   (5) T
224b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
224c0 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
224d0 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20  nates in the ON 
224e0 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  or USING clause.
224f0 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45  **       of a LE
22500 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52  FT JOIN..**.** R
22510 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68  eturn 0 if no ch
22520 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 61  anges are made a
22530 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f  nd non-zero if o
22540 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
22550 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73   clause.** terms
22560 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64 20   are duplicated 
22570 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  into the subquer
22580 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
22590 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
225a0 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
225b0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
225c0 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 28 66  Parse context (f
225d0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  or malloc() and 
225e0 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 29  error reporting)
225f0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
22600 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ubq,        /* T
22610 68 65 20 73 75 62 71 75 65 72 79 20 77 68 6f 73  he subquery whos
22620 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
22630 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65  s to be augmente
22640 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
22650 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
22660 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
22670 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
22680 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ery */.  int iCu
22690 72 73 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rsor           /
226a0 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
226b0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
226c0 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
226d0 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20  ew;.  int nChng 
226e0 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  = 0;.  Select *p
226f0 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  X;           /* 
22700 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
22710 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
22720 73 20 69 6e 20 70 53 75 62 71 20 2a 2f 0a 20 20  s in pSubq */.  
22730 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20  if( pWhere==0 ) 
22740 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
22750 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58  pX=pSubq; pX; pX
22760 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  =pX->pPrior){.  
22770 20 20 69 66 28 20 28 70 58 2d 3e 73 65 6c 46 6c    if( (pX->selFl
22780 61 67 73 20 26 20 28 53 46 5f 41 67 67 72 65 67  ags & (SF_Aggreg
22790 61 74 65 7c 53 46 5f 52 65 63 75 72 73 69 76 65  ate|SF_Recursive
227a0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  ))!=0 ){.      t
227b0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 73 65 6c  estcase( pX->sel
227c0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
227d0 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 74 65  gate );.      te
227e0 73 74 63 61 73 65 28 20 70 58 2d 3e 73 65 6c 46  stcase( pX->selF
227f0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
22800 69 76 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ive );.      tes
22810 74 63 61 73 65 28 20 70 58 21 3d 70 53 75 62 71  tcase( pX!=pSubq
22820 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
22830 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
22840 6f 6e 73 20 28 31 29 20 61 6e 64 20 28 32 29 20  ons (1) and (2) 
22850 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  */.    }.  }.  i
22860 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74  f( pSubq->pLimit
22870 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
22880 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
22890 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20  ion (3) */.  }. 
228a0 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
228b0 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
228c0 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44    nChng += pushD
228d0 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50  ownWhereTerms(pP
228e0 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68  arse, pSubq, pWh
228f0 65 72 65 2d 3e 70 52 69 67 68 74 2c 20 69 43 75  ere->pRight, iCu
22900 72 73 6f 72 29 3b 0a 20 20 20 20 70 57 68 65 72  rsor);.    pWher
22910 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66  e = pWhere->pLef
22920 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70  t;.  }.  if( Exp
22930 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68  rHasProperty(pWh
22940 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ere,EP_FromJoin)
22950 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
22960 72 65 73 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f  restriction 5 */
22970 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
22980 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
22990 74 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f  t(pWhere, iCurso
229a0 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b  r) ){.    nChng+
229b0 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  +;.    while( pS
229c0 75 62 71 20 29 7b 0a 20 20 20 20 20 20 53 75 62  ubq ){.      Sub
229d0 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20  stContext x;.   
229e0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
229f0 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
22a00 3e 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  >db, pWhere, 0);
22a10 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20  .      x.pParse 
22a20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  = pParse;.      
22a30 78 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73  x.iTable = iCurs
22a40 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77  or;.      x.iNew
22a50 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b  Table = iCursor;
22a60 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a  .      x.isLeftJ
22a70 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 78  oin = 0;.      x
22a80 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71 2d  .pEList = pSubq-
22a90 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  >pEList;.      p
22aa0 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28  New = substExpr(
22ab0 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  &x, pNew);.     
22ac0 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d   pSubq->pWhere =
22ad0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
22ae0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
22af0 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29  q->pWhere, pNew)
22b00 3b 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d 20  ;.      pSubq = 
22b10 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20  pSubq->pPrior;. 
22b20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22b30 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69  n nChng;.}.#endi
22b40 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
22b50 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
22b60 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
22b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
22b80 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65  ) */../*.** Base
22b90 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
22ba0 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f  s of the AggInfo
22bb0 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63   structure indic
22bc0 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ated by the firs
22bd0 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74  t.** argument, t
22be0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
22bf0 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  cks if the follo
22c00 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
22c10 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75  *.**    * the qu
22c20 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73  ery contains jus
22c30 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65  t a single aggre
22c40 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a  gate function,.*
22c50 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67 72 65  *    * the aggre
22c60 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
22c70 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72   either min() or
22c80 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20   max(), and.**  
22c90 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74    * the argument
22ca0 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
22cb0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  e function is a 
22cc0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a  column value..**
22cd0 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68  .** If all of th
22ce0 65 20 61 62 6f 76 65 20 61 72 65 20 74 72 75 65  e above are true
22cf0 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44  , then WHERE_ORD
22d00 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52  ERBY_MIN or WHER
22d10 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a  E_ORDERBY_MAX.**
22d20 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
22d30 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73  appropriate. Als
22d40 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20  o, *ppMinMax is 
22d50 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
22d60 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  the .** list of 
22d70 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
22d80 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
22d90 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
22da0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  ng..**.** Or, if
22db0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
22dc0 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65  above are not me
22dd0 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20  t, *ppMinMax is 
22de0 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
22df0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
22e00 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64  RMAL is returned
22e10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d  ..*/.static u8 m
22e20 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e  inMaxQuery(AggIn
22e30 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78  fo *pAggInfo, Ex
22e40 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61  prList **ppMinMa
22e50 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d  x){.  int eRet =
22e60 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
22e70 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20  ORMAL;          
22e80 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
22e90 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20  */..  *ppMinMax 
22ea0 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49  = 0;.  if( pAggI
22eb0 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b  nfo->nFunc==1 ){
22ec0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
22ed0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
22ee0 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20  nc[0].pExpr; /* 
22ef0 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  Aggregate functi
22f00 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  on */.    ExprLi
22f10 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78  st *pEList = pEx
22f20 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20  pr->x.pList;    
22f30 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
22f40 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a  o agg function *
22f50 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
22f60 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
22f70 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
22f80 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
22f90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  EList->nExpr==1 
22fa0 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  && pEList->a[0].
22fb0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
22fc0 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
22fd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
22fe0 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  unc = pExpr->u.z
22ff0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  Token;.      if(
23000 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
23010 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30  zFunc, "min")==0
23020 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74   ){.        eRet
23030 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
23040 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70  _MIN;.        *p
23050 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74  pMinMax = pEList
23060 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
23070 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
23080 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d  (zFunc, "max")==
23090 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65  0 ){.        eRe
230a0 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
230b0 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a  Y_MAX;.        *
230c0 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73  ppMinMax = pELis
230d0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
230e0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
230f0 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20  *ppMinMax==0 || 
23100 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78  (*ppMinMax)->nEx
23110 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  pr==1 );.  retur
23120 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n eRet;.}../*.**
23130 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
23140 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
23150 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
23160 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  nt is an aggrega
23170 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  te query..** The
23180 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23190 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
231a0 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
231b0 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
231c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
231d0 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
231e0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
231f0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
23200 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
23210 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
23220 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
23230 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
23240 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
23250 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
23260 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
23270 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
23280 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
23290 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
232a0 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
232b0 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
232c0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
232d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
232e0 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
232f0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
23300 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
23310 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
23320 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
23330 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
23340 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
23350 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
23360 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
23370 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
23380 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
23390 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
233a0 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
233b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
233c0 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
233d0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
233e0 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
233f0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
23400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
23410 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
23420 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
23430 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
23440 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
23450 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
23460 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
23470 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
23480 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49   if( NEVER(pAggI
23490 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29  nfo->nFunc==0) )
234a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
234b0 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   (pAggInfo->aFun
234c0 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  c[0].pFunc->func
234d0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
234e0 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
234f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
23500 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
23510 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
23520 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
23530 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
23540 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
23550 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
23560 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
23570 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
23580 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
23590 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
235a0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
235b0 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
235c0 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
235d0 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
235e0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
235f0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
23600 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
23610 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
23620 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
23630 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
23640 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
23650 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
23660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23670 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
23680 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
23690 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
236a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
236b0 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
236c0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
236d0 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e  & pFrom->fg.isIn
236e0 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54  dexedBy ){.    T
236f0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
23700 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
23710 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d  ar *zIndexedBy =
23720 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pFrom->u1.zInde
23730 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78  xedBy;.    Index
23740 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
23750 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
23760 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
23770 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
23780 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
23790 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20  zIndexedBy); .  
237a0 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
237b0 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
237c0 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
237d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
237e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
237f0 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
23800 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29  , zIndexedBy, 0)
23810 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
23820 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
23830 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23840 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
23850 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42  }.    pFrom->pIB
23860 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
23870 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
23880 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
23890 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
238a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
238b0 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
238c0 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
238d0 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
238e0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
238f0 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
23900 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
23910 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
23920 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
23930 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
23940 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
23950 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
23960 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
23970 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
23980 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
23990 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
239a0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
239b0 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
239c0 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
239d0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
239e0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
239f0 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
23a00 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
23a10 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
23a20 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
23a30 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
23a40 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
23a50 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
23a60 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
23a70 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
23a80 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
23a90 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
23aa0 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
23ab0 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
23ac0 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
23ad0 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
23ae0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
23af0 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
23b00 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
23b10 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
23b20 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
23b30 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
23b40 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
23b50 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
23b60 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
23b70 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
23b80 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
23b90 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
23ba0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
23bb0 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
23bc0 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
23bd0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
23be0 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
23bf0 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
23c00 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
23c10 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
23c20 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
23c30 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
23c40 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
23c50 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
23c60 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
23c70 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
23c80 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
23c90 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
23ca0 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
23cb0 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
23cc0 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
23cd0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23ce0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
23cf0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
23d00 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
23d10 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
23d20 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
23d30 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
23d40 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
23d50 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
23d60 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
23d70 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
23d80 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
23d90 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
23da0 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
23db0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
23dc0 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
23dd0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
23de0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
23df0 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
23e00 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
23e10 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
23e20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
23e30 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
23e40 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
23e50 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
23e60 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
23e70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
23e80 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
23e90 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
23ea0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
23eb0 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
23ec0 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
23ed0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23ee0 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
23ef0 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
23f00 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
23f10 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
23f20 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
23f30 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
23f40 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
23f50 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
23f60 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
23f70 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
23f80 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
23f90 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
23fa0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
23fb0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
23fc0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
23fd0 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29   TK_ASTERISK, 0)
23fe0 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
23ff0 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
24000 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
24010 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
24020 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
24030 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
24040 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
24050 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  Prior = 0;.  p->
24060 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  pNext = 0;.  p->
24070 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  pWith = 0;.  p->
24080 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
24090 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65  Compound;.  asse
240a0 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
240b0 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29   & SF_Converted)
240c0 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
240d0 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65  lags |= SF_Conve
240e0 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  rted;.  assert( 
240f0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
24100 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
24110 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
24120 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
24130 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  = 0;.  pNew->pOf
24140 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  fset = 0;.  retu
24150 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
24160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
24170 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52  to see if the FR
24180 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
24190 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76  From has table-v
241a0 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a  alued function.*
241b0 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66  * arguments.  If
241c0 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20   it does, leave 
241d0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
241e0 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
241f0 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
24200 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69  o, since pFrom i
24210 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
24220 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75   be a table-valu
24230 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed function..*/.
24240 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f  static int canno
24250 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  tBeFunction(Pars
24260 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
24270 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24280 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
24290 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  rom->fg.isTabFun
242a0 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
242b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
242c0 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20   "'%s' is not a 
242d0 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d  function", pFrom
242e0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
242f0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
24300 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
24310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
24320 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  TE./*.** Argumen
24330 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d  t pWith (which m
24340 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e  ay be NULL) poin
24350 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c  ts to a linked l
24360 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a  ist of nested .*
24370 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c  * WITH contexts,
24380 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f   from inner to o
24390 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65  utermost. If the
243a0 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
243b0 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c  d by .** FROM cl
243c0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74  ause element pIt
243d0 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63  em is really a c
243e0 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72  ommon-table-expr
243f0 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a  ession (CTE) .**
24400 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
24410 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54  ointer to the CT
24420 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  E definition for
24430 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68   that table. Oth
24440 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
24450 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
24460 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
24470 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65   is returned, se
24480 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20  t *ppContext to 
24490 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74  point to the Wit
244a0 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  h.** object that
244b0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54   the returned CT
244c0 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f  E belongs to..*/
244d0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43  .static struct C
244e0 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a  te *searchWith(.
244f0 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24510 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e    /* Current inn
24520 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  ermost WITH clau
24530 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
24540 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
24550 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  em,     /* FROM 
24560 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74  clause element t
24570 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57  o resolve */.  W
24580 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20  ith **ppContext 
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
245a0 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75  * OUT: WITH clau
245b0 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  se return value 
245c0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b  belongs to */.){
245d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
245e0 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65  Name;.  if( pIte
245f0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
24600 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65  && (zName = pIte
24610 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  m->zName)!=0 ){.
24620 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20      With *p;.   
24630 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b   for(p=pWith; p;
24640 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20   p=p->pOuter){. 
24650 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
24660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
24670 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
24680 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
24690 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d  trICmp(zName, p-
246a0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
246b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  ){.          *pp
246c0 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20  Context = p;.   
246d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70         return &p
246e0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
246f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
24700 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
24710 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67  }../* The code g
24720 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69  enerator maintai
24730 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63  ns a stack of ac
24740 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65  tive WITH clause
24750 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  s.** with the in
24760 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c  ner-most WITH cl
24770 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68  ause being at th
24780 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
24790 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
247a0 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68  outine pushes th
247b0 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61  e WITH clause pa
247c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
247d0 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f  nd argument.** o
247e0 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74  nto the top of t
247f0 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67  he stack. If arg
24800 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74  ument bFree is t
24810 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  rue, then this.*
24820 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69  * WITH clause wi
24830 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70  ll never be popp
24840 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
24850 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
24860 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  it.** should be 
24870 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  freed along with
24880 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
24890 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65  t. In other case
248a0 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65  s, when.** bFree
248b0 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62  ==0, the With ob
248c0 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65  ject will be fre
248d0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
248e0 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61  e SELECT .** sta
248f0 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63  tement with whic
24900 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74  h it is associat
24910 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
24920 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73  te3WithPush(Pars
24930 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20  e *pParse, With 
24940 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65  *pWith, u8 bFree
24950 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72  ){.  assert( bFr
24960 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  ee==0 || (pParse
24970 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50  ->pWith==0 && pP
24980 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
24990 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  e==0) );.  if( p
249a0 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65  With ){.    asse
249b0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
249c0 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h!=pWith );.    
249d0 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20  pWith->pOuter = 
249e0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
249f0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
24a00 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
24a10 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65  ( bFree ) pParse
24a20 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20  ->pWithToFree = 
24a30 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pWith;.  }.}../*
24a40 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24a50 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
24a60 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
24a70 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
24a80 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
24a90 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
24aa0 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
24ab0 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
24ac0 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
24ad0 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
24ae0 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
24af0 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
24b00 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
24b10 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
24b20 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
24b30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
24b40 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
24b50 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
24b60 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
24b70 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
24b80 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
24b90 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
24ba0 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
24bb0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
24bc0 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
24bd0 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
24be0 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
24bf0 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
24c00 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
24c10 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
24c20 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
24c30 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
24c40 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24c50 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
24c60 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
24c70 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
24c80 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
24c90 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
24ca0 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
24cb0 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
24cc0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
24cd0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
24ce0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
24cf0 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
24d00 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
24d10 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24d20 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
24d30 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
24d40 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
24d50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24d60 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
24d70 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d90 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
24da0 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
24db0 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
24dc0 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
24dd0 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
24de0 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
24df0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
24e00 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
24e10 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
24e20 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
24e30 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
24e40 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
24e50 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
24e60 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
24e70 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
24e80 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
24e90 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
24ea0 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
24eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
24ec0 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
24ed0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
24ee0 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24f00 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
24f10 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
24f20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
24f30 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
24f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
24f50 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
24f60 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
24f70 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
24f80 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d  >zCteErr is non-
24f90 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
24fa0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
24fb0 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
24fc0 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
24fd0 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
24fe0 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
24ff0 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
25000 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
25010 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
25020 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  CteErr is NULL, 
25030 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
25040 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
25050 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
25060 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
25070 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
25080 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  ( pCte->zCteErr 
25090 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
250a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
250b0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20   pCte->zCteErr, 
250c0 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
250d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
250e0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
250f0 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46     if( cannotBeF
25100 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
25110 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
25120 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
25130 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
25140 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
25150 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
25160 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
25170 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
25180 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
25190 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
251a0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
251b0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62  ;.    pTab->nTab
251c0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
251d0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
251e0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
251f0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
25200 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
25210 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
25220 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
25230 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
25240 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
25250 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  6) );.    pTab->
25260 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
25270 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f  phemeral | TF_No
25280 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
25290 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
252a0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
252b0 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  Dup(db, pCte->pS
252c0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
252d0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
252e0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
252f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25300 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25310 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  m->pSelect );.. 
25320 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
25330 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
25340 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70  ve CTE. */.    p
25350 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
25360 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65  lect;.    bMayRe
25370 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c  cursive = ( pSel
25380 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
25390 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  pSel->op==TK_UNI
253a0 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  ON );.    if( bM
253b0 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
253c0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
253d0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
253e0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
253f0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  ->pSrc;.      fo
25400 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
25410 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
25420 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
25430 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
25440 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pSrc->a[i];.   
25450 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
25460 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20  zDatabase==0 .  
25470 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
25480 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20  >zName!=0 .     
25490 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
254a0 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e  3StrICmp(pItem->
254b0 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61  zName, pCte->zNa
254c0 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  me).          ){
254d0 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
254e0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
254f0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
25500 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d  fg.isRecursive =
25510 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
25520 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
25530 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73           pSel->s
25540 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
25550 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20  cursive;.       
25560 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
25570 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  ..    /* Only on
25580 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
25590 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74  rence is permitt
255a0 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20  ed. */ .    if( 
255b0 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20  pTab->nTabRef>2 
255c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
255d0 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
255e0 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
255f0 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
25600 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
25610 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
25620 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
25630 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25640 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
25650 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
25660 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20  ->nTabRef==1 || 
25670 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ((pSel->selFlags
25680 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26  &SF_Recursive) &
25690 26 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d  & pTab->nTabRef=
256a0 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65  =2 ));..    pCte
256b0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72  ->zCteErr = "cir
256c0 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a  cular reference:
256d0 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64   %s";.    pSaved
256e0 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70  With = pParse->p
256f0 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
25700 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
25710 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
25720 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
25730 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
25740 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSel->pPrior;. 
25750 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
25760 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b  ior->pWith==0 );
25770 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
25780 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69  With = pSel->pWi
25790 74 68 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  th;.      sqlite
257a0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
257b0 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20  ker, pPrior);.  
257c0 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74      pPrior->pWit
257d0 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  h = 0;.    }else
257e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  {.      sqlite3W
257f0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
25800 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
25810 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
25820 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20  h = pWith;..    
25830 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20  for(pLeft=pSel; 
25840 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70  pLeft->pPrior; p
25850 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69  Left=pLeft->pPri
25860 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  or);.    pEList 
25870 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b  = pLeft->pEList;
25880 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70  .    if( pCte->p
25890 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66  Cols ){.      if
258a0 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
258b0 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d  st->nExpr!=pCte-
258c0 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b  >pCols->nExpr ){
258d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
258e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
258f0 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25   "table %s has %
25900 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20  d values for %d 
25910 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20  columns",.      
25920 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d        pCte->zNam
25930 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  e, pEList->nExpr
25940 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  , pCte->pCols->n
25950 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  Expr.        );.
25960 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
25970 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
25980 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  th;.        retu
25990 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
259a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
259b0 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43  EList = pCte->pC
259c0 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ols;.    }..    
259d0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
259e0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
259f0 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62  e, pEList, &pTab
25a00 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
25a10 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  Col);.    if( bM
25a20 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
25a30 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73       if( pSel->s
25a40 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
25a50 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
25a60 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
25a70 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75  = "multiple recu
25a80 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 73  rsive references
25a90 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c  : %s";.      }el
25aa0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65  se{.        pCte
25ab0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63  ->zCteErr = "rec
25ac0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
25ad0 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20   in a subquery: 
25ae0 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
25af0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
25b00 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
25b10 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  el);.    }.    p
25b20 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30  Cte->zCteErr = 0
25b30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
25b40 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
25b50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
25b60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
25b70 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
25b80 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
25b90 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
25ba0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
25bb0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68  econd argument h
25bc0 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64  as an associated
25bd0 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65   WITH .** clause
25be0 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68  , pop it from th
25bf0 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61  e stack stored a
25c00 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61  s part of the Pa
25c10 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  rse object..**.*
25c20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25c30 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78  is used as the x
25c40 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28  SelectCallback2(
25c50 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a  ) callback by.**
25c60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
25c70 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b  pand() when walk
25c80 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65  ing a SELECT tre
25c90 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62  e to resolve tab
25ca0 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20  le.** names and 
25cb0 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
25cc0 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a  e elements. .*/.
25cd0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
25ce0 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72  ctPopWith(Walker
25cf0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
25d00 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
25d10 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
25d20 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  ->pParse;.  if( 
25d30 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 26 26  pParse->pWith &&
25d40 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
25d50 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68  .    With *pWith
25d60 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
25d70 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  (p)->pWith;.    
25d80 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
25d90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
25da0 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
25db0 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  th );.      pPar
25dc0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
25dd0 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d  h->pOuter;.    }
25de0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
25df0 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
25e00 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
25e10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25e20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
25e30 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
25e40 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
25e50 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
25e60 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
25e70 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
25e80 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
25e90 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
25ea0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
25eb0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
25ec0 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
25ed0 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
25ee0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25ef0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
25f00 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
25f10 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
25f20 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
25f30 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
25f40 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
25f50 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
25f60 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
25f70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25f80 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
25f90 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
25fa0 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
25fb0 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
25fc0 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
25fd0 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
25fe0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
25ff0 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
26000 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
26010 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
26020 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
26030 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
26040 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
26050 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
26060 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
26070 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
26080 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
26090 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70  e persistent rep
260a0 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
260b0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
260c0 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
260d0 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
260e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
260f0 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
26100 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
26110 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
26120 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
26130 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
26140 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
26150 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
26160 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
26170 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
26180 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
26190 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
261a0 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
261b0 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
261c0 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
261d0 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
261e0 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
261f0 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
26200 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
26210 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
26220 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
26230 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
26240 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
26250 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
26260 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
26270 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
26280 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
26290 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
262a0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
262b0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
262c0 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
262d0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
262e0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
262f0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
26300 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
26310 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
26320 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
26330 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
26340 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
26350 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
26360 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c  ags;..  p->selFl
26370 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
26380 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ed;.  if( db->ma
26390 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
263a0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
263b0 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  ort;.  }.  if( N
263c0 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29  EVER(p->pSrc==0)
263d0 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20   || (selFlags & 
263e0 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
263f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
26400 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
26410 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
26420 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
26430 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
26440 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73  ->pWith ){.    s
26450 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
26460 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c  Parse, p->pWith,
26470 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   0);.  }..  /* M
26480 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
26490 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
264a0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
264b0 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
264c0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
264d0 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
264e0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
264f0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
26500 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
26510 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
26520 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
26530 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
26540 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
26550 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
26560 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
26570 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
26580 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
26590 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
265a0 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
265b0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
265c0 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
265d0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
265e0 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
265f0 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
26600 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
26610 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
26620 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
26630 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
26640 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
26650 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
26660 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d  >fg.isRecursive=
26670 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
26680 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
26690 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
266a0 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65  rsive ) continue
266b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
266c0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
266d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
266e0 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20  MIT_CTE.    if( 
266f0 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b  withExpand(pWalk
26700 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  er, pFrom) ) ret
26710 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26720 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
26730 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e  ab ) {} else.#en
26740 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f  dif.    if( pFro
26750 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
26760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26770 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
26780 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
26790 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
267a0 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
267b0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
267c0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
267d0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
267e0 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
267f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26800 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
26810 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26820 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
26830 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65  lker, pSel) ) re
26840 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26850 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
26860 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
26870 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
26880 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
26890 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
268a0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
268b0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
268c0 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
268d0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
268e0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
268f0 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
26900 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29  _sq_%p", (void*)
26910 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
26920 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
26930 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
26940 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
26950 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
26960 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
26970 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
26980 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54  ,&pTab->nCol,&pT
26990 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->aCol);.     
269a0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
269b0 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  1;.      pTab->n
269c0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
269d0 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
269e0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
269f0 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54  576) );.      pT
26a00 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
26a10 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65  TF_Ephemeral;.#e
26a20 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
26a30 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
26a40 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
26a50 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
26a60 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
26a70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
26a80 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
26a90 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
26aa0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
26ab0 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
26ac0 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d  pParse, 0, pFrom
26ad0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
26ae0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
26af0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69  C_Abort;.      i
26b00 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  f( pTab->nTabRef
26b10 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  >=0xffff ){.    
26b20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26b30 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
26b40 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73   many references
26b50 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20   to \"%s\": max 
26b60 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20  65535",.        
26b70 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b     pTab->zName);
26b80 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
26b90 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
26ba0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
26bb0 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
26bc0 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
26bd0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  +;.      if( !Is
26be0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
26bf0 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
26c00 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  n(pParse, pFrom)
26c10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
26c20 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26c30 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e      }.#if !defin
26c40 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
26c50 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
26c60 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
26c70 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
26c80 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
26c90 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70  pTab) || pTab->p
26ca0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
26cb0 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20    i16 nCol;.    
26cc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
26cd0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
26ce0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
26cf0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
26d00 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
26d10 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
26d20 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
26d30 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
26d40 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
26d50 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
26d60 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
26d70 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
26d80 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53  etName(pFrom->pS
26d90 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61  elect, pTab->zNa
26da0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  me);.        nCo
26db0 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  l = pTab->nCol;.
26dc0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43          pTab->nC
26dd0 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ol = -1;.       
26de0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
26df0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  ct(pWalker, pFro
26e00 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
26e10 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
26e20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  = nCol;.      }.
26e30 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
26e40 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
26e50 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
26e60 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
26e70 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
26e80 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
26e90 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
26ea0 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
26eb0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
26ec0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
26ed0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
26ee0 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
26ef0 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
26f00 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
26f10 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
26f20 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
26f30 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
26f40 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
26f50 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
26f60 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
26f70 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
26f80 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
26f90 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
26fa0 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
26fb0 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
26fc0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
26fd0 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
26fe0 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
26ff0 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
27000 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
27010 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
27020 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
27030 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
27040 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
27050 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  h the TK_ASTERIS
27060 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  K operator for e
27070 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
27080 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
27090 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20  umn.  ** list.  
270a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
270b0 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
270c0 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54  ocate the TK_AST
270d0 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65  ERISK.  ** expre
270e0 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
270f0 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  d each one to th
27100 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
27110 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c  lumns in.  ** al
27120 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
27130 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
27140 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
27150 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
27160 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
27170 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
27180 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
27190 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
271a0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
271b0 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70  k++){.    pE = p
271c0 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
271d0 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
271e0 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29  p==TK_ASTERISK )
271f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
27200 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
27210 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
27220 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
27230 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
27240 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21  T || (pE->pLeft!
27250 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  =0 && pE->pLeft-
27260 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20  >op==TK_ID) );. 
27270 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
27280 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
27290 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45  ght->op==TK_ASTE
272a0 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  RISK ) break;.  
272b0 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
272c0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
272d0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
272e0 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
272f0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
27300 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
27310 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
27320 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
27330 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
27340 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
27350 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
27360 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
27370 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
27380 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
27390 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
273a0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
273b0 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
273c0 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
273d0 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
273e0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
273f0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
27400 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
27410 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
27420 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
27430 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
27450 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
27460 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
27470 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
27480 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
27490 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45  ; k++){.      pE
274a0 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
274b0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
274c0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
274d0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
274e0 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
274f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
27500 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45   pE->op!=TK_ASTE
27510 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28  RISK.       && (
27520 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
27530 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
27540 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20  _ASTERISK).     
27550 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
27560 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
27570 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
27580 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
27590 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
275a0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
275b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
275c0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
275d0 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
275e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
275f0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
27600 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
27610 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
27620 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
27630 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
27640 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
27650 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
27660 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
27670 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
27680 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
27690 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
276a0 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
276b0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
276c0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
276d0 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
276e0 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
276f0 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
27700 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
27710 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
27720 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
27730 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
27740 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
27750 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
27760 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
27770 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  TName = 0;      
27780 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
27790 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
277a0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
277b0 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
277c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
277d0 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
277e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
277f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27800 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
27810 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
27820 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
27830 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
27840 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
27850 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
27860 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
27870 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
27880 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
27890 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
278a0 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
278b0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
278c0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
278d0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
278e0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
278f0 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
27900 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
27910 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27920 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b  zSchemaName = 0;
27930 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
27940 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  Db;.          if
27950 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b  ( zTabName==0 ){
27960 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
27970 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
27980 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
27990 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
279a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
279b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
279c0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
279d0 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  | (pSub->selFlag
279e0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
279f0 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
27a00 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20       pSub = 0;. 
27a10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
27a20 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
27a30 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
27a40 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
27a60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
27a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27a80 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
27a90 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
27aa0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
27ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63  .            zSc
27ac0 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d  hemaName = iDb>=
27ad0 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 ? db->aDb[iDb]
27ae0 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b  .zDbSName : "*";
27af0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27b00 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
27b10 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
27b20 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
27b30 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
27b40 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
27b50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
27b60 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
27b70 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
27b80 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
27b90 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
27ba0 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
27bb0 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
27bc0 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
27bd0 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
27be0 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
27bf0 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
27c00 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
27c10 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
27c20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27c30 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
27c40 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
27c50 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20   && pSub.       
27c60 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
27c70 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53  MatchSpanName(pS
27c80 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
27c90 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d  .zSpan, 0, zTNam
27ca0 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  e, 0)==0.       
27cb0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27cc0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
27ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
27cf0 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
27d00 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c  ked as 'hidden',
27d10 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68   omit it from th
27d20 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
27d30 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
27d40 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73  -set list unless
27d50 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
27d60 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  the SF_IncludeHi
27d70 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  dden.           
27d80 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20   ** bit set..   
27d90 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
27da0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e          if( (p->
27db0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e  selFlags & SF_In
27dc0 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a  cludeHidden)==0.
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
27de0 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
27df0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a  pTab->aCol[j]) .
27e00 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
27e20 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27e30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27e40 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
27e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27e60 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
27e70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27e80 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66     if( (pFrom->f
27e90 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
27ea0 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
27ec0 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
27ed0 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
27ee0 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
27ef0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27f10 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
27f20 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
27f30 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
27f40 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
27f50 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
27f60 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
27f70 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
27f80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
27f90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
27fa0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
27fb0 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
27fc0 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
27fd0 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
27fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27ff0 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
28000 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
28010 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
28020 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
28030 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
28040 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
28050 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
28060 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
28070 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
28080 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
28090 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
280a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
280b0 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
280c0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
280d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
280e0 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
280f0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
28100 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
28110 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
28120 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
28130 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
28140 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
28150 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
28160 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
28170 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
28180 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
28190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
281a0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
281b0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
281c0 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
281d0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
281e0 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d    if( zSchemaNam
281f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
28200 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
28210 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
28220 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29  ID, zSchemaName)
28230 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28240 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
28250 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
28260 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45  K_DOT, pLeft, pE
28270 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
28280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28290 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
282a0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
282b0 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
282c0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
282d0 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
282e0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
28300 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
28310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28320 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
28330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28340 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
28350 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
28360 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
28370 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
28380 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
28390 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
283a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
283b0 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43  te3TokenInit(&sC
283c0 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  olname, zColname
283d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
283e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
283f0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
28400 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
28410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
28420 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73  f( pNew && (p->s
28430 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
28440 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20  tedFrom)!=0 ){. 
28450 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
28460 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
28470 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61  m *pX = &pNew->a
28480 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b  [pNew->nExpr-1];
28490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
284a0 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20  f( pSub ){.     
284b0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
284c0 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
284d0 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  StrDup(db, pSub-
284e0 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
284f0 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
28500 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28510 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
28530 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28540 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
28550 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
28560 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a  db, "%s.%s.%s",.
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
285a0 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  maName, zTabName
285b0 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
285d0 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
285e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
285f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28600 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73       pX->bSpanIs
28610 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Tab = 1;.       
28620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28630 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
28640 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
28650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
28670 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
28680 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
28690 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
286a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
286b0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
286c0 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
286d0 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
286e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
286f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
28700 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
28710 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
28720 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
28730 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28740 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
28750 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
28760 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
28770 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
28780 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
28790 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
287a0 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
287b0 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
287c0 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
287d0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
287e0 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
287f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28800 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
28810 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
28820 73 65 74 22 29 3b 0a 20 20 20 20 72 65 74 75 72  set");.    retur
28830 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
28840 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
28850 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28860 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
28870 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
28880 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
28890 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
288a0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
288b0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
288c0 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
288d0 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
288e0 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
288f0 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
28900 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
28910 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
28920 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
28930 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
28940 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
28950 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
28960 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
28970 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
28980 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
28990 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
289a0 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
289b0 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
289c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
289d0 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61  3ExprWalkNoop(Wa
289e0 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
289f0 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
28a00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28a10 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
28a20 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
28a30 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28a40 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
28a50 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
28a60 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20  rse-tree walker 
28a70 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
28a80 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65  ments..** subque
28a90 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
28aa0 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   tree..*/.int sq
28ab0 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e  lite3SelectWalkN
28ac0 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
28ad0 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  sed, Select *Not
28ae0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
28af0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
28b00 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
28b10 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28b20 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51  tinue;.}..#if SQ
28b30 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
28b40 20 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20   Always assert. 
28b50 20 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c   This xSelectCal
28b60 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74  lback2 implement
28b70 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61  ation proves tha
28b80 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74  t the.** xSelect
28b90 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76  Callback2 is nev
28ba0 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76  er invoked..*/.v
28bb0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
28bc0 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c  tWalkAssert2(Wal
28bd0 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65  ker *NotUsed, Se
28be0 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b  lect *NotUsed2){
28bf0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28c00 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
28c10 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72  tUsed2);.  asser
28c20 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  t( 0 );.}.#endif
28c30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
28c40 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
28c50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28c60 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
28c70 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
28c80 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
28c90 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
28ca0 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
28cb0 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
28cc0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
28cd0 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
28ce0 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
28cf0 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
28d00 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
28d10 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
28d20 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
28d30 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
28d40 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
28d50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28d60 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
28d70 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
28d80 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
28d90 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
28da0 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
28db0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
28dc0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
28dd0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
28de0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
28df0 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
28e00 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
28e10 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
28e20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
28e30 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
28e40 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
28e50 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
28e60 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
28e70 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
28e80 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
28e90 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
28ea0 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
28eb0 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
28ec0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
28ed0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
28ee0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
28ef0 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rse;.  if( pPars
28f00 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29  e->hasCompound )
28f10 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
28f20 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72  allback = conver
28f30 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
28f40 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77  oSubquery;.    w
28f50 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
28f60 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  2 = 0;.    sqlit
28f70 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
28f80 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20   pSelect);.  }. 
28f90 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
28fa0 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
28fb0 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  der;.  w.xSelect
28fc0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
28fd0 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c  ctPopWith;.  sql
28fe0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
28ff0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
29000 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29010 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
29020 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
29030 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
29040 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
29050 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
29060 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
29070 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
29080 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
29090 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
290a0 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
290b0 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
290c0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
290d0 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
290e0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
290f0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
29100 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
29110 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
29120 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
29130 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
29140 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
29150 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
29160 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
29170 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
29180 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
29190 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
291a0 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
291b0 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
291c0 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
291d0 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
291e0 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
291f0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
29200 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
29210 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
29220 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
29230 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
29240 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
29250 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
29260 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
29270 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
29280 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
29290 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
292a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
292b0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
292c0 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
292d0 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
292e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
292f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
29300 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
29310 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
29320 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
29330 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
29340 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
29350 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
29360 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Src;.  for(i=0, 
29370 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
29380 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
29390 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
293a0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
293b0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
293c0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
293d0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
293e0 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
293f0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
29400 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
29410 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
29420 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
29430 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
29440 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
29450 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
29460 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ct;.      if( pS
29470 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  el ){.        wh
29480 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
29490 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
294a0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
294b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
294c0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
294d0 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
294e0 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
294f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
29500 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
29510 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
29520 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
29530 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
29540 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
29550 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
29560 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
29570 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
29580 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
29590 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
295a0 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
295b0 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
295c0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
295d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
295e0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
295f0 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
29600 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
29610 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
29620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
29630 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
29640 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
29650 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
29660 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  lectWalkNoop;.  
29670 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
29680 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
29690 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
296a0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
296b0 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
296c0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
296d0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
296e0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
296f0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
29700 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
29710 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
29720 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
29730 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
29740 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
29750 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
29760 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
29770 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
29780 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
29790 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
297a0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
297b0 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
297c0 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
297d0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
297e0 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
297f0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
29800 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
29810 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
29820 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
29830 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
29840 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
29850 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
29860 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
29870 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
29880 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
29890 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
298a0 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
298b0 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
298c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
298d0 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
298e0 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
298f0 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
29900 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
29910 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
29920 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
29930 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
29940 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
29950 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
29960 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
29970 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
29980 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
29990 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
299a0 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
299b0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
299c0 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
299d0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
299e0 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  db;.  if( NEVER(
299f0 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
29a00 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
29a10 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
29a20 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
29a30 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  rn;.  if( p->sel
29a40 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
29a50 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
29a60 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
29a70 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70  Expand(pParse, p
29a80 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
29a90 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
29aa0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
29ab0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
29ac0 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
29ad0 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
29ae0 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
29af0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
29b00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
29b10 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
29b20 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
29b30 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a  o(pParse, p);.}.
29b40 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
29b50 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
29b60 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
29b70 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
29b80 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
29b90 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
29ba0 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
29bb0 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
29bc0 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
29bd0 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
29be0 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
29bf0 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
29c00 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e  de that stores N
29c10 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
29c20 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63  hose memory.** c
29c30 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
29c40 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
29c50 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
29c60 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
29c70 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
29c80 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
29c90 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
29ca0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
29cb0 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74  nc *pFunc;.  int
29cc0 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f   nReg = pAggInfo
29cd0 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e  ->nFunc + pAggIn
29ce0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  fo->nColumn;.  i
29cf0 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74  f( nReg==0 ) ret
29d00 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  urn;.#ifdef SQLI
29d10 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
29d20 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67  rify that all Ag
29d30 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20  gInfo registers 
29d40 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 72  are within the r
29d50 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20 62  ange specified b
29d60 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d  y.  ** AggInfo.m
29d70 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78  nReg..AggInfo.mx
29d80 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  Reg */.  assert(
29d90 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d   nReg==pAggInfo-
29da0 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d  >mxReg-pAggInfo-
29db0 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f  >mnReg+1 );.  fo
29dc0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
29dd0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
29de0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
29df0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
29e00 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
29e10 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
29e20 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  & pAggInfo->aCol
29e30 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
29e40 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
29e50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
29e60 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
29e70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
29e80 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
29e90 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e  [i].iMem>=pAggIn
29ea0 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20  fo->mnReg.      
29eb0 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e     && pAggInfo->
29ec0 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  aFunc[i].iMem<=p
29ed0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
29ee0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
29ef0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
29f00 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
29f10 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c  pAggInfo->mnReg,
29f20 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67   pAggInfo->mxReg
29f30 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70  );.  for(pFunc=p
29f40 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20  AggInfo->aFunc, 
29f50 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
29f60 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75  >nFunc; i++, pFu
29f70 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  nc++){.    if( p
29f80 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e  Func->iDistinct>
29f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
29fa0 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45   *pE = pFunc->pE
29fb0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
29fc0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
29fd0 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65  rty(pE, EP_xIsSe
29fe0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
29ff0 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d  f( pE->x.pList==
2a000 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  0 || pE->x.pList
2a010 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
2a020 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2a030 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44  orMsg(pParse, "D
2a040 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74  ISTINCT aggregat
2a050 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  es must have exa
2a060 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20  ctly one ".     
2a070 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22        "argument"
2a080 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  );.        pFunc
2a090 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
2a0a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a0b0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
2a0c0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
2a0d0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2a0e0 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69  Parse, pE->x.pLi
2a0f0 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  st, 0, 0);.     
2a100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a110 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2a120 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
2a130 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
2a140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a150 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2a160 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2a170 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
2a180 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2a190 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
2a1a0 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
2a1b0 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
2a1c0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2a1d0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
2a1e0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
2a1f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2a200 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
2a210 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
2a220 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
2a230 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2a240 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2a250 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
2a260 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2a270 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
2a280 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
2a290 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
2a2a0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
2a2b0 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
2a2c0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
2a2d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
2a2e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2a2f0 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
2a300 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2a310 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
2a320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2a330 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
2a340 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
2a350 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  List->nExpr : 0)
2a360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2a370 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d  eAppendP4(v, pF-
2a380 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
2a390 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
2a3a0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
2a3b0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
2a3c0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
2a3d0 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
2a3e0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
2a3f0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
2a400 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
2a410 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
2a420 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2a430 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2a440 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2a450 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2a460 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
2a470 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
2a480 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
2a490 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2a4a0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
2a4b0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2a4c0 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
2a4d0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
2a4e0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
2a4f0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
2a500 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2a510 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
2a520 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
2a530 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
2a540 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
2a550 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
2a560 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
2a570 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
2a580 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2a590 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
2a5a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2a5b0 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
2a5c0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
2a5d0 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
2a5e0 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
2a5f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2a600 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
2a610 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
2a620 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
2a630 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
2a640 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51  t, regAgg, 0, SQ
2a650 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a  LITE_ECEL_DUP);.
2a660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a670 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
2a680 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
2a690 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
2a6a0 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
2a6b0 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
2a6c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2a6d0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
2a6e0 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30  estcase( nArg==0
2a6f0 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f   );  /* Error co
2a700 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ndition */.     
2a710 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e   testcase( nArg>
2a720 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61  1 );   /* Also a
2a730 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
2a740 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
2a750 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69  arse, pF->iDisti
2a760 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31  nct, addrNext, 1
2a770 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d  , regAgg);.    }
2a780 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75  .    if( pF->pFu
2a790 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
2a7a0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
2a7b0 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f  COLL ){.      Co
2a7c0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
2a7d0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
2a7e0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
2a7f0 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  tem;.      int j
2a800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2a810 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  pList!=0 );  /* 
2a820 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e  pList!=0 if pF->
2a830 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f  pFunc has NEEDCO
2a840 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  LL */.      for(
2a850 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  j=0, pItem=pList
2a860 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  ->a; !pColl && j
2a870 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65  <nArg; j++, pIte
2a880 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43  m++){.        pC
2a890 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2a8a0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
2a8b0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
2a8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a8d0 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
2a8e0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72      pColl = pPar
2a8f0 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
2a900 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
2a910 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26   if( regHit==0 &
2a920 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  & pAggInfo->nAcc
2a930 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69  umulator ) regHi
2a940 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
2a950 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
2a960 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2a970 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69  P_CollSeq, regHi
2a980 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  t, 0, 0, (char *
2a990 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
2a9a0 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EQ);.    }.    s
2a9b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2a9c0 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c  (v, OP_AggStep0,
2a9d0 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
2a9e0 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  iMem);.    sqlit
2a9f0 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
2aa00 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  , pF->pFunc, P4_
2aa10 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
2aa20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2aa30 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
2aa40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2aa50 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
2aa60 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
2aa70 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  g, nArg);.    sq
2aa80 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2aa90 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
2aaa0 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
2aab0 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
2aac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2aad0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2aae0 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
2aaf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2ab00 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2ab10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2ab20 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74  * Before populat
2ab30 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
2ab40 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63  tor registers, c
2ab50 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
2ab60 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65  cache..  ** Othe
2ab70 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66  rwise, if any of
2ab80 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f   the required co
2ab90 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20  lumn values are 
2aba0 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20  already present 
2abb0 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  .  ** in registe
2abc0 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  rs, sqlite3ExprC
2abd0 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50  ode() may use OP
2abe0 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74  _SCopy to copy t
2abf0 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f  he value.  ** to
2ac00 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62   pC->iMem. But b
2ac10 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76  y the time the v
2ac20 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68  alue is used, th
2ac30 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73  e original regis
2ac40 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  ter.  ** may hav
2ac50 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76  e been used, inv
2ac60 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e  alidating the un
2ac70 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20  derlying buffer 
2ac80 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a  holding the.  **
2ac90 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61   text or blob va
2aca0 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20  lue. See ticket 
2acb0 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20  [883034dcb5]..  
2acc0 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20  **.  ** Another 
2acd0 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62  solution would b
2ace0 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  e to change the 
2acf0 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f  OP_SCopy used to
2ad00 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a   copy cached.  *
2ad10 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f  * values to an O
2ad20 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69  P_Copy..  */.  i
2ad30 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
2ad40 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
2ad50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2ad60 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
2ad70 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
2ad80 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
2ad90 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2ada0 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
2adb0 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
2adc0 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
2add0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2ade0 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
2adf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2ae00 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
2ae10 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
2ae20 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
2ae30 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
2ae40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2ae50 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2ae60 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65  .  if( addrHitTe
2ae70 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
2ae80 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2ae90 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20   addrHitTest);. 
2aea0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
2aeb0 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c  a single OP_Expl
2aec0 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
2aed0 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65  to the VDBE to e
2aee0 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a  xplain a simple.
2aef0 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72  ** count(*) quer
2af00 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  y ("SELECT count
2af10 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e  (*) FROM pTab").
2af20 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2af30 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
2af40 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
2af50 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a  ainSimpleCount(.
2af60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af80 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
2af90 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
2afa0 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
2afb0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
2afc0 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
2afd0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aff0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
2b000 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63  d to optimize sc
2b010 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  an, or NULL */.)
2b020 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
2b030 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
2b040 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28    int bCover = (
2b050 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73 52  pIdx!=0 && (HasR
2b060 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49  owid(pTab) || !I
2b070 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
2b080 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68  (pIdx)));.    ch
2b090 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74  ar *zEqp = sqlit
2b0a0 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
2b0b0 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c  ->db, "SCAN TABL
2b0c0 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20  E %s%s%s",.     
2b0d0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
2b0e0 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
2b0f0 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
2b100 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
2b110 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
2b120 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
2b130 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ".    );.    sql
2b140 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
2b150 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2b160 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69  pVdbe, OP_Explai
2b170 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
2b180 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70  ctId, 0, 0, zEqp
2b190 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20  , P4_DYNAMIC.   
2b1a0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
2b1b0 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
2b1c0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c  SimpleCount(a,b,
2b1d0 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
2b1e0 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   Context object 
2b1f0 66 6f 72 20 68 61 76 69 6e 67 54 6f 57 68 65 72  for havingToWher
2b200 65 45 78 70 72 43 62 28 29 2e 0a 2a 2f 0a 73 74  eExprCb()..*/.st
2b210 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68 65  ruct HavingToWhe
2b220 72 65 43 74 78 20 7b 0a 20 20 45 78 70 72 20 2a  reCtx {.  Expr *
2b230 2a 70 70 57 68 65 72 65 3b 0a 20 20 45 78 70 72  *ppWhere;.  Expr
2b240 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 0a  List *pGroupBy;.
2b250 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  };../*.** sqlite
2b260 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c  3WalkExpr() call
2b270 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61 76  back used by hav
2b280 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a  ingToWhere()..**
2b290 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65 20  .** If the node 
2b2a0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63 61  passed to the ca
2b2b0 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f 41  llback is a TK_A
2b2c0 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20  ND node, return 
2b2d0 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  .** WRC_Continue
2b2e0 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65 33   to tell sqlite3
2b2f0 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69 74  WalkExpr() to it
2b300 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 68  erate through ch
2b310 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  ild nodes..**.**
2b320 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
2b330 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e  rn WRC_Prune. In
2b340 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73 6f   this case, also
2b350 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a 2a   check if the .*
2b360 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  * sub-expression
2b370 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72 69   matches the cri
2b380 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67 20  teria for being 
2b390 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48 45  moved to the WHE
2b3a0 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66  RE.** clause. If
2b3b0 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20 74   so, add it to t
2b3c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2b3d0 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65 20  and replace the 
2b3e0 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a  sub-expression.*
2b3f0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41 56  * within the HAV
2b400 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
2b410 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 22  ith a constant "
2b420 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  1"..*/.static in
2b430 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45  t havingToWhereE
2b440 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70 57  xprCb(Walker *pW
2b450 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2b460 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
2b470 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op!=TK_AND ){.
2b480 20 20 20 20 73 74 72 75 63 74 20 48 61 76 69 6e      struct Havin
2b490 67 54 6f 57 68 65 72 65 43 74 78 20 2a 70 20 3d  gToWhereCtx *p =
2b4a0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 48 61 76   pWalker->u.pHav
2b4b0 69 6e 67 43 74 78 3b 0a 20 20 20 20 69 66 28 20  ingCtx;.    if( 
2b4c0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
2b4d0 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70  stantOrGroupBy(p
2b4e0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20  Walker->pParse, 
2b4f0 70 45 78 70 72 2c 20 70 2d 3e 70 47 72 6f 75 70  pExpr, p->pGroup
2b500 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  By) ){.      sql
2b510 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b  ite3 *db = pWalk
2b520 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  er->pParse->db;.
2b530 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
2b540 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
2b550 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
2b560 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
2b570 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20  okens[1], 0);.  
2b580 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
2b590 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57          Expr *pW
2b5a0 68 65 72 65 20 3d 20 2a 28 70 2d 3e 70 70 57 68  here = *(p->ppWh
2b5b0 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 53 57  ere);.        SW
2b5c0 41 50 28 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20  AP(Expr, *pNew, 
2b5d0 2a 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  *pExpr);.       
2b5e0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
2b5f0 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72  xprAnd(db, pWher
2b600 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  e, pNew);.      
2b610 20 20 2a 28 70 2d 3e 70 70 57 68 65 72 65 29 20    *(p->ppWhere) 
2b620 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
2b630 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2b640 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
2b650 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2b660 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2b670 54 72 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c  Transfer eligibl
2b680 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
2b690 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f   HAVING clause o
2b6a0 66 20 61 20 71 75 65 72 79 2c 20 77 68 69 63 68  f a query, which
2b6b0 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64   is.** processed
2b6c0 20 61 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c   after grouping,
2b6d0 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
2b6e0 61 75 73 65 2c 20 77 68 69 63 68 20 69 73 20 70  ause, which is p
2b6f0 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a  rocessed before.
2b700 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72  ** grouping. For
2b710 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75   example, the qu
2b720 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
2b730 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
2b740 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52  es> WHERE a=? GR
2b750 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
2b760 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a  b=? AND c=?.**.*
2b770 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
2b780 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  en as:.**.**   S
2b790 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61  ELECT * FROM <ta
2b7a0 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20  bles> WHERE a=? 
2b7b0 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59  AND b=? GROUP BY
2b7c0 20 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a   b HAVING c=?.**
2b7d0 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68  .** A term of th
2b7e0 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73  e HAVING express
2b7f0 69 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20  ion is eligible 
2b800 66 6f 72 20 74 72 61 6e 73 66 65 72 20 69 66 20  for transfer if 
2b810 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65  it consists.** e
2b820 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74  ntirely of const
2b830 61 6e 74 73 20 61 6e 64 20 65 78 70 72 65 73 73  ants and express
2b840 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c  ions that are al
2b850 73 6f 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  so GROUP BY term
2b860 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68  s that.** use th
2b870 65 20 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61  e "BINARY" colla
2b880 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a  tion sequence..*
2b890 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61  /.static void ha
2b8a0 76 69 6e 67 54 6f 57 68 65 72 65 28 0a 20 20 50  vingToWhere(.  P
2b8b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
2b8c0 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
2b8d0 42 79 2c 0a 20 20 45 78 70 72 20 2a 70 48 61 76  By,.  Expr *pHav
2b8e0 69 6e 67 2c 20 0a 20 20 45 78 70 72 20 2a 2a 70  ing, .  Expr **p
2b8f0 70 57 68 65 72 65 0a 29 7b 0a 20 20 73 74 72 75  pWhere.){.  stru
2b900 63 74 20 48 61 76 69 6e 67 54 6f 57 68 65 72 65  ct HavingToWhere
2b910 43 74 78 20 73 43 74 78 3b 0a 20 20 57 61 6c 6b  Ctx sCtx;.  Walk
2b920 65 72 20 73 57 61 6c 6b 65 72 3b 0a 0a 20 20 73  er sWalker;..  s
2b930 43 74 78 2e 70 70 57 68 65 72 65 20 3d 20 70 70  Ctx.ppWhere = pp
2b940 57 68 65 72 65 3b 0a 20 20 73 43 74 78 2e 70 47  Where;.  sCtx.pG
2b950 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2b960 79 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57  y;..  memset(&sW
2b970 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  alker, 0, sizeof
2b980 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57  (sWalker));.  sW
2b990 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70  alker.pParse = p
2b9a0 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72  Parse;.  sWalker
2b9b0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2b9c0 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78   havingToWhereEx
2b9d0 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  prCb;.  sWalker.
2b9e0 75 2e 70 48 61 76 69 6e 67 43 74 78 20 3d 20 26  u.pHavingCtx = &
2b9f0 73 43 74 78 3b 0a 20 20 73 71 6c 69 74 65 33 57  sCtx;.  sqlite3W
2ba00 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72  alkExpr(&sWalker
2ba10 2c 20 70 48 61 76 69 6e 67 29 3b 0a 7d 0a 0a 2f  , pHaving);.}../
2ba20 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
2ba30 65 20 69 66 20 74 68 65 20 70 54 68 69 73 20 65  e if the pThis e
2ba40 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69 73 74  ntry of pTabList
2ba50 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20   is a self-join 
2ba60 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65 77 2e  of a prior view.
2ba70 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68  .** If it is, th
2ba80 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 53 72  en return the Sr
2ba90 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72 20 74  cList_item for t
2baa0 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e 20 20  he prior view.  
2bab0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a  If it is not,.**
2bac0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a   then return 0..
2bad0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
2bae0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69   SrcList_item *i
2baf0 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20  sSelfJoinView(. 
2bb00 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2bb10 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st,           /*
2bb20 20 53 65 61 72 63 68 20 66 6f 72 20 73 65 6c 66   Search for self
2bb30 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73 20 46  -joins in this F
2bb40 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
2bb50 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2bb60 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f 2a 20  tem *pThis   /* 
2bb70 53 65 61 72 63 68 20 66 6f 72 20 70 72 69 6f 72  Search for prior
2bb80 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2bb90 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29  is subquery */.)
2bba0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
2bbb0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2bbc0 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20 70 54    for(pItem = pT
2bbd0 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d  abList->a; pItem
2bbe0 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29  <pThis; pItem++)
2bbf0 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  {.    if( pItem-
2bc00 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f  >pSelect==0 ) co
2bc10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2bc20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
2bc30 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75  outine ) continu
2bc40 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  e;.    if( pItem
2bc50 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e  ->zName==0 ) con
2bc60 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
2bc70 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
2bc80 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c  Item->zDatabase,
2bc90 20 70 54 68 69 73 2d 3e 7a 44 61 74 61 62 61 73   pThis->zDatabas
2bca0 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
2bcb0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2bcc0 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d  3_stricmp(pItem-
2bcd0 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a  >zName, pThis->z
2bce0 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  Name)!=0 ) conti
2bcf0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
2bd00 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2bd10 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 54  0, .          pT
2bd20 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57  his->pSelect->pW
2bd30 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  here, pItem->pSe
2bd40 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31  lect->pWhere, -1
2bd50 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
2bd60 2f 2a 20 54 68 65 20 76 69 65 77 20 77 61 73 20  /* The view was 
2bd70 6d 6f 64 69 66 69 65 64 20 62 79 20 73 6f 6d 65  modified by some
2bd80 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
2bd90 69 6f 6e 20 73 75 63 68 20 61 73 0a 20 20 20 20  ion such as.    
2bda0 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e 57 68 65    ** pushDownWhe
2bdb0 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20  reTerms() */.   
2bdc0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2bdd0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49   }.    return pI
2bde0 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tem;.  }.  retur
2bdf0 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
2be00 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45  QLITE_COUNTOFVIE
2be10 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  W_OPTIMIZATION./
2be20 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
2be30 74 72 61 6e 73 66 6f 72 6d 20 61 20 71 75 65 72  transform a quer
2be40 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  y of the form.**
2be50 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .**    SELECT co
2be60 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c  unt(*) FROM (SEL
2be70 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 55 4e  ECT x FROM t1 UN
2be80 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 79  ION ALL SELECT y
2be90 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20   FROM t2).**.** 
2bea0 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Into this:.**.**
2beb0 20 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45      SELECT (SELE
2bec0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2bed0 20 74 31 29 2b 28 53 45 4c 45 43 54 20 63 6f 75   t1)+(SELECT cou
2bee0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a  nt(*) FROM t2).*
2bef0 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 66 6f  *.** The transfo
2bf00 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72  rmation only wor
2bf10 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ks if all of the
2bf20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
2bf30 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  rue:.**.**   *  
2bf40 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
2bf50 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74  a UNION ALL of t
2bf60 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
2bf70 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72 65 20 69  .**   *  There i
2bf80 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20 47 52  s no WHERE or GR
2bf90 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47  OUP BY or HAVING
2bfa0 20 63 6c 61 75 73 65 73 20 6f 6e 20 74 68 65 20   clauses on the 
2bfb0 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20  subqueries.**   
2bfc0 2a 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  *  The outer que
2bfd0 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 63  ry is a simple c
2bfe0 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65  ount(*).**.** Re
2bff0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2c000 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2c010 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a   undertaken..*/.
2c020 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
2c030 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69  OfViewOptimizati
2c040 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
2c050 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2c060 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a 70  Select *pSub, *p
2c070 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70  Prior;.  Expr *p
2c080 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70 43  Expr;.  Expr *pC
2c090 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  ount;.  sqlite3 
2c0a0 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  *db;.  if( (p->s
2c0b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2c0c0 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65 74  regate)==0 ) ret
2c0d0 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69 73  urn 0;   /* This
2c0e0 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
2c0f0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
2c100 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2c110 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
2c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c130 20 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   Single result c
2c140 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72  olumn */.  pExpr
2c150 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
2c160 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
2c170 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
2c180 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
2c190 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
2c1a0 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61 67   Result is an ag
2c1b0 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28  gregate */.  if(
2c1c0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2c1d0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
2c1e0 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74 75  ,"count") ) retu
2c1f0 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62  rn 0;  /* Must b
2c200 65 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69  e count() */.  i
2c210 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  f( pExpr->x.pLis
2c220 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t!=0 ) return 0;
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c240 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e   /* Must be coun
2c250 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t(*) */.  if( p-
2c260 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29  >pSrc->nSrc!=1 )
2c270 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2c280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2c290 6e 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ne table in the 
2c2a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2c2b0 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pSub = p->pSrc-
2c2c0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
2c2d0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 72   if( pSub==0 ) r
2c2e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c300 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69     /* The FROM i
2c310 73 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  s a subquery */.
2c320 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
2c330 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  or==0 ) return 0
2c340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c350 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61      /* Must be a
2c360 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 71 75 65   compound subque
2c370 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  ry */.  do{.    
2c380 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b  if( pSub->op!=TK
2c390 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50  _ALL && pSub->pP
2c3a0 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
2c3b0 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49    /* Must be UNI
2c3c0 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66  ON ALL */.    if
2c3d0 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
2c3e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c400 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75  /* No WHERE clau
2c410 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  se */.    if( pS
2c420 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
2c430 46 5f 41 67 67 72 65 67 61 74 65 20 29 20 72 65  F_Aggregate ) re
2c440 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e  turn 0;     /* N
2c450 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
2c460 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53  */.    pSub = pS
2c470 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20  ub->pPrior;     
2c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c490 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65           /* Repe
2c4a0 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64  at over compound
2c4b0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 7d 77 68 69   terms */.  }whi
2c4c0 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20 20 2f  le( pSub );..  /
2c4d0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
2c4e0 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
2c4f0 65 61 6e 73 20 69 74 20 69 73 20 4f 4b 20 74 6f  eans it is OK to
2c500 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74 72 61   perform the tra
2c510 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a  nsformation */..
2c520 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2c530 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70 45  b;.  pCount = pE
2c540 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 30  xpr;.  pExpr = 0
2c550 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53  ;.  pSub = p->pS
2c560 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
2c570 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  ;.  p->pSrc->a[0
2c580 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20  ].pSelect = 0;. 
2c590 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
2c5a0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72  elete(db, p->pSr
2c5b0 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20  c);.  p->pSrc = 
2c5c0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2c5d0 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
2c5e0 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29  sizeof(*p->pSrc)
2c5f0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 75 62  );.  while( pSub
2c600 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 54   ){.    Expr *pT
2c610 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  erm;.    pPrior 
2c620 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a  = pSub->pPrior;.
2c630 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69 6f 72      pSub->pPrior
2c640 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e   = 0;.    pSub->
2c650 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70  pNext = 0;.    p
2c660 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sub->selFlags |=
2c670 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
2c680 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67     pSub->selFlag
2c690 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e  s &= ~SF_Compoun
2c6a0 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53 65  d;.    pSub->nSe
2c6b0 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20  lectRow = 0;.   
2c6c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2c6d0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 2d  Delete(db, pSub-
2c6e0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 54  >pEList);.    pT
2c6f0 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20 73  erm = pPrior ? s
2c700 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
2c710 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70  , pCount, 0) : p
2c720 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d  Count;.    pSub-
2c730 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
2c740 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
2c750 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65 72 6d  pParse, 0, pTerm
2c760 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 73  );.    pTerm = s
2c770 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2c780 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30  se, TK_SELECT, 0
2c790 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2c7a0 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28  3PExprAddSelect(
2c7b0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
2c7c0 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 45  Sub);.    if( pE
2c7d0 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xpr==0 ){.      
2c7e0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20  pExpr = pTerm;. 
2c7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c800 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
2c810 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
2c820 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70 45 78  PLUS, pTerm, pEx
2c830 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pr);.    }.    p
2c840 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  Sub = pPrior;.  
2c850 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  }.  p->pEList->a
2c860 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [0].pExpr = pExp
2c870 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  r;.  p->selFlags
2c880 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74   &= ~SF_Aggregat
2c890 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  e;..#if SELECTTR
2c8a0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2c8b0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2c8c0 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
2c8d0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2c8e0 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x400,pParse,p,(
2c8f0 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d  "After count-of-
2c900 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f  view optimizatio
2c910 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
2c920 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2c930 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2c940 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2c950 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
2c960 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49  SQLITE_COUNTOFVI
2c970 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EW_OPTIMIZATION 
2c980 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  */../*.** Genera
2c990 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
2c9a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2c9b0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20   given in the p 
2c9c0 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  argument.  .**.*
2c9d0 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
2c9e0 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72  e returned accor
2c9f0 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65  ding to the Sele
2ca00 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65  ctDest structure
2ca10 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
2ca20 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  s in sqliteInt.h
2ca30 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66   for further inf
2ca40 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
2ca50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2ca60 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
2ca70 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
2ca80 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
2ca90 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
2caa0 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
2cab0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2cac0 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
2cad0 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2cae0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2caf0 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
2cb00 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
2cb10 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
2cb20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
2cb30 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
2cb40 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e  o do that..*/.in
2cb50 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
2cb60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2cb70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2cb80 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2cb90 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
2cba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2cbb0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2cbc0 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
2cbd0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
2cbe0 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20   *pDest      /* 
2cbf0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
2cc00 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
2cc10 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
2cc20 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
2cc30 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2cc40 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  s */.  WhereInfo
2cc50 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a   *pWInfo;     /*
2cc60 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c   Return from sql
2cc70 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2cc80 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cca0 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
2ccb0 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
2ccc0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
2ccd0 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
2cce0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
2ccf0 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
2cd00 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
2cd10 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2cd20 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20  t = 0;  /* List 
2cd30 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
2cd40 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
2cd50 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
2cd60 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
2cd70 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
2cd80 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
2cd90 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
2cda0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
2cdb0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
2cdc0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
2cdd0 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
2cde0 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
2cdf0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2ce00 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
2ce10 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
2ce20 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
2ce30 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
2ce40 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  L */.  int rc = 
2ce50 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
2ce60 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
2ce70 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
2ce80 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63  ion */.  Distinc
2ce90 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20  tCtx sDistinct; 
2cea0 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
2ceb0 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49  o code the DISTI
2cec0 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20  NCT keyword */. 
2ced0 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20   SortCtx sSort; 
2cee0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
2cef0 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
2cf00 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2cf10 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  se */.  AggInfo 
2cf20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
2cf30 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
2cf40 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
2cf50 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
2cf60 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
2cf70 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2cf80 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
2cf90 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
2cfa0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
2cfb0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
2cfc0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
2cfd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2cfe0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
2cff0 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65  int iRestoreSele
2d000 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
2d010 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72  SelectId;.  pPar
2d020 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20  se->iSelectId = 
2d030 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2d040 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ectId++;.#endif.
2d050 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2d060 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  db;.  if( p==0 |
2d070 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2d080 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
2d090 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rr ){.    return
2d0a0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
2d0b0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
2d0c0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
2d0d0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
2d0e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
2d0f0 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30  set(&sAggInfo, 0
2d100 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66  , sizeof(sAggInf
2d110 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  o));.#if SELECTT
2d120 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
2d130 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
2d140 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54  dent++;.  SELECT
2d150 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
2d160 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73  , ("begin proces
2d170 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66  sing:\n"));.  if
2d180 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2d190 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2d1a0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2d1b0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2d1c0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2d1d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2d1e0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2d1f0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
2d200 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
2d210 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2d220 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2d230 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
2d240 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2d250 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2d260 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
2d270 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
2d280 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2d290 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2d2a0 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
2d2b0 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
2d2c0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2d2d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
2d2e0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d2f0 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
2d300 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
2d310 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
2d320 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2d330 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
2d340 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2d350 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
2d360 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2d370 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
2d380 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2d390 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
2d3a0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2d3b0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
2d3c0 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
2d3d0 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
2d3e0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
2d3f0 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
2d400 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
2d410 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
2d420 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
2d430 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
2d440 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
2d450 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
2d460 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2d470 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
2d480 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
2d490 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
2d4a0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
2d4b0 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
2d4c0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
2d4d0 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
2d4e0 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20   memset(&sSort, 
2d4f0 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29  0, sizeof(sSort)
2d500 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  );.  sSort.pOrde
2d510 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
2d520 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
2d530 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
2d540 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
2d550 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2d560 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
2d570 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73  ct_end;.  }.  as
2d580 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
2d590 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20  =0 );.  isAgg = 
2d5a0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2d5b0 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
2d5c0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2d5d0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2d5e0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2d5f0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2d600 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
2d610 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  00,pParse,p, ("a
2d620 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
2d630 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
2d640 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2d650 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2d660 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2d670 20 54 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20   Try to flatten 
2d680 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68  subqueries in th
2d690 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70  e FROM clause up
2d6a0 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71   into the main q
2d6b0 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64  uery.  */.#if !d
2d6c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2d6d0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
2d6e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2d6f0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
2d700 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
2d710 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
2d720 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
2d730 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2d740 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
2d750 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
2d760 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
2d770 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
2d780 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75  .    int isAggSu
2d790 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  b;.    Table *pT
2d7a0 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
2d7b0 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ;.    if( pSub==
2d7c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
2d7d0 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d     /* Catch mism
2d7e0 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c  atch in the decl
2d7f0 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  ared columns of 
2d800 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e  a view and the n
2d810 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
2d820 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53  columns in the S
2d830 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53  ELECT on the RHS
2d840 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
2d850 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45  ->nCol!=pSub->pE
2d860 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
2d870 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d880 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
2d890 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
2d8a0 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67  s for '%s' but g
2d8b0 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ot %d",.        
2d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
2d8d0 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
2d8e0 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c  zName, pSub->pEL
2d8f0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
2d900 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2d910 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  nd;.    }..    i
2d920 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d  sAggSub = (pSub-
2d930 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2d940 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
2d950 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
2d960 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
2d970 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67   i, isAgg, isAgg
2d980 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sub) ){.      /*
2d990 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63   This subquery c
2d9a0 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69  an be absorbed i
2d9b0 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20  nto its parent. 
2d9c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 41  */.      if( isA
2d9d0 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  ggSub ){.       
2d9e0 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20   isAgg = 1;.    
2d9f0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2da00 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
2da10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2da20 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2da30 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2da40 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Src;.    if( db-
2da50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2da60 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2da70 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
2da80 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
2da90 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  ) ){.      sSort
2daa0 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
2dab0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
2dac0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2dad0 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68  Get a pointer th
2dae0 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
2daf0 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63  struction, alloc
2db00 61 74 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45  ating a new VDBE
2db10 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65   if one.  ** doe
2db20 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
2db30 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ist */.  v = sql
2db40 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
2db50 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
2db60 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2db70 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d;..#ifndef SQLI
2db80 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
2db90 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e  _SELECT.  /* Han
2dba0 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  dle compound SEL
2dbb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75  ECT statements u
2dbc0 73 69 6e 67 20 74 68 65 20 73 65 70 61 72 61 74  sing the separat
2dbd0 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a  e multiSelect().
2dbe0 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a    ** procedure..
2dbf0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
2dc00 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  rior ){.    rc =
2dc10 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
2dc20 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
2dc30 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2dc40 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
2dc50 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
2dc60 65 53 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20  eSelectId);.#if 
2dc70 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2dc80 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52  LED.    SELECTTR
2dc90 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
2dca0 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  "end compound-se
2dcb0 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c  lect processing\
2dcc0 6e 22 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65  n"));.    pParse
2dcd0 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d  ->nSelectIndent-
2dce0 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  -;.#endif.    re
2dcf0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2dd00 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61  dif..  /* For ea
2dd10 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ch term in the F
2dd20 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74  ROM clause, do t
2dd30 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20  wo things:.  ** 
2dd40 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75  (1) Authorized u
2dd50 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
2dd60 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65  es.  ** (2) Gene
2dd70 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
2dd80 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20  l sub-queries.  
2dd90 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2dda0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2ddb0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2ddc0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2ddd0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2dde0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2ddf0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
2de00 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 0a   Select *pSub;..
2de10 20 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c      /* Issue SQL
2de20 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69  ITE_READ authori
2de30 7a 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66  zations with a f
2de40 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
2de50 66 6f 72 20 61 6e 79 20 74 61 62 6c 65 73 20 74  for any tables t
2de60 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 72  hat.    ** are r
2de70 65 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72  eferenced but fr
2de80 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75  om which no valu
2de90 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  es are extracted
2dea0 2e 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  . Examples of wh
2deb0 65 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a  ere these.    **
2dec0 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53   kinds of null S
2ded0 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f  QLITE_READ autho
2dee0 72 69 7a 61 74 69 6f 6e 73 20 77 6f 75 6c 64 20  rizations would 
2def0 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20  occur:.    **.  
2df00 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2df10 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2df20 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
2df30 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20  AD t1."".    ** 
2df40 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20      SELECT t1.* 
2df50 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d  FROM t1, t2;   -
2df60 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32  - SQLITE_READ t2
2df70 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ."".    **.    *
2df80 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d  * The fake colum
2df90 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70  n name is an emp
2dfa0 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69  ty string.  It i
2dfb0 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  s possible for a
2dfc0 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a   table to.    **
2dfd0 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e   have a column n
2dfe0 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70 74  amed by the empt
2dff0 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69  y string, in whi
2e000 63 68 20 63 61 73 65 20 74 68 65 72 65 20 69 73  ch case there is
2e010 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a   no way to.    *
2e020 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65  * distinguish be
2e030 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72  tween an unrefer
2e040 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20  enced table and 
2e050 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72 65  an actual refere
2e060 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
2e070 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  * "" column.  Th
2e080 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
2e090 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61  n was for the fa
2e0a0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74  ke column name t
2e0b0 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20  o be a NULL,.   
2e0c0 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
2e0d0 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20  be unambiguous. 
2e0e0 20 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68   But legacy auth
2e0f0 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
2e100 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a  cks might.    **
2e110 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75   assume the colu
2e120 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e  mn name is non-N
2e130 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74  ULL and segfault
2e140 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e  .  The use of an
2e150 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 20 20   empty string.  
2e160 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 66 61 6b    ** for the fak
2e170 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65  e column name se
2e180 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a  ems safer..    *
2e190 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2e1a0 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20  >colUsed==0 ){. 
2e1b0 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68       sqlite3Auth
2e1c0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
2e1d0 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d  LITE_READ, pItem
2e1e0 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74  ->zName, "", pIt
2e1f0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
2e200 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
2e210 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2e220 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
2e230 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2e240 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47  T_VIEW).    /* G
2e250 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2e260 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
2e270 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2e280 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  use.    */.    p
2e290 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
2e2a0 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53  lect;.    if( pS
2e2b0 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
2e2c0 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69  ;..    /* Someti
2e2d0 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  mes the code for
2e2e0 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c   a subquery will
2e2f0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f   be generated mo
2e300 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f  re than.    ** o
2e310 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71  nce, if the subq
2e320 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20  uery is part of 
2e330 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2e340 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   in a LEFT JOIN,
2e350 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d  .    ** for exam
2e360 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ple.  In that ca
2e370 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e  se, do not regen
2e380 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
2e390 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a  o manifest.    *
2e3a0 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20  * a view or the 
2e3b0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d  co-routine to im
2e3c0 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20  plement a view. 
2e3d0 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61   The first insta
2e3e0 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75  nce.    ** is su
2e3f0 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68  fficient, though
2e400 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
2e410 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20  to manifest the 
2e420 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20  view does need. 
2e430 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f     ** to be invo
2e440 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  ked again. */.  
2e450 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64    if( pItem->add
2e460 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20  rFillSub ){.    
2e470 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
2e480 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20  viaCoroutine==0 
2e490 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2e4a0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
2e4b0 74 20 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20  t manifests the 
2e4c0 76 69 65 77 20 6d 69 67 68 74 20 62 65 20 61 20  view might be a 
2e4d0 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65  one-time routine
2e4e0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  ,.        ** or 
2e4f0 69 74 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  it might need to
2e500 20 62 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63   be rerun on eac
2e510 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61  h iteration beca
2e520 75 73 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a  use it.        *
2e530 2a 20 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72  * encodes a corr
2e540 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e  elated subquery.
2e550 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74   */.        test
2e560 63 61 73 65 28 20 73 71 6c 69 74 65 33 56 64 62  case( sqlite3Vdb
2e570 65 47 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d  eGetOp(v, pItem-
2e580 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f  >addrFillSub)->o
2e590 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29  pcode==OP_Once )
2e5a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e5b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e5c0 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e  P_Gosub, pItem->
2e5d0 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  regReturn, pItem
2e5e0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a  ->addrFillSub);.
2e5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
2e600 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
2e610 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
2e620 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79  Parse.nHeight by
2e630 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
2e640 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65  he largest expre
2e650 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65  ssion.    ** tre
2e660 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  e referred to by
2e670 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
2e680 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
2e690 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
2e6a0 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
2e6b0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
2e6c0 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
2e6d0 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
2e6e0 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
2e6f0 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
2e700 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
2e710 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
2e720 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
2e730 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
2e740 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
2e750 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
2e760 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
2e770 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
2e780 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
2e790 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
2e7a0 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  t(p);..    /* Ma
2e7b0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e  ke copies of con
2e7c0 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75  stant WHERE-clau
2e7d0 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  se terms in the 
2e7e0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e  outer query down
2e7f0 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74  .    ** inside t
2e800 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
2e810 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20  is can help the 
2e820 73 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20  subquery to run 
2e830 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
2e840 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e850 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pItem->fg.join
2e860 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
2e870 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 75 73 68  ==0.     && push
2e880 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
2e890 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e  Parse, pSub, p->
2e8a0 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69  pWhere, pItem->i
2e8b0 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23  Cursor).    ){.#
2e8c0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2e8d0 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28  NABLED.      if(
2e8e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2e8f0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2e900 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41         SELECTTRA
2e910 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2e920 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d  p,("After WHERE-
2e930 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e  clause push-down
2e940 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  :\n"));.        
2e950 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2e960 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2e970 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2e980 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
2e990 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
2e9a0 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71  plement the subq
2e9b0 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20  uery.    **.    
2e9c0 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
2e9d0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
2e9e0 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  s a co-routine i
2e9f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
2ea00 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 20  re true:.    ** 
2ea10 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
2ea20 65 72 79 20 69 73 20 67 75 61 72 61 6e 74 65 65  ery is guarantee
2ea30 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65  d to be the oute
2ea40 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20  r loop (so that 
2ea50 69 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  it.    **       
2ea60 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2ea70 6f 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6d 6f  o be computed mo
2ea80 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20  re than once).  
2ea90 20 20 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20    **   (2)  The 
2eaa0 41 4c 4c 20 6b 65 79 77 6f 72 64 20 61 66 74 65  ALL keyword afte
2eab0 72 20 53 45 4c 45 43 54 20 69 73 20 6f 6d 69 74  r SELECT is omit
2eac0 74 65 64 2e 20 20 28 41 70 70 6c 69 63 61 74 69  ted.  (Applicati
2ead0 6f 6e 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 20  ons are.    **  
2eae0 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f        allowed to
2eaf0 20 73 61 79 20 22 53 45 4c 45 43 54 20 41 4c 4c   say "SELECT ALL
2eb00 22 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73  " instead of jus
2eb10 74 20 22 53 45 4c 45 43 54 22 20 74 6f 20 64 69  t "SELECT" to di
2eb20 73 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20  sable.    **    
2eb30 20 20 20 20 74 68 65 20 75 73 65 20 6f 66 20 63      the use of c
2eb40 6f 2d 72 6f 75 74 69 6e 65 73 2e 29 0a 20 20 20  o-routines.).   
2eb50 20 2a 2a 20 20 20 28 33 29 20 20 43 6f 2d 72 6f   **   (3)  Co-ro
2eb60 75 74 69 6e 65 73 20 61 72 65 20 6e 6f 74 20 64  utines are not d
2eb70 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 73 71  isabled using sq
2eb80 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2eb90 6f 6c 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  ol().    **     
2eba0 20 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54     with SQLITE_T
2ebb0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
2ebc0 54 49 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20 20  TIONS..    **.  
2ebd0 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74    ** TODO: Are t
2ebe0 68 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f  here other reaso
2ebf0 6e 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f  ns beside (1) to
2ec00 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e   use a co-routin
2ec10 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65  e.    ** impleme
2ec20 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a  ntation?.    */.
2ec30 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20      if( i==0.   
2ec40 20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e    && (pTabList->
2ec50 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
2ec60 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
2ec70 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
2ec80 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
2ec90 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28  ROSS))!=0)  /* (
2eca0 31 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 28 70  1) */.     && (p
2ecb0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2ecc0 41 6c 6c 29 3d 3d 30 20 20 20 20 20 20 20 20 20  All)==0         
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ece0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
2ecf0 20 2a 2f 0a 20 20 20 20 20 26 26 20 4f 70 74 69   */.     && Opti
2ed00 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2ed10 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43  db, SQLITE_SubqC
2ed20 6f 72 6f 75 74 69 6e 65 29 20 20 20 20 20 20 20  oroutine)       
2ed30 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a          /* (3) *
2ed40 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  /.    ){.      /
2ed50 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f  * Implement a co
2ed60 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  -routine that wi
2ed70 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  ll return a sing
2ed80 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
2ed90 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
2eda0 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  t on each invoca
2edb0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
2edc0 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2edd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2ede0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a  rrentAddr(v)+1;.
2edf0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
2ee00 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
2ee10 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2ee20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2ee30 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
2ee40 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2ee50 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54  Return, 0, addrT
2ee60 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
2ee70 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
2ee80 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2ee90 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ame));.      pIt
2eea0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2eeb0 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  = addrTop;.     
2eec0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2eed0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
2eee0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
2eef0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2ef00 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2ef10 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2ef20 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2ef30 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2ef40 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
2ef50 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
2ef60 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
2ef70 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
2ef80 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2ef90 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2efa0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
2efb0 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
2efc0 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   1;.      pItem-
2efd0 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73  >regResult = des
2efe0 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73  t.iSdst;.      s
2eff0 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
2f000 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d  outine(v, pItem-
2f010 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2f020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2f030 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
2f040 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p-1);.      sqli
2f050 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
2f060 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
2f070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2f080 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
2f090 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2f0a0 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65  l fill an epheme
2f0b0 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20  ral table with. 
2f0c0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74       ** the cont
2f0d0 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71  ent of this subq
2f0e0 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64  uery.  pItem->ad
2f0f0 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70  drFillSub will p
2f100 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f  oint.      ** to
2f110 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2f120 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75  the generated su
2f130 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d  broutine.  pItem
2f140 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20  ->regReturn.    
2f150 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74    ** is a regist
2f160 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  er allocated to 
2f170 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74  hold the subrout
2f180 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  ine return addre
2f190 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ss.      */.    
2f1a0 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20    int topAddr;. 
2f1b0 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64       int onceAdd
2f1c0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
2f1d0 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20   retAddr;.      
2f1e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2f1f0 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20  tem *pPrior;..  
2f200 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2f210 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
2f220 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
2f230 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
2f240 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2f250 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
2f260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f270 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2f280 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2f290 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
2f2a0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2f2b0 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
2f2c0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
2f2d0 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
2f2e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2f2f0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
2f300 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
2f310 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
2f320 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
2f330 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
2f340 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
2f350 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
2f360 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
2f370 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
2f380 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
2f390 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
2f3a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
2f3b0 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
2f3c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2f3d0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2f3e0 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
2f3f0 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
2f400 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2f410 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2f420 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
2f430 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
2f440 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
2f450 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2f460 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
2f470 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69        pPrior = i
2f480 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54  sSelfJoinView(pT
2f490 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a  abList, pItem);.
2f4a0 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
2f4b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f4c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f4d0 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74   OP_OpenDup, pIt
2f4e0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72  em->iCursor, pPr
2f4f0 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ior->iCursor);. 
2f500 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65         explainSe
2f510 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2f520 69 53 65 6c 65 63 74 49 64 2c 20 70 50 72 69 6f  iSelectId, pPrio
2f530 72 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20  r->iSelectId);. 
2f540 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f550 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d  Prior->pSelect!=
2f560 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75  0 );.        pSu
2f570 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  b->nSelectRow = 
2f580 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d  pPrior->pSelect-
2f590 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
2f5a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f5b0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2f5c0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2f5d0 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
2f5e0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2f5f0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2f600 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2f610 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2f620 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2f630 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tId);.        sq
2f640 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2f650 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2f660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f670 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
2f680 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e  wLogEst = pSub->
2f690 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
2f6a0 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
2f6b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2f6c0 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
2f6d0 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
2f6e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2f6f0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2f700 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
2f710 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
2f720 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
2f730 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
2f740 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2f750 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2f760 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
2f770 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
2f780 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
2f790 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
2f7a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2f7b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2f7c0 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2f7d0 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65  _end;.    pParse
2f7e0 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
2f7f0 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
2f800 69 67 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a  ight(p);.#endif.
2f810 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75    }..  /* Variou
2f820 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  s elements of th
2f830 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20  e SELECT copied 
2f840 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61  into local varia
2f850 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f  bles for.  ** co
2f860 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70  nvenience */.  p
2f870 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
2f880 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  t;.  pWhere = p-
2f890 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
2f8a0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
2f8b0 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
2f8c0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69  ->pHaving;.  sDi
2f8d0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20  stinct.isTnct = 
2f8e0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2f8f0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
2f900 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2f910 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2f920 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2f930 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
2f940 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
2f950 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
2f960 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  ter all FROM-cla
2f970 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  use analysis:\n"
2f980 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2f990 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2f9a0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2f9b0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
2f9c0 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
2f9d0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
2f9e0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2f9f0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2fa00 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53  QueryFlattener|S
2fa10 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65  QLITE_CountOfVie
2fa20 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66  w).   && countOf
2fa30 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
2fa40 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
2fa50 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2fa60 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2fa70 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2fa80 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
2fa90 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  ist;.    pTabLis
2faa0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d  t = p->pSrc;.  }
2fab0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2fac0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
2fad0 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
2fae0 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
2faf0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
2fb00 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
2fb10 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
2fb20 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2fb30 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
2fb40 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
2fb50 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
2fb60 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
2fb70 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
2fb80 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
2fb90 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2fba0 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
2fbb0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
2fbc0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
2fbd0 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
2fbe0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2fbf0 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
2fc00 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
2fc10 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2fc20 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
2fc30 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
2fc40 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
2fc50 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
2fc60 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
2fc70 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
2fc80 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
2fc90 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
2fca0 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
2fcb0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
2fcc0 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
2fcd0 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
2fce0 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
2fcf0 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
2fd00 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
2fd10 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
2fd20 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
2fd30 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
2fd40 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
2fd50 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
2fd60 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
2fd70 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
2fd80 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
2fd90 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
2fda0 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
2fdb0 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
2fdc0 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
2fdd0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2fde0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2fdf0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
2fe00 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
2fe10 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2fe20 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
2fe30 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
2fe40 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
2fe50 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
2fe60 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
2fe70 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
2fe80 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
2fe90 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
2fea0 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
2feb0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
2fec0 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
2fed0 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
2fee0 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
2fef0 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
2ff00 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
2ff10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
2ff20 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2ff30 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
2ff40 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2ff50 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2ff60 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
2ff70 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
2ff80 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2ff90 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
2ffa0 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
2ffb0 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
2ffc0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2ffd0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2ffe0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2fff0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
30000 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
30010 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
30020 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
30030 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
30040 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
30050 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
30060 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
30070 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
30080 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
30090 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
300a0 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
300b0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
300c0 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
300d0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
300e0 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
300f0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
30100 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
30110 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
30120 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
30130 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
30140 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
30150 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
30160 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
30170 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
30180 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
30190 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
301a0 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
301b0 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
301c0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
301d0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
301e0 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
301f0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
30200 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
30210 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
30220 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
30230 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
30240 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
30250 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
30260 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
30270 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30280 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
30290 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
302a0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
302b0 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
302c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
302d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
302e0 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
302f0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
30300 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
30310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
30320 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
30330 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
30340 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
30350 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
30360 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
30370 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
30380 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
30390 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
303a0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
303b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
303c0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
303d0 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
303e0 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
303f0 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
30400 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
30410 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
30420 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
30430 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28  abel(v);.  if( (
30440 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
30450 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20  _FixedLimit)==0 
30460 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  ){.    p->nSelec
30470 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
30480 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
30490 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c  /.  }.  computeL
304a0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
304b0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
304c0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
304d0 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
304e0 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
304f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
30500 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
30510 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
30520 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
30530 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
30540 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
30550 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
30560 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
30570 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
30580 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
30590 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
305a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
305b0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
305c0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
305d0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
305e0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
305f0 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
30600 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
30610 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
30620 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
30630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30640 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
30650 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
30660 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
30670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30680 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
30690 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
306a0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
306b0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
306c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306d0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
306e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
306f0 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
30700 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
30710 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
30720 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
30730 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
30740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
30750 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
30760 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
30770 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
30780 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
30790 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
307a0 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
307b0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
307c0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
307d0 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
307e0 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
307f0 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
30800 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
30810 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
30820 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  ( WHERE_USE_LIMI
30830 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  T==SF_FixedLimit
30840 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   );.    wctrlFla
30850 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  gs |= p->selFlag
30860 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
30870 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  t;..    /* Begin
30880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
30890 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66  an. */.    pWInf
308a0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
308b0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
308c0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
308d0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a  sSort.pOrderBy,.
308e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
30900 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46  ->pEList, wctrlF
30910 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74  lags, p->nSelect
30920 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Row);.    if( pW
30930 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
30940 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
30950 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
30960 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
30970 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
30980 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
30990 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
309a0 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
309b0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
309c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
309d0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
309e0 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
309f0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
30a00 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
30a10 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
30a20 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
30a30 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
30a40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30a50 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
30a60 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
30a70 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
30a80 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
30a90 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f  Info);.      sSo
30aa0 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  rt.bOrderedInner
30ab0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68  Loop = sqlite3Wh
30ac0 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ereOrderedInnerL
30ad0 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  oop(pWInfo);.   
30ae0 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
30af0 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
30b00 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
30b10 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
30b20 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
30b30 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
30b40 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
30b50 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
30b60 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
30b70 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
30b80 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
30b90 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
30ba0 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
30bb0 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
30bc0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
30bd0 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
30be0 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
30bf0 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
30c00 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
30c10 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
30c20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30c30 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
30c40 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
30c50 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
30c60 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
30c70 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
30c80 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c  loop. */.    sel
30c90 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
30ca0 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
30cb0 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
30cc0 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
30cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ce0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
30cf0 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
30d00 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
30d10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30d20 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
30d30 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
30d40 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
30d50 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
30d60 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
30d70 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
30d80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30d90 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
30da0 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
30db0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
30dc0 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
30dd0 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
30de0 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
30df0 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
30e00 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
30e10 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
30e20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
30e30 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
30e40 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
30e50 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
30e60 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
30e70 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
30e80 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
30e90 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
30ea0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
30eb0 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
30ec0 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
30ed0 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
30ee0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
30ef0 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
30f00 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
30f10 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
30f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f30 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
30f40 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
30f50 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
30f60 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
30f70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
30f80 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
30f90 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
30fa0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
30fb0 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
30fc0 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
30fd0 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
30fe0 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
30ff0 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
31000 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
31010 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
31020 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
31030 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
31040 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
31050 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
31060 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
31070 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
31080 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
31090 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
310a0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
310b0 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
310c0 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
310d0 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
310e0 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
310f0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
31100 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
31110 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
31120 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
31130 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
31140 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
31150 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
31160 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
31170 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
31180 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
31190 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
311a0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
311b0 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
311c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
311d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
311e0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
311f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
31200 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
31210 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
31220 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
31230 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
31240 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
31250 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
31260 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
31270 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
31280 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
31290 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
312a0 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
312b0 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
312c0 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
312d0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
312e0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
312f0 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
31300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31310 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69  assert( 66==sqli
31320 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
31330 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
31340 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70  SelectRow>66 ) p
31350 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36  ->nSelectRow = 6
31360 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
31370 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
31380 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
31390 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  );.      p->nSel
313a0 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
313b0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
313c0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
313d0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
313e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
313f0 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
31400 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
31410 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
31420 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
31430 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
31440 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
31450 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
31460 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
31470 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
31480 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
31490 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
314a0 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
314b0 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
314c0 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
314d0 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
314e0 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
314f0 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
31500 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
31510 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
31520 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
31530 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
31540 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
31550 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
31560 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
31570 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
31580 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
31590 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
315a0 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
315b0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
315c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
315d0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
315e0 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
315f0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
31600 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
31610 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
31620 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
31630 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
31640 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
31650 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
31660 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
31670 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
31680 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
31690 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
316a0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
316b0 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
316c0 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
316d0 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
316e0 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
316f0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
31700 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
31710 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
31720 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
31730 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
31740 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
31750 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
31760 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
31770 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
31780 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
31790 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
317a0 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
317b0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ;.    sAggInfo.m
317c0 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
317d0 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
317e0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
317f0 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
31800 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
31810 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
31820 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
31830 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
31840 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
31850 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
31860 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
31870 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
31880 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
31890 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
318a0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
318b0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
318c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
318d0 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68  ( pWhere==p->pWh
318e0 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 68  ere );.        h
318f0 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61  avingToWhere(pPa
31900 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70  rse, pGroupBy, p
31910 48 61 76 69 6e 67 2c 20 26 70 2d 3e 70 57 68 65  Having, &p->pWhe
31920 72 65 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68  re);.        pWh
31930 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
31940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
31950 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
31960 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
31970 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  , pHaving);.    
31980 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
31990 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
319a0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
319b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
319c0 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
319d0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
319e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
319f0 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  rty(sAggInfo.aFu
31a00 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  nc[i].pExpr, EP_
31a10 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
31a20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
31a30 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
31a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
31a50 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
31a60 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
31a70 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
31a80 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
31a90 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
31aa0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
31ab0 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
31ac0 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mxReg = pParse-
31ad0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64  >nMem;.    if( d
31ae0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
31af0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
31b00 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
31b10 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
31b20 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
31b30 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
31b40 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
31b50 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
31b60 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
31b70 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
31b80 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
31b90 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
31ba0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
31bb0 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
31bc0 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
31bd0 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
31be0 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  y clause */.    
31bf0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
31c00 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20        /* A-vs-B 
31c10 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70  comparision jump
31c20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
31c30 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a  drOutputRow;  /*
31c40 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
31c50 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
31c60 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
31c70 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  /.      int regO
31c80 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52  utputRow;   /* R
31c90 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
31ca0 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75  gister for outpu
31cb0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
31cc0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
31cd0 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74  tAbort;   /* Set
31ce0 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
31cf0 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
31d00 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
31d10 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f  fLoop;  /* Top o
31d20 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
31d30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
31d40 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a  drSortingIdx; /*
31d50 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
31d60 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
31d70 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
31d80 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73       int addrRes
31d90 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72  et;      /* Subr
31da0 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
31db0 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
31dc0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ator */.      in
31dd0 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
31de0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
31df0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
31e00 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
31e10 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  e */..      /* I
31e20 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
31e30 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
31e40 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
31e50 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
31e60 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
31e70 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
31e80 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
31e90 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
31ea0 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
31eb0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
31ec0 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
31ed0 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  l, the OP_Sorter
31ee0 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  Open instruction
31ef0 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
31f00 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
31f10 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
31f20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
31f30 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
31f40 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
31f50 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
31f60 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
31f70 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
31f80 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e  oupBy, 0, sAggIn
31f90 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  fo.nColumn);.   
31fa0 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
31fb0 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
31fc0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
31fd0 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20  erOpen, .       
31fe0 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
31ff0 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f  ingIdx, sAggInfo
32000 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
32010 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28   .          0, (
32020 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
32030 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
32040 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
32050 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
32060 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
32070 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
32080 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
32090 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
320a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
320b0 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
320c0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
320d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
320e0 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
320f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
32100 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
32110 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
32120 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
32130 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
32140 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
32150 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
32160 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
32170 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
32180 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
32190 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
321a0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
321b0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
321c0 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
321d0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
321e0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
321f0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
32200 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
32210 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
32220 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
32230 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
32240 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
32250 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
32260 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
32270 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
32280 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
32290 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
322a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
322b0 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
322c0 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
322d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
322e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
322f0 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
32300 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
32310 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
32320 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
32330 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
32340 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
32350 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
32360 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
32370 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
32380 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
32390 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
323a0 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
323b0 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
323c0 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
323d0 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
323e0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
323f0 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
32400 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
32410 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
32420 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
32430 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
32440 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32450 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
32460 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
32470 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
32480 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
32490 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
324a0 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75  t, pWhere, pGrou
324b0 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBy, 0,.        
324c0 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20    WHERE_GROUPBY 
324d0 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20  | (orderByGrp ? 
324e0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
324f0 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20  P : 0), 0.      
32500 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
32510 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
32520 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
32530 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
32540 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
32550 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  )==pGroupBy->nEx
32560 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pr ){.        /*
32570 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
32580 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
32590 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
325a0 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
325b0 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
325c0 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
325d0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
325e0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
325f0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
32600 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
32610 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
32620 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
32630 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
32640 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
32650 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
32660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32670 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
32680 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
32690 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
326a0 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
326b0 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
326c0 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
326d0 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
326e0 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
326f0 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
32700 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
32710 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
32720 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
32730 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
32740 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
32750 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
32760 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
32770 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
32780 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
32790 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
327a0 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
327b0 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
327c0 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
327d0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
327e0 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
327f0 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
32800 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
32810 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
32820 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
32830 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
32840 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
32850 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
32860 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
32870 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
32880 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
32890 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  l = nGroupBy;.  
328a0 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
328b0 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
328c0 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
328d0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
328e0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
328f0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
32900 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
32910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
32920 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
32930 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
32940 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
32950 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
32960 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
32970 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
32980 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32990 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
329a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
329b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
329c0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
329d0 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
329e0 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
329f0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
32a00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
32a10 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
32a20 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
32a30 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
32a40 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
32a50 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
32a60 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
32a70 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
32a80 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
32a90 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
32aa0 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
32ab0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32ac0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
32ad0 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20  mnToReg(pParse, 
32ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b00 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
32b10 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  ->iColumn, pCol-
32b20 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20  >iTable, r1);.  
32b30 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
32b40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32b50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
32b60 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
32b70 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
32b80 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
32b90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
32ba0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
32bb0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72  regBase, nCol, r
32bc0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
32bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32be0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
32bf0 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  rInsert, sAggInf
32c00 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65  o.sortingIdx, re
32c10 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
32c20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
32c30 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
32c40 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
32c50 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
32c60 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
32c70 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
32c80 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
32c90 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
32ca0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  fo);.        sAg
32cb0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
32cc0 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20  PTab = sortPTab 
32cd0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
32ce0 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75  ;.        sortOu
32cf0 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
32d00 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
32d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
32d20 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
32d30 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50  penPseudo, sortP
32d40 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43  Tab, sortOut, nC
32d50 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
32d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
32d70 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
32d80 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
32d90 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
32da0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
32db0 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42  ent((v, "GROUP B
32dc0 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43  Y sort")); VdbeC
32dd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
32de0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65      sAggInfo.use
32df0 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a  SortingIdx = 1;.
32e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
32e10 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
32e20 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a  arse);..      }.
32e30 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
32e40 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72   index or tempor
32e50 61 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62  ary table used b
32e60 79 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73  y the GROUP BY s
32e70 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ort.      ** wil
32e80 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69  l naturally deli
32e90 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20  ver rows in the 
32ea0 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62  order required b
32eb0 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  y the ORDER BY. 
32ec0 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20       ** clause, 
32ed0 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d  cancel the ephem
32ee0 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20  eral table open 
32ef0 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20  coded earlier.. 
32f00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
32f10 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
32f20 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63  mization - the c
32f30 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68  orrect answer sh
32f40 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61  ould result rega
32f50 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a  rdless..      **
32f60 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f   Use the SQLITE_
32f70 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61  GroupByOrder fla
32f80 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45  g with SQLITE_TE
32f90 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52  STCTRL_OPTIMIZER
32fa0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69   to .      ** di
32fb0 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d  sable this optim
32fc0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74  ization for test
32fd0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a  ing purposes.  *
32fe0 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65  /.      if( orde
32ff0 72 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69  rByGrp && Optimi
33000 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
33010 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  , SQLITE_GroupBy
33020 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26  Order) .       &
33030 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c  & (groupBySort |
33040 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  | sqlite3WhereIs
33050 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a  Sorted(pWInfo)).
33060 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
33070 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
33080 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
33090 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
330a0 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  Noop(v, sSort.ad
330b0 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
330c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
330d0 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
330e0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
330f0 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
33100 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
33110 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
33120 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
33130 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
33140 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
33150 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
33160 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
33170 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
33180 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
33190 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
331a0 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
331b0 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
331c0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
331d0 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
331e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
331f0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
33200 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
33210 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
33220 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
33230 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
33240 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
33250 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
33260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33270 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
33280 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Data, sAggInfo.s
33290 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
332a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332b0 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f       sortOut, so
332c0 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  rtPTab);.      }
332d0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
332e0 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
332f0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
33300 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
33310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
33320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
33330 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f  v, OP_Column, so
33340 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d  rtPTab, j, iBMem
33350 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +j);.        }el
33360 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
33370 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
33380 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
33390 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
333a0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
333b0 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69  y->a[j].pExpr, i
333c0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
333d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
333e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
333f0 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
33400 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20  , iAMem, iBMem, 
33410 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
33420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33430 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
33440 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
33450 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
33460 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
33470 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
33480 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
33490 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
334a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
334b0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31  OP_Jump, addr1+1
334c0 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56  , 0, addr1+1); V
334d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
334e0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
334f0 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
33500 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
33510 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
33520 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
33530 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
33540 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
33550 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
33560 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
33570 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
33580 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
33590 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
335a0 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
335b0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
335c0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
335d0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
335e0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
335f0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
33600 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
33610 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
33620 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
33630 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
33640 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
33650 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
33660 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
33670 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
33680 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
33690 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
336a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
336b0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
336c0 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
336d0 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
336e0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
336f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
33700 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
33710 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
33720 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
33730 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
33740 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
33750 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
33760 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
33770 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
33780 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20  Flag, addrEnd); 
33790 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
337a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
337b0 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
337c0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
337d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
337e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
337f0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
33800 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
33810 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
33820 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
33830 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
33840 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
33850 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
33860 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
33870 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
33880 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
33890 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
338a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
338b0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
338c0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
338d0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
338e0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
338f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33900 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
33910 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 1, iUseFlag);
33920 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
33930 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
33940 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
33950 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
33960 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
33970 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
33980 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
33990 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
339a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
339b0 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
339c0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
339d0 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
339e0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64  oop);.        Vd
339f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
33a00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33a10 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
33a20 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
33a30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33a40 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
33a50 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b  addrSortingIdx);
33a60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33a70 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
33a80 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
33a90 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
33aa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33ab0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
33ac0 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
33ad0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
33ae0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
33af0 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
33b00 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20  l row"));..     
33b10 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68   /* Jump over th
33b20 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20  e subroutines.  
33b30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
33b40 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
33b50 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
33b60 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
33b70 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
33b80 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
33b90 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
33ba0 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
33bb0 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
33bc0 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
33bd0 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
33be0 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
33bf0 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
33c00 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
33c10 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
33c20 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
33c30 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
33c40 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
33c50 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
33c60 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
33c70 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
33c80 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
33c90 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
33ca0 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
33cb0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
33cc0 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
33cd0 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
33ce0 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
33cf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
33d00 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
33d10 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
33d20 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
33d30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
33d40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
33d50 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
33d60 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
33d70 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
33d80 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
33d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
33da0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
33db0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
33dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
33dd0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
33de0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
33df0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
33e00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
33e10 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
33e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33e30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
33e40 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
33e50 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
33e60 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
33e70 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
33e80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
33e90 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
33ea0 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
33eb0 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
33ec0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
33ed0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
33ee0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
33ef0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
33f00 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
33f10 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
33f20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
33f30 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
33f40 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
33f50 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  w+1, SQLITE_JUMP
33f60 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
33f70 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
33f80 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
33f90 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  ist, -1, &sSort,
33fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33fb0 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63         &sDistinc
33fc0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
33fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fe0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
33ff0 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a   addrSetAbort);.
34000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34010 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
34020 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
34030 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
34040 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
34050 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
34060 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
34070 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
34080 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
34090 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
340a0 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
340b0 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
340c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
340d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
340e0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
340f0 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
34100 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
34110 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
34120 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
34130 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
34140 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20  Reset);.     .  
34150 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
34160 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67  oupBy.  Begin ag
34170 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
34180 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59  without GROUP BY
34190 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  : */.    else {.
341a0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
341b0 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65  pDel = 0;.#ifnde
341c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
341d0 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54  REECOUNT.      T
341e0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
341f0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73    if( (pTab = is
34200 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26  SimpleCount(p, &
34210 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b  sAggInfo))!=0 ){
34220 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
34230 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72  sSimpleCount() r
34240 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
34250 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
34260 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20  cture, then.    
34270 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73      ** the SQL s
34280 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
34290 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20  he form:.       
342a0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
342b0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
342c0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20   FROM <tbl>.    
342d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
342e0 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c  * where the Tabl
342f0 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
34300 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20  rned represents 
34310 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20  table <tbl>..   
34320 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
34330 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
34340 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74  t is so common t
34350 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69  hat it is optimi
34360 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54  zed specially. T
34370 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
34380 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69  _Count instructi
34390 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65  on is executed e
343a0 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74  ither on the int
343b0 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20  key table that. 
343c0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
343d0 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ns the data for 
343e0 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f  table <tbl> or o
343f0 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64  n one of its ind
34400 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20  exes. It.       
34410 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
34420 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20   execute the op 
34430 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20  on an index, as 
34440 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f  indexes are almo
34450 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  st.        ** al
34460 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f  ways spread acro
34470 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68  ss less pages th
34480 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
34490 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20  onding tables.. 
344a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
344b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20    const int iDb 
344c0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
344d0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
344e0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
344f0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
34500 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72   int iCsr = pPar
34510 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
34520 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
34530 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  n b-tree */.    
34540 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
34550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34560 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
34570 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
34580 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
34590 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
345a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
345b0 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61   Keyinfo for sca
345c0 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  nned index */.  
345d0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65        Index *pBe
345e0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
345f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
34600 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73  st index found s
34610 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
34620 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61   int iRoot = pTa
34630 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  b->tnum;        
34640 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
34650 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d  ge of scanned b-
34660 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tree */..       
34670 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
34680 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
34690 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
346a0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
346b0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
346c0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
346d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  ->zName);..     
346e0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
346f0 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
34700 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73  has the lowest s
34710 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20  can cost..      
34720 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
34730 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
34740 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
34750 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
34760 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
34770 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
34780 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20  (2013-10-03) Do 
34790 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e  not count the en
347a0 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69  tries in a parti
347b0 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  al index..      
347c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
347d0 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
347e0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
347f0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
34800 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
34810 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
34820 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
34830 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
34840 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34850 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
34860 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71  ab) ) pBest = sq
34870 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
34880 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
34890 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
348a0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
348b0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
348c0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
348d0 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
348e0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ed==0.          
348f0 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   && pIdx->szIdxR
34900 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
34910 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
34920 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
34930 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ere==0.         
34940 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20    && (!pBest || 
34950 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
34960 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a  Best->szIdxRow).
34970 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
34980 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
34990 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
349a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
349b0 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29       if( pBest )
349c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
349d0 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
349e0 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
349f0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
34a00 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
34a10 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
34a20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
34a30 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
34a40 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
34a50 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
34a60 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
34a70 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
34a80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
34a90 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  nt(v, OP_OpenRea
34aa0 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
34ab0 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  iDb, 1);.       
34ac0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
34ad0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
34ae0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
34af0 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
34b00 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
34b10 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FO);.        }. 
34b20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34b30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
34b40 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
34b50 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
34b60 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
34b70 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
34b80 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
34b90 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
34ba0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
34bb0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
34bc0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
34bd0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
34be0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
34bf0 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
34c00 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
34c10 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
34c20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
34c30 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
34c40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
34c50 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
34c60 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
34c70 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
34c80 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
34c90 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34ca0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
34cb0 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65  hen ask the code
34cc0 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61   in where.c to a
34cd0 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72  ttempt to sort r
34ce0 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a  esults.        *
34cf0 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
34d00 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
34d10 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
34d20 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
34d30 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68          ** If wh
34d40 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
34d50 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
34d60 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
34d70 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
34d80 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
34d90 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
34da0 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
34db0 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
34dc0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
34dd0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
34de0 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
34df0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
34e00 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
34e10 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
34e20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
34e30 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
34e40 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
34e50 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  m .        ** va
34e60 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
34e70 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
34e80 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
34e90 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61       ** A specia
34ea0 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70  l flag must be p
34eb0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
34ec0 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20  WhereBegin() to 
34ed0 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20  slightly.       
34ee0 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
34ef0 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ior as follows:.
34f00 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
34f10 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
34f20 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
34f30 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
34f40 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
34f50 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
34f60 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
34f70 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
34f80 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
34f90 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
34fa0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
34fb0 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
34fc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
34fd0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
34fe0 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
34ff0 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
35000 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
35010 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
35020 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
35030 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
35040 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
35050 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
35060 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
35070 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
35080 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
35090 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
350a0 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
350b0 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
350c0 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
350d0 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
350e0 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
350f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
35100 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
35110 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
35120 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  ag = WHERE_ORDER
35130 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  BY_NORMAL;.     
35140 20 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65     .        asse
35150 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
35160 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
35170 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b  sert( flag==0 );
35180 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
35190 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20  pHaving==0 ){.  
351a0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d          flag = m
351b0 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67  inMaxQuery(&sAgg
351c0 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b  Info, &pMinMax);
351d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
351e0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
351f0 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d  =0 || (pMinMax!=
35200 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 && pMinMax->nE
35210 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20  xpr==1) );..    
35220 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
35230 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
35240 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
35250 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d  istDup(db, pMinM
35260 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ax, 0);.        
35270 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
35280 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
35290 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
352a0 69 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d 61 78 21  iled || pMinMax!
352b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
352c0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
352d0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
352e0 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
352f0 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
35300 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
35310 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20  BY_MIN ?1:0;.   
35320 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
35330 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
35340 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
35350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35360 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
35370 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
35380 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
35390 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
353a0 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
353b0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
353c0 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
353d0 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
353e0 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
353f0 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  e row.        **
35400 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
35410 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
35420 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
35430 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
35440 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  o);.        pWIn
35450 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
35460 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
35470 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
35480 20 70 4d 69 6e 4d 61 78 2c 20 30 2c 66 6c 61 67   pMinMax, 0,flag
35490 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
354a0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20   pWInfo==0 ){.  
354b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
354c0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
354d0 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pDel);.       
354e0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
354f0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
35500 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
35510 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
35520 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
35530 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e      assert( pMin
35540 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61  Max==0 || pMinMa
35550 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  x->nExpr==1 );. 
35560 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
35570 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
35580 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20  (pWInfo)>0 ){.  
35590 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
355a0 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74  dbeGoto(v, sqlit
355b0 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
355c0 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20  l(pWInfo));.    
355d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
355e0 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
355f0 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20  ndex",.         
35600 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48         (flag==WH
35610 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ERE_ORDERBY_MIN?
35620 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
35630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35640 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
35650 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
35660 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
35670 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
35680 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
35690 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74    }..      sSort
356a0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
356b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
356c0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
356d0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
356e0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
356f0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
35700 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
35710 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
35720 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20  , -1, 0, 0, .   
35730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35740 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
35750 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
35760 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
35770 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
35780 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
35790 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
357a0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
357b0 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
357c0 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
357d0 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73  uery */..  if( s
357e0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
357f0 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  pe==WHERE_DISTIN
35800 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a  CT_UNORDERED ){.
35810 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
35820 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49  able(pParse, "DI
35830 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20  STINCT");.  }.. 
35840 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
35850 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
35860 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
35870 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
35880 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
35890 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
358a0 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
358b0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
358c0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
358d0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
358e0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20  Table(pParse,.  
358f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35900 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e     sSort.nOBSat>
35910 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20  0 ? "RIGHT PART 
35920 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52  OF ORDER BY":"OR
35930 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65  DER BY");.    ge
35940 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
35950 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74  Parse, p, &sSort
35960 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
35970 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
35980 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
35990 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
359a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
359b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
359c0 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
359d0 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
359e0 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65  en coded. If the
359f0 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  re is an error i
35a00 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75  n the Parse stru
35a10 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20  cture,.  ** set 
35a20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
35a30 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20  to 1. Otherwise 
35a40 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50  0. */.  rc = (pP
35a50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a  arse->nErr>0);..
35a60 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
35a70 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
35a80 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
35a90 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
35aa0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
35ab0 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
35ac0 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
35ad0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
35ae0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
35af0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
35b00 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
35b10 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
35b20 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
35b30 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
35b40 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
35b50 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
35b60 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
35b70 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
35b80 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
35b90 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
35ba0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
35bb0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
35bc0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
35bd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
35be0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
35bf0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
35c00 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
35c10 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  unc);.#if SELECT
35c20 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
35c30 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
35c40 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f  arse,p,("end pro
35c50 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
35c60 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
35c70 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a  ndent--;.#endif.
35c80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.