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

Artifact 403775526d5e0e420924fe89f34256dc1dd98d48:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  ee(db, p);.    p
0b50: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0b60: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0b70: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0b80: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0b90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ba0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
0bb0: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
0bc0: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
0bd0: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
0be0: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
0bf0: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
0c00: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
0c10: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
0c20: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
0c30: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
0c40: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
0c50: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
0c60: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0c70: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0c80: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0c90: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0ca0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0cb0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
0cc0: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
0cd0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0ce0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
0cf0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
0d00: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
0d10: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
0d20: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
0d30: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
0d40: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
0d50: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
0d60: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
0d70: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
0d80: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
0d90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
0da0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
0db0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
0dc0: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
0dd0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
0df0: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
0e00: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
0e10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0e20: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
0e30: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
0e40: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
0e50: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
0e60: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
0e70: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
0e80: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
0e90: 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  pLimit,         
0ea0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
0eb0: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
0ec0: 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  used */.  Expr *
0ed0: 70 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  pOffset         
0ee0: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
0ef0: 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20    NULL means no 
0f00: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
0f10: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
0f20: 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20  elect standin;. 
0f30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0f40: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
0f50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
0f60: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
0f70: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
0f80: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
0f90: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
0fa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
0fb0: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0fc0: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  in;.  }.  if( pE
0fd0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
0fe0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
0ff0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1000: 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  arse, 0, sqlite3
1010: 45 78 70 72 28 64 62 2c 54 4b 5f 41 53 54 45 52  Expr(db,TK_ASTER
1020: 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70  ISK,0));.  }.  p
1030: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  New->pEList = pE
1040: 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  List;.  pNew->op
1050: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
1060: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
1070: 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65   selFlags;.  pNe
1080: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
1090: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
10a0: 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   0;.#if SELECTTR
10b0: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e  ACE_ENABLED.  pN
10c0: 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20  ew->zSelName[0] 
10d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e  = 0;.#endif.  pN
10e0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
10f0: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
1100: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
1110: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1120: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
1130: 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20    if( pSrc==0 ) 
1140: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62  pSrc = sqlite3Db
1150: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1160: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1170: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
1180: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
1190: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
11a0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
11b0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
11c0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
11d0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
11e0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
11f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1200: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1210: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1220: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1230: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
1240: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70  t = pOffset;.  p
1250: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a  New->pWith = 0;.
1260: 20 20 61 73 73 65 72 74 28 20 70 4f 66 66 73 65    assert( pOffse
1270: 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d  t==0 || pLimit!=
1280: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
1290: 72 3e 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  r>0 || db->mallo
12a0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
12b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12c0: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65  iled ) {.    cle
12d0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
12e0: 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  w, pNew!=&standi
12f0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  n);.    pNew = 0
1300: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1310: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
1320: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
1330: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
1340: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
1350: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
1360: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20  rn pNew;.}..#if 
1370: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1380: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  LED./*.** Set th
1390: 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65  e name of a Sele
13a0: 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ct object.*/.voi
13b0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53  d sqlite3SelectS
13c0: 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70  etName(Select *p
13d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
13e0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ame){.  if( p &&
13f0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
1400: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1410: 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d  izeof(p->zSelNam
1420: 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), p->zSelName,
1430: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%s", zName);. 
1440: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1450: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
1460: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
1470: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
1480: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1490: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
14a0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
14b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
14c0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
14d0: 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64   ) clearSelect(d
14e0: 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  b, p, 1);.}../*.
14f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1500: 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
1510: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
1520: 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70  tement in a comp
1530: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
1540: 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68  Select *findRigh
1550: 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29  tmost(Select *p)
1560: 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e  {.  while( p->pN
1570: 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65  ext ) p = p->pNe
1580: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  xt;.  return p;.
1590: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31  }../*.** Given 1
15a0: 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72   to 3 identifier
15b0: 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65 20  s preceding the 
15c0: 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65  JOIN keyword, de
15d0: 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74  termine the.** t
15e0: 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65  ype of join.  Re
15f0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
1600: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78  constant that ex
1610: 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70  presses that typ
1620: 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66  e.** in terms of
1630: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
1640: 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a  it values:.**.**
1650: 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a       JT_INNER.**
1660: 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a       JT_CROSS.**
1670: 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a       JT_OUTER.**
1680: 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a       JT_NATURAL.
1690: 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a  **     JT_LEFT.*
16a0: 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a  *     JT_RIGHT.*
16b0: 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65  *.** A full oute
16c0: 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f  r join is the co
16d0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f  mbination of JT_
16e0: 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48  LEFT and JT_RIGH
16f0: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  T..**.** If an i
1700: 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70  llegal or unsupp
1710: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20  orted join type 
1720: 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74  is seen, then st
1730: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  ill return.** a 
1740: 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70  join type, but p
1750: 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  ut an error in t
1760: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
1770: 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
1780: 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73  te3JoinType(Pars
1790: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
17a0: 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c   *pA, Token *pB,
17b0: 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69   Token *pC){.  i
17c0: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  nt jointype = 0;
17d0: 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b  .  Token *apAll[
17e0: 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a  3];.  Token *p;.
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1810: 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33    0123456789 123
1820: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
1830: 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63   123 */.  static
1840: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
1850: 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61  Text[] = "natura
1860: 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c  leftouterightful
1870: 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20  linnercross";.  
1880: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1890: 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20  uct {.    u8 i; 
18a0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
18b0: 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74  ing of keyword t
18c0: 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b  ext in zKeyText[
18d0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61  ] */.    u8 nCha
18e0: 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20  r;    /* Length 
18f0: 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69  of the keyword i
1900: 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  n characters */.
1910: 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20      u8 code;    
1920: 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61   /* Join type ma
1930: 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f  sk */.  } aKeywo
1940: 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  rd[] = {.    /* 
1950: 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20  natural */ { 0, 
1960: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20   7, JT_NATURAL  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1980: 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20  .    /* left    
1990: 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c  */ { 6,  4, JT_L
19a0: 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20  EFT|JT_OUTER    
19b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
19c0: 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c  outer   */ { 10,
19d0: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20   5, JT_OUTER    
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
19f0: 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20  .    /* right   
1a00: 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52  */ { 14, 5, JT_R
1a10: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  IGHT|JT_OUTER   
1a20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1a30: 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c  full    */ { 19,
1a40: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
1a50: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
1a60: 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20  .    /* inner   
1a70: 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49  */ { 23, 5, JT_I
1a80: 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NNER            
1a90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1aa0: 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c  cross   */ { 28,
1ab0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
1ac0: 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c  CROSS         },
1ad0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
1ae0: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
1af0: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
1b00: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
1b10: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
1b20: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
1b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
1b40: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
1b50: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
1b60: 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b  e(aKeyword); j++
1b70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1b80: 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e  n==aKeyword[j].n
1b90: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
1ba0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
1bb0: 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20  mp((char*)p->z, 
1bc0: 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f  &zKeyText[aKeywo
1bd0: 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d  rd[j].i], p->n)=
1be0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
1bf0: 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f  intype |= aKeywo
1c00: 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  rd[j].code;.    
1c10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
1c30: 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a  tcase( j==0 || j
1c40: 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a  ==1 || j==2 || j
1c50: 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a  ==3 || j==4 || j
1c60: 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20  ==5 || j==6 );. 
1c70: 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53     if( j>=ArrayS
1c80: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b  ize(aKeyword) ){
1c90: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1ca0: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
1cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cc0: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
1cd0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
1ce0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
1cf0: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
1d00: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
1d10: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
1d20: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d  onst char *zSp =
1d40: 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74   " ";.    assert
1d50: 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pB!=0 );.    i
1d60: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b  f( pC==0 ){ zSp+
1d70: 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  +; }.    sqlite3
1d80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d90: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   "unknown or uns
1da0: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
1db0: 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54  pe: ".       "%T
1dc0: 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42   %T%s%T", pA, pB
1dd0: 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20  , zSp, pC);.    
1de0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1df0: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
1e00: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1e10: 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
1e20: 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65      && (jointype
1e30: 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   & (JT_LEFT|JT_R
1e40: 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20  IGHT))!=JT_LEFT 
1e50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1e60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1e70: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1e80: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1e90: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1ea0: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1eb0: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1ec0: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1ed0: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ef0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1f00: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
1f10: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1f20: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
1f30: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
1f40: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
1f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
1f60: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
1f70: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1f80: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1f90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1fa0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1fb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1fc0: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1fd0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1fe0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1ff0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
2000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
2010: 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74 61  h the first N ta
2020: 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72  bles in pSrc, fr
2030: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
2040: 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a  , looking for a.
2050: 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68 61  ** table that ha
2060: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  s a column named
2070: 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57   zCol.  .**.** W
2080: 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a  hen found, set *
2090: 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c  piTab and *piCol
20a0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e   to the table in
20b0: 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  dex and column i
20c0: 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  ndex.** of the m
20d0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61  atching column a
20e0: 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a  nd return TRUE..
20f0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75  **.** If not fou
2100: 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  nd, return FALSE
2110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2120: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
2130: 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  dex(.  SrcList *
2140: 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41  pSrc,       /* A
2150: 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74  rray of tables t
2160: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
2170: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
2180: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2190: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e  tables in pSrc->
21a0: 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  a[] to search */
21b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21c0: 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Col,    /* Name 
21d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65  of the column we
21e0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
21f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62   */.  int *piTab
2200: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ,          /* Wr
2210: 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72  ite index of pSr
2220: 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20  c->a[] here */. 
2230: 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20   int *piCol     
2240: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69        /* Write i
2250: 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b  ndex of pSrc->a[
2260: 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43  *piTab].pTab->aC
2270: 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ol[] here */.){.
2280: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2290: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
22a0: 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
22b0: 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  s in pSrc */.  i
22c0: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
22d0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
22e0: 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20  column matching 
22f0: 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  zCol */..  asser
2300: 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28  t( (piTab==0)==(
2310: 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a  piCol==0) );  /*
2320: 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72   Both or neither
2330: 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66   are NULL */.  f
2340: 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b  or(i=0; i<N; i++
2350: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f  ){.    iCol = co
2360: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e  lumnIndex(pSrc->
2370: 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29  a[i].pTab, zCol)
2380: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
2390: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
23a0: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  iTab ){.        
23b0: 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20  *piTab = i;.    
23c0: 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f      *piCol = iCo
23d0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
23e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
23f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2410: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2420: 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70  to add terms imp
2430: 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e  lied by JOIN syn
2440: 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  tax to the.** WH
2450: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
2460: 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43  ssion of a SELEC
2470: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65  T statement. The
2480: 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68   new term, which
2490: 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74  .** is ANDed wit
24a0: 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 57  h the existing W
24b0: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20  HERE clause, is 
24c0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
24d0: 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31  **    (tab1.col1
24e0: 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a   = tab2.col2).**
24f0: 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20 69  .** where tab1 i
2500: 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74 61  s the iSrc'th ta
2510: 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70  ble in SrcList p
2520: 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73 20  Src and tab2 is 
2530: 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29  the .** (iSrc+1)
2540: 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31  'th. Column col1
2550: 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c   is column iColL
2560: 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64  eft of tab1, and
2570: 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75   col2 is.** colu
2580: 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20  mn iColRight of 
2590: 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tab2..*/.static 
25a0: 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72  void addWhereTer
25b0: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
25c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
25d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
25e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
25f0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2610: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
2620: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
2630: 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20  .  int iLeft,   
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
2660: 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f  irst table to jo
2670: 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  in in pSrc */.  
2680: 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20  int iColLeft,   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
26b0: 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c  mn in first tabl
26c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  e */.  int iRigh
26d0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
26e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26f0: 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  of second table 
2700: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2710: 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20   iColRight,     
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2730: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
2740: 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  in second table 
2750: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72  */.  int isOuter
2760: 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Join,           
2770: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2780: 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52  this is an OUTER
2790: 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20   join */.  Expr 
27a0: 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20 20  **ppWhere       
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
27c0: 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45 20  /OUT: The WHERE 
27d0: 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f  clause to add to
27e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
27f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2800: 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a  b;.  Expr *pE1;.
2810: 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45    Expr *pE2;.  E
2820: 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73  xpr *pEq;..  ass
2830: 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68  ert( iLeft<iRigh
2840: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2850: 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74  Src->nSrc>iRight
2860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2870: 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61  rc->a[iLeft].pTa
2880: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
2890: 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70  Src->a[iRight].p
28a0: 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20  Tab );..  pE1 = 
28b0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
28c0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
28d0: 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66  , iLeft, iColLef
28e0: 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69  t);.  pE2 = sqli
28f0: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
2900: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52  xpr(db, pSrc, iR
2910: 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29  ight, iColRight)
2920: 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74  ;..  pEq = sqlit
2930: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2940: 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c  TK_EQ, pE1, pE2,
2950: 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26   0);.  if( pEq &
2960: 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b  & isOuterJoin ){
2970: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
2980: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f  erty(pEq, EP_Fro
2990: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
29a0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
29b0: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b  erty(pEq, EP_Tok
29c0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
29d0: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
29e0: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 71  tVVAProperty(pEq
29f0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2a00: 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a      pEq->iRightJ
2a10: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
2a20: 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d  pE2->iTable;.  }
2a30: 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71  .  *ppWhere = sq
2a40: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
2a50: 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b   *ppWhere, pEq);
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2a70: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2a80: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
2a90: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
2aa0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
2ab0: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
2ac0: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2ad0: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
2ae0: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
2af0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
2b00: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
2b10: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
2b20: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
2b30: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
2b40: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
2b50: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
2b60: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
2b70: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
2b80: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
2b90: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
2ba0: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
2bb0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2bc0: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
2bd0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
2be0: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
2bf0: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
2c00: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
2c10: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
2c20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
2c30: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
2c40: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
2c50: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
2c60: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
2c70: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
2c80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
2c90: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
2ca0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2cb0: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
2cc0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2cd0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
2ce0: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
2cf0: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
2d00: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
2d10: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
2d20: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
2d30: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2d40: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
2d50: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
2d60: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
2d70: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
2d80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
2d90: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
2da0: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
2db0: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
2dc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
2dd0: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
2de0: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2df0: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
2e00: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
2e10: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
2e20: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
2e30: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
2e40: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
2e50: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
2e60: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
2e70: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
2e80: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
2e90: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
2ea0: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
2eb0: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
2ec0: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
2ed0: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
2ee0: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
2ef0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
2f00: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
2f10: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
2f20: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2f30: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
2f40: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
2f50: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
2f60: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2f70: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
2f80: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
2f90: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2fa0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
2fb0: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2fc0: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2fd0: 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  VAProperty(p, EP
2fe0: 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2ff0: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
3000: 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65  le = (i16)iTable
3010: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
3020: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20  =TK_FUNCTION && 
3030: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
3040: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
3050: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78   for(i=0; i<p->x
3060: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  .pList->nExpr; i
3070: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ++){.        set
3080: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c  JoinExpr(p->x.pL
3090: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
30a0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   iTable);.      
30b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a  }.    }.    setJ
30c0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
30d0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
30e0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
30f0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
3100: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
3110: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
3120: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
3130: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
3140: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
3150: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
3160: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
3170: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
3180: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
3190: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
31a0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
31b0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
31c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
31d0: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
31e0: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
31f0: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
3200: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
3210: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
3220: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
3230: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
3240: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
3250: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
3260: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
3270: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
3280: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
3290: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
32a0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
32b0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
32c0: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
32d0: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
32e0: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
32f0: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
3300: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
3310: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
3320: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
3330: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
3340: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
3350: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
3360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
3370: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
3380: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
3390: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
33a0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
33b0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
33c0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
33d0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
33e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
33f0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
3400: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3410: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
3420: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
3430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3440: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3450: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3460: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3470: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3480: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3490: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
34a0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
34b0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
34c0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
34d0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
34e0: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
34f0: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
3500: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
3510: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
3520: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
3530: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
3540: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
3550: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
3560: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
3570: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3580: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3590: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
35a0: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
35b0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
35c0: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
35d0: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
35e0: 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  = (pRight->fg.jo
35f0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
3600: 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  R)!=0;..    /* W
3610: 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20  hen the NATURAL 
3620: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
3630: 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c  nt, add WHERE cl
3640: 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20  ause terms for. 
3650: 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75     ** every colu
3660: 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  mn that the two 
3670: 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63  tables have in c
3680: 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ommon..    */.  
3690: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67    if( pRight->fg
36a0: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
36b0: 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20  ATURAL ){.      
36c0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
36d0: 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  || pRight->pUsin
36e0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
36f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3700: 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20  rse, "a NATURAL 
3710: 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76  join may not hav
3720: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
3730: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
3740: 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20  lause", 0);.    
3750: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3760: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
3770: 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62  j=0; j<pRightTab
3780: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
3790: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
37a0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
37b0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69  column in the ri
37c0: 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ght table */.   
37d0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
37e0: 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20      /* Matching 
37f0: 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  left table */.  
3800: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3810: 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67  ol;  /* Matching
3820: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c   column in the l
3830: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  eft table */..  
3840: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52        zName = pR
3850: 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  ightTab->aCol[j]
3860: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3870: 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  if( tableAndColu
3880: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3890: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
38a0: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a  , &iLeftCol) ){.
38b0: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
38c0: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
38d0: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
38e0: 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20  tCol, i+1, j,.  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
3910: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
3920: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3930: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
3940: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
3950: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
3960: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
3970: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3980: 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69  ight->pOn && pRi
3990: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
39a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
39b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
39c0: 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f  nnot have both O
39d0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20  N and USING ".  
39e0: 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69        "clauses i
39f0: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22  n the same join"
3a00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
3a10: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
3a20: 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75   Add the ON clau
3a30: 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
3a40: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3a50: 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  e, connected by.
3a60: 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70      ** an AND op
3a70: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
3a80: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3a90: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
3aa0: 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69  isOuter ) setJoi
3ab0: 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f  nExpr(pRight->pO
3ac0: 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73  n, pRight->iCurs
3ad0: 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57  or);.      p->pW
3ae0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
3af0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3b00: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69  , p->pWhere, pRi
3b10: 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  ght->pOn);.     
3b20: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30   pRight->pOn = 0
3b30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3b40: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
3b50: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
3b60: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
3b70: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
3b80: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
3b90: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
3ba0: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
3bb0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
3bc0: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
3bd0: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
3be0: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
3bf0: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
3c00: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
3c10: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
3c20: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
3c30: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
3c40: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
3c50: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
3c60: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
3c70: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
3c80: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
3c90: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
3ca0: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
3cb0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
3cc0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
3cd0: 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  ( pRight->pUsing
3ce0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
3cf0: 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74   *pList = pRight
3d00: 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20  ->pUsing;.      
3d10: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74  for(j=0; j<pList
3d20: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
3d30: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3d40: 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
3d50: 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65   the term in the
3d60: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f   USING clause */
3d70: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3d80: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ft;       /* Tab
3d90: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77  le on the left w
3da0: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  ith matching col
3db0: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
3dc0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
3dd0: 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ;    /* Column n
3de0: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
3df0: 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  g column on the 
3e00: 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  left */.        
3e10: 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20  int iRightCol;  
3e20: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3e30: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
3e40: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68  lumn on the righ
3e50: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  t */..        zN
3e60: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
3e70: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
3e80: 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c   iRightCol = col
3e90: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
3ea0: 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab, zName);.    
3eb0: 20 20 20 20 69 66 28 20 69 52 69 67 68 74 43 6f      if( iRightCo
3ec0: 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  l<0.         || 
3ed0: 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49  !tableAndColumnI
3ee0: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
3ef0: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
3f00: 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20  iLeftCol).      
3f10: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
3f20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3f30: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a  Parse, "cannot j
3f40: 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  oin using column
3f50: 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20   %s - column ". 
3f60: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20             "not 
3f70: 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20  present in both 
3f80: 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b  tables", zName);
3f90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
3fa0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
3fb0: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
3fc0: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
3fd0: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
3fe0: 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f  l, i+1, iRightCo
3ff0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
4000: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
4010: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
4020: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4030: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4040: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
4050: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65  nce */.static Ke
4060: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
4070: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
4080: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4090: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
40a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
40b0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
40c0: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
40d0: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
40e0: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
40f0: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
4100: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
4110: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
4120: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
4130: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
4140: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4150: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
4160: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
4170: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  /.);../*.** Gene
4180: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
4190: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
41a0: 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73  ord in registers
41b0: 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f   regData.** thro
41c0: 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74  ugh regData+nDat
41d0: 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72  a-1 onto the sor
41e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
41f0: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
4200: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
4210: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
4220: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4230: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
4240: 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt,        /* In
4250: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4260: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
4270: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
4280: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
4290: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
42a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
42b0: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20  .  int regData, 
42c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
42d0: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
42e0: 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73  ing data to be s
42f0: 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  orted */.  int r
4300: 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20  egOrigData,     
4310: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4320: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4330: 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20   before packing 
4340: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4360: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
4370: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
4380: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
4390: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
43a0: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
43b0: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
43c0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
43d0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
43e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
43f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
4410: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
4420: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
4430: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
4440: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4450: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4460: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4470: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4480: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4490: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
44a0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
44b0: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
44c0: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
44d0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
44e0: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
44f0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
4500: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
4510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
4540: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
4550: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4560: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4570: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4580: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4590: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
45a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
45b0: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
45c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
45d0: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
45e0: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
45f0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
4620: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
4630: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
4640: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69  r */.  int iLimi
4650: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
4670: 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  IT counter */.. 
4680: 20 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30   assert( bSeq==0
4690: 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20   || bSeq==1 );. 
46a0: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
46b0: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
46c0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
46d0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20  OrigData==0 );. 
46e0: 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20   if( nPrefixReg 
46f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
4700: 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72  PrefixReg==nExpr
4710: 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67  +bSeq );.    reg
4720: 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d  Base = regData -
4730: 20 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20   nExpr - bSeq;. 
4740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42   }else{.    regB
4750: 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
4760: 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72  em + 1;.    pPar
4770: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73  se->nMem += nBas
4780: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
4790: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
47a0: 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d  t==0 || pSelect-
47b0: 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >iLimit!=0 );.  
47c0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
47d0: 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c  ->iOffset ? pSel
47e0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ect->iOffset+1 :
47f0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4800: 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  ;.  pSort->label
4810: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
4820: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4830: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4840: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4850: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
4860: 79 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f  y, regBase, regO
4870: 72 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20  rigData,.       
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
48a0: 55 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74  UP | (regOrigDat
48b0: 61 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  a? SQLITE_ECEL_R
48c0: 45 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20  EF : 0));.  if( 
48d0: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
48e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
48f0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4900: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4910: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
4920: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
4930: 52 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e  Reg==0 && nData>
4940: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4950: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
4960: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
4970: 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71  gBase+nExpr+bSeq
4980: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  , nData);.  }.  
4990: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
49a0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
49b0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
49c0: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
49d0: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
49e0: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
49f0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4a00: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4a10: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4a20: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
4a30: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
4a40: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
4a50: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
4a60: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
4a70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4a80: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
4a90: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
4aa0: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
4ab0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
4ac0: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
4ad0: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
4ae0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
4af0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
4b00: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
4b10: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
4b20: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
4b30: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4b40: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
4b50: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
4b60: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
4b70: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
4b80: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
4b90: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
4ba0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
4bb0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
4bc0: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
4bd0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
4be0: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
4bf0: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
4c00: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4c10: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4c20: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
4c30: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
4c40: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
4c50: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
4c60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
4c70: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
4c80: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
4c90: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
4ca0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
4cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4cc0: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
4cd0: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
4ce0: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
4cf0: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
4d00: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
4d10: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
4d20: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
4d30: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
4d40: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
4d50: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
4d60: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
4d70: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
4d80: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
4d90: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
4da0: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
4db0: 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73  Field); /* Makes
4dc0: 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74   OP_Jump below t
4dd0: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4de0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4df0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4e00: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4e10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4e20: 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20   pKI->nXField>2 
4e30: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
4e40: 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
4e50: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
4e60: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4e70: 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20  derBy, nOBSat,. 
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e            pKI->n
4eb0: 58 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  XField-1);.    a
4ec0: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
4ed0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4ee0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4ef0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4f00: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
4f10: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
4f20: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4f30: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
4f40: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
4f50: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4f60: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
4f70: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
4f80: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
4f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4fa0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
4fb0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
4fc0: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
4fd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4fe0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
4ff0: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
5000: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
5010: 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20   if( iLimit ){. 
5020: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5030: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
5040: 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72  ot, iLimit, pSor
5050: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20  t->labelDone);. 
5060: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5070: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
5080: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5090: 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74  ere(v, addrFirst
50a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
50b0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
50c0: 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50  e, regBase, regP
50d0: 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e  revKey, pSort->n
50e0: 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  OBSat);.    sqli
50f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5100: 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d  v, addrJmp);.  }
5110: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
5120: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
5130: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
5140: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74      op = OP_Sort
5150: 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  erInsert;.  }els
5160: 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49  e{.    op = OP_I
5170: 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20  dxInsert;.  }.  
5180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5190: 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72  4Int(v, op, pSor
51a0: 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  t->iECursor, reg
51b0: 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20  Record,.        
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
51d0: 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e  egBase+nOBSat, n
51e0: 42 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20  Base-nOBSat);.  
51f0: 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20  if( iLimit ){.  
5200: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
5210: 69 6e 74 20 72 31 20 3d 20 30 3b 0a 20 20 20 20  int r1 = 0;.    
5220: 2f 2a 20 46 69 6c 6c 20 74 68 65 20 73 6f 72 74  /* Fill the sort
5230: 65 72 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74  er until it cont
5240: 61 69 6e 73 20 4c 49 4d 49 54 2b 4f 46 46 53 45  ains LIMIT+OFFSE
5250: 54 20 65 6e 74 72 69 65 73 2e 20 20 28 54 68 65  T entries.  (The
5260: 20 69 4c 69 6d 69 74 0a 20 20 20 20 2a 2a 20 72   iLimit.    ** r
5270: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
5280: 61 6c 69 7a 65 64 20 77 69 74 68 20 76 61 6c 75  alized with valu
5290: 65 20 6f 66 20 4c 49 4d 49 54 2b 4f 46 46 53 45  e of LIMIT+OFFSE
52a0: 54 2e 29 20 20 41 66 74 65 72 20 74 68 65 20 73  T.)  After the s
52b0: 6f 72 74 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c  orter.    ** fil
52c0: 6c 73 20 75 70 2c 20 64 65 6c 65 74 65 20 74 68  ls up, delete th
52d0: 65 20 6c 65 61 73 74 20 65 6e 74 72 79 20 69 6e  e least entry in
52e0: 20 74 68 65 20 73 6f 72 74 65 72 20 61 66 74 65   the sorter afte
52f0: 72 20 65 61 63 68 20 69 6e 73 65 72 74 2e 0a 20  r each insert.. 
5300: 20 20 20 2a 2a 20 54 68 75 73 20 77 65 20 6e 65     ** Thus we ne
5310: 76 65 72 20 68 6f 6c 64 20 6d 6f 72 65 20 74 68  ver hold more th
5320: 61 6e 20 74 68 65 20 4c 49 4d 49 54 2b 4f 46 46  an the LIMIT+OFF
5330: 53 45 54 20 72 6f 77 73 20 69 6e 20 6d 65 6d 6f  SET rows in memo
5340: 72 79 20 61 74 20 6f 6e 63 65 20 2a 2f 0a 20 20  ry at once */.  
5350: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
5360: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5370: 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d  _IfNotZero, iLim
5380: 69 74 2c 20 30 2c 20 31 29 3b 20 56 64 62 65 43  it, 0, 1); VdbeC
5390: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
53a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
53b0: 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53  1(v, OP_Last, pS
53c0: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  ort->iECursor);.
53d0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 62      if( pSort->b
53e0: 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
53f0: 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 2b   ){.      r1 = +
5400: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
5410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5420: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
5430: 75 6d 6e 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  umn, pSort->iECu
5440: 72 73 6f 72 2c 20 6e 45 78 70 72 2c 20 72 31 29  rsor, nExpr, r1)
5450: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
5460: 65 6e 74 28 28 76 2c 20 22 73 65 71 22 29 29 3b  ent((v, "seq"));
5470: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5480: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5490: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74  OP_Delete, pSort
54a0: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
54b0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72 64   if( pSort->bOrd
54c0: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b  eredInnerLoop ){
54d0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
54e0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 64   inner loop is d
54f0: 72 69 76 65 6e 20 62 79 20 61 6e 20 69 6e 64 65  riven by an inde
5500: 78 20 73 75 63 68 20 74 68 61 74 20 76 61 6c 75  x such that valu
5510: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  es from.      **
5520: 20 74 68 65 20 73 61 6d 65 20 69 74 65 72 61 74   the same iterat
5530: 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ion of the inner
5540: 20 6c 6f 6f 70 20 61 72 65 20 69 6e 20 73 6f 72   loop are in sor
5550: 74 65 64 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  ted order, then.
5560: 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
5570: 74 65 6c 79 20 6a 75 6d 70 20 74 6f 20 74 68 65  tely jump to the
5580: 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
5590: 6f 66 20 61 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70  of an inner loop
55a0: 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
55b0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
55c0: 63 75 72 72 65 6e 74 20 69 74 65 72 61 74 69 6f  current iteratio
55d0: 6e 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 69  n does not fit i
55e0: 6e 74 6f 20 74 68 65 20 74 6f 70 0a 20 20 20 20  nto the top.    
55f0: 20 20 2a 2a 20 4c 49 4d 49 54 2b 4f 46 46 53 45    ** LIMIT+OFFSE
5600: 54 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  T entries of the
5610: 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 20 20   sorter. */.    
5620: 20 20 69 6e 74 20 69 42 72 6b 20 3d 20 73 71 6c    int iBrk = sql
5630: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5640: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
5650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5660: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65  Op3(v, OP_Eq, re
5670: 67 42 61 73 65 2b 6e 45 78 70 72 2c 20 69 42 72  gBase+nExpr, iBr
5680: 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  k, r1);.      sq
5690: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
56a0: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
56b0: 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
56c0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
56d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
56e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
56f0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
5700: 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70   Add code to imp
5710: 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45  lement the OFFSE
5720: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  T.*/.static void
5730: 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56   codeOffset(.  V
5740: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
5750: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
5760: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
5770: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c  /.  int iOffset,
5780: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
5790: 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66  r holding the of
57a0: 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  fset counter */.
57b0: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20    int iContinue 
57c0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
57d0: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
57e0: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rent record */.)
57f0: 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e  {.  if( iOffset>
5800: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5810: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5820: 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c  _IfPos, iOffset,
5830: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20   iContinue, 1); 
5840: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5850: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
5860: 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b  ((v, "OFFSET"));
5870: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
5880: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
5890: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
58a0: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
58b0: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
58c0: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
58d0: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
58e0: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
58f0: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
5900: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
5910: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
5920: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
5930: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
5940: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
5950: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
5960: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
5970: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
5980: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
5990: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
59a0: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
59b0: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
59c0: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
59d0: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
59e0: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
59f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5a00: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
5a10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5a20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
5a30: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
5a40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
5a50: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
5a60: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
5a70: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
5a80: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
5a90: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
5aa0: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
5ab0: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
5ac0: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
5ad0: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
5ae0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
5af0: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
5b00: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
5b10: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
5b20: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
5b30: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
5b40: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5b50: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
5b60: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5b70: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
5b80: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
5b90: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
5ba0: 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20  drRepeat, iMem, 
5bb0: 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  N); VdbeCoverage
5bc0: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
5bd0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
5be0: 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c  akeRecord, iMem,
5bf0: 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74   N, r1);.  sqlit
5c00: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5c10: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
5c20: 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c   iTab, r1, iMem,
5c30: 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65   N);.  sqlite3Re
5c40: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5c50: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
5c60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5c70: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
5c80: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
5c90: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
5ca0: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
5cb0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
5cc0: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
5cd0: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
5ce0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
5cf0: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
5d00: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
5d10: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
5d20: 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20  row.  If srcTab 
5d30: 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  is.** zero or mo
5d40: 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73  re, then data is
5d50: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
5d60: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
5d70: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
5d80: 74 6f 20 67 65 74 20 74 68 65 20 6e 75 6d 62 65  to get the numbe
5d90: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  r of columns and
5da0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
5db0: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
5dc0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
5dd0: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
5de0: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
5df0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5e00: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
5e10: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
5e20: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
5e30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
5e40: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
5e50: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
5e60: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
5e70: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
5e80: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
5e90: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
5ea0: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
5eb0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
5ec0: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
5ed0: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
5ee0: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
5ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
5f00: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
5f10: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
5f20: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69  ORDER BY */.  Di
5f30: 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74  stinctCtx *pDist
5f40: 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20  inct, /* If not 
5f50: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
5f60: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53  w to process DIS
5f70: 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63  TINCT */.  Selec
5f80: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
5f90: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
5fa0: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
5fb0: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
5fc0: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
5fd0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5fe0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
5ff0: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
6000: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
6010: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
6020: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
6030: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
6040: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
6050: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6060: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
6070: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
6080: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6090: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
60a0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
60b0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ent */.  int eDe
60c0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
60d0: 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64  t;   /* How to d
60e0: 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74  ispose of result
60f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
6100: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
6110: 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75  m; /* First argu
6120: 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c  ment to disposal
6130: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74   method */.  int
6140: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20   nResultCol;    
6150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6160: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
6170: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  umns */.  int nP
6180: 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20 20  refixReg = 0;   
6190: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
61a0: 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
61b0: 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65 73  rs before regRes
61c0: 75 6c 74 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75  ult */..  /* Usu
61d0: 61 6c 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20  ally, regResult 
61e0: 69 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  is the first cel
61f0: 6c 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  l in an array of
6200: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20   memory cells.  
6210: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
6220: 65 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74  e current result
6230: 20 72 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61   row. In this ca
6240: 73 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65  se regOrig is se
6250: 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61  t to the.  ** sa
6260: 6d 65 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65  me value. Howeve
6270: 72 2c 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  r, if the result
6280: 73 20 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74  s are being sent
6290: 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20   to the sorter, 
62a0: 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  the.  ** values 
62b0: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
62c0: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73  ons that are als
62d0: 6f 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f  o part of the so
62e0: 72 74 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74  rt-key are omitt
62f0: 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69  ed.  ** from thi
6300: 73 20 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73  s array. In this
6310: 20 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73   case regOrig is
6320: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a   set to zero.  *
6330: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
6340: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
6350: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
6360: 72 79 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65  ry holding curre
6370: 6e 74 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  nt results */.  
6380: 69 6e 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20  int regOrig;    
6390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
63a0: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
63b0: 6f 6c 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75  olding full resu
63c0: 6c 74 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20  lt (or 0) */..  
63d0: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61  assert( v );.  a
63e0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
63f0: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
6400: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
6410: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
6420: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
6430: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
6440: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
6450: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
6460: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
6470: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
6480: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
6490: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
64a0: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
64b0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
64c0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
64d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
64e0: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
64f0: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
6500: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c  nResultCol = pEL
6510: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
6520: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
6530: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  =0 ){.    if( pS
6540: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72  ort ){.      nPr
6550: 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d  efixReg = pSort-
6560: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
6570: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53  ;.      if( !(pS
6580: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
6590: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
65a0: 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65  ter) ) nPrefixRe
65b0: 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  g++;.      pPars
65c0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66  e->nMem += nPref
65d0: 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  ixReg;.    }.   
65e0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
65f0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
6600: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
6610: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
6620: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
6630: 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74  t->iSdst+nResult
6640: 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d  Col > pParse->nM
6650: 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  em ){.    /* Thi
6660: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  s is an error co
6670: 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  ndition that can
6680: 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61   result, for exa
6690: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c  mple, when a SEL
66a0: 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ECT.    ** on th
66b0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
66c0: 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63  e of an INSERT c
66d0: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73  ontains more res
66e0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ult columns than
66f0: 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72  .    ** there ar
6700: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
6710: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65   table on the le
6720: 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77  ft.  The error w
6730: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20  ill be caught.  
6740: 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65    ** and reporte
6750: 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65  d later.  But we
6760: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
6770: 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  re enough memory
6780: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   is allocated.  
6790: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74    ** to avoid ot
67a0: 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72  her spurious err
67b0: 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74  ors in the meant
67c0: 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ime. */.    pPar
67d0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
67e0: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44  ultCol;.  }.  pD
67f0: 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65  est->nSdst = nRe
6800: 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72  sultCol;.  regOr
6810: 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d  ig = regResult =
6820: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20   pDest->iSdst;. 
6830: 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29   if( srcTab>=0 )
6840: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
6850: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
6860: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6870: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6880: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
6890: 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29   i, regResult+i)
68a0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
68b0: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 45  ent((v, "%s", pE
68c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
68d0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
68e0: 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54  e if( eDest!=SRT
68f0: 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f  _Exists ){.    /
6900: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
6910: 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54  tion is an EXIST
6920: 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  S(...) expressio
6930: 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20  n, the actual.  
6940: 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75    ** values retu
6950: 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
6960: 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69  CT are not requi
6970: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
6980: 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20  u8 ecelFlags;.  
6990: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
69a0: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
69b0: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
69c0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
69d0: 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46  e ){.      ecelF
69e0: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43  lags = SQLITE_EC
69f0: 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73  EL_DUP;.    }els
6a00: 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  e{.      ecelFla
6a10: 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gs = 0;.    }.  
6a20: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 21    assert( eDest!
6a30: 3d 53 52 54 5f 54 61 62 6c 65 20 7c 7c 20 70 53  =SRT_Table || pS
6a40: 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ort==0 );.    if
6a50: 28 20 70 53 6f 72 74 20 26 26 20 68 61 73 44 69  ( pSort && hasDi
6a60: 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65 44 65  stinct==0 && eDe
6a70: 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st!=SRT_EphemTab
6a80: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
6a90: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
6aa0: 20 69 6e 20 70 45 4c 69 73 74 20 74 68 61 74 20   in pEList that 
6ab0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  is a copy of an 
6ac0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20  expression in.  
6ad0: 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
6ae0: 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72   BY clause (pSor
6af0: 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65  t->pOrderBy), se
6b00: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
6b10: 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65   .      ** iOrde
6b20: 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20  rByCol value to 
6b30: 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
6b40: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  e index of the O
6b50: 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a  RDER BY .      *
6b60: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  * expression wit
6b70: 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79  hin the sort-key
6b80: 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f   that pushOntoSo
6b90: 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65  rter() will gene
6ba0: 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rate..      ** T
6bb0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70  his allows the p
6bc0: 45 4c 69 73 74 20 66 69 65 6c 64 20 74 6f 20 62  EList field to b
6bd0: 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  e omitted from t
6be0: 68 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64  he sorted record
6bf0: 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 69 6e  ,.      ** savin
6c00: 67 20 73 70 61 63 65 20 61 6e 64 20 43 50 55 20  g space and CPU 
6c10: 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20  cycles.  */.    
6c20: 20 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28    ecelFlags |= (
6c30: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
6c40: 52 45 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  REF|SQLITE_ECEL_
6c50: 52 45 46 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  REF);.      for(
6c60: 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  i=pSort->nOBSat;
6c70: 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   i<pSort->pOrder
6c80: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
6c90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
6ca0: 20 20 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d          if( (j =
6cb0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
6cc0: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
6cd0: 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20  rByCol)>0 ){.   
6ce0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
6cf0: 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  [j-1].u.x.iOrder
6d00: 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72  ByCol = i+1-pSor
6d10: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20  t->nOBSat;.     
6d20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6d30: 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a     regOrig = 0;.
6d40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
6d50: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20  est==SRT_Set || 
6d60: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a  eDest==SRT_Mem .
6d70: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44             || eD
6d80: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
6d90: 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ne || eDest==SRT
6da0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d  _Output );.    }
6db0: 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  .    nResultCol 
6dc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
6dd0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
6de0: 2c 70 45 4c 69 73 74 2c 72 65 67 52 65 73 75 6c  ,pEList,regResul
6df0: 74 2c 30 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a  t,0,ecelFlags);.
6e00: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
6e10: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
6e20: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
6e30: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
6e40: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
6e50: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
6e60: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
6e70: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
6e80: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
6e90: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
6ea0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
6eb0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
6ec0: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
6ed0: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
6ee0: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
6ef0: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
6f00: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
6f10: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
6f20: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
6f30: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
6f40: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
6f50: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
6f60: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
6f70: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
6f80: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
6f90: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
6fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
6fb0: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
6fc0: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
6fd0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
6fe0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
6ff0: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
7000: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
7010: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
7020: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
7030: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
7040: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
7050: 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
7060: 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69  eral coded earli
7070: 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c  er to an OP_Null
7080: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73  .        ** sets
7090: 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64   the MEM_Cleared
70a0: 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73   bit on the firs
70b0: 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  t register of th
70c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
70d0: 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68  vious value.  Th
70e0: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
70f0: 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f  e OP_Ne below to
7100: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20   always.        
7110: 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66  ** fail on the f
7120: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
7130: 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20  f the loop even 
7140: 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  if the first.   
7150: 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61       ** row is a
7160: 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20  ll NULLs..      
7170: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
7180: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
7190: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
71a0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
71b0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
71c0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
71d0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
71e0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
71f0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
7200: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ull;.        pOp
7210: 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
7220: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50    pOp->p2 = regP
7230: 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a  rev;..        iJ
7240: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
7250: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
7260: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
7270: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7280: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
7290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
72a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
72b0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
72c0: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
72d0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
72e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52          if( i<nR
72f0: 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20  esultCol-1 ){.  
7300: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7310: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7320: 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b  P_Ne, regResult+
7330: 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65  i, iJump, regPre
7340: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
7350: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
7360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
7370: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7390: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52  3(v, OP_Eq, regR
73a0: 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e  esult+i, iContin
73b0: 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a  ue, regPrev+i);.
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
73d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
73e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
73f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7400: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
7410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
7420: 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
7430: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7440: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7450: 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
7460: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7470: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
7480: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
7490: 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20  dr(v)==iJump || 
74a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
74b0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
74c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
74d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
74e0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
74f0: 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Prev, nResultCol
7500: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  -1);.        bre
7510: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
7520: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
7530: 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
7540: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7550: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
7560: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
7570: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
7580: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7590: 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
75a0: 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   {.        asser
75b0: 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  t( pDistinct->eT
75c0: 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44  nctType==WHERE_D
75d0: 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
75e0: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  D );.        cod
75f0: 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
7600: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62  , pDistinct->tab
7610: 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  Tnct, iContinue,
7620: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20   nResultCol,.   
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20    regResult);.  
7650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7660: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
7670: 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20  f( pSort==0 ){. 
7680: 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28       codeOffset(
7690: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
76a0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
76b0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
76c0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
76d0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
76e0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
76f0: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
7700: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
7710: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
7720: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
7730: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7740: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7750: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
7760: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
7770: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
7780: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
7790: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
77a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
77b0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
77c0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
77d0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b  nResultCol, r1);
77e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
77f0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
7800: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
7810: 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c  rm, r1, regResul
7820: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
7830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
7840: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
7850: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
7860: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
7870: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
7880: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
7890: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
78a0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
78b0: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
78c0: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
78d0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
78e0: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
78f0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
7900: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
7910: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
7920: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
7930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7940: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
7950: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
7960: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7970: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72  ltCol);.      br
7980: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7990: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
79a0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
79b0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72   */..    /* Stor
79c0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
79d0: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
79e0: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
79f0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66      case SRT_Fif
7a00: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
7a10: 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61  DistFifo:.    ca
7a20: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
7a30: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
7a40: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
7a50: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7a60: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7a70: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
7a80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7a90: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
7aa0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
7ab0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7ac0: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
7ad0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7ae0: 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20  t==SRT_Fifo );. 
7af0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7b00: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
7b10: 66 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  fo );.      sqli
7b20: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7b30: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
7b40: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7b50: 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69  ltCol, r1+nPrefi
7b60: 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53  xReg);.#ifndef S
7b70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
7b80: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
7b90: 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a  SRT_DistFifo ){.
7ba0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
7bb0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
7bc0: 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20   DistFifo, then 
7bd0: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
7be0: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
7bf0: 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65   ** on an epheme
7c00: 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ral index. If th
7c10: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
7c20: 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
7c30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
7c40: 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74  he index, do not
7c50: 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65   write it to the
7c60: 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c   output. If not,
7c70: 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20   add the.       
7c80: 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20   ** current row 
7c90: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  to the index and
7ca0: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72   proceed with wr
7cb0: 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a  iting it to the.
7cc0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
7cd0: 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e  t table as well.
7ce0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
7cf0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
7d00: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
7d10: 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73  ) + 4;.        s
7d20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
7d30: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
7d40: 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20   iParm+1, addr, 
7d50: 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
7d60: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
7d70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d80: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
7d90: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
7da0: 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65  Parm+1, r1,regRe
7db0: 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29  sult,nResultCol)
7dc0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7dd0: 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20  ( pSort==0 );.  
7de0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
7df0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7e00: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7e10: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7e20: 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65  Sort, p, r1+nPre
7e30: 66 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74  fixReg,regResult
7e40: 2c 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  ,1,nPrefixReg);.
7e50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7e60: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
7e70: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7e80: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
7e90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7ea0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
7eb0: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
7ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7ed0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
7ee0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
7ef0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
7f00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7f10: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
7f20: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
7f30: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7f40: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
7f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7f60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7f70: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
7f80: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  1, nPrefixReg+1)
7f90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7fa0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
7fb0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7fc0: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
7fd0: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
7fe0: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
7ff0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
8000: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
8010: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
8020: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
8030: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
8040: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
8050: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
8060: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
8070: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
8080: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
8090: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
80a0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
80b0: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
80c0: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
80d0: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
80e0: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
80f0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
8100: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
8110: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
8120: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
8130: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
8140: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
8150: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
8160: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
8170: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
8180: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
8190: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
81a0: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
81b0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
81c0: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
81d0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
81e0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
81f0: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
8200: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
8210: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8220: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
8230: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
8240: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
8250: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
8260: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
8270: 41 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c  AffSdst)==nResul
8280: 74 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  tCol );.        
8290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
82a0: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
82b0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
82c0: 52 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20  ResultCol, .    
82d0: 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73          r1, pDes
82e0: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65  t->zAffSdst, nRe
82f0: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
8300: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
8310: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
8320: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
8330: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8340: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8350: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
8360: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
8370: 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73  Parm, r1, regRes
8380: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
8390: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
83a0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
83b0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
83c0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
83d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
83e0: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
83f0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8400: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
8410: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
8420: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
8430: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
8440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8450: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
8460: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
8470: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
8480: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
8490: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
84a0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
84b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
84c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
84d0: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
84e0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
84f0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
8500: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
8510: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
8520: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
8530: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72  e memory cell or
8540: 20 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a   array of .    *
8550: 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  * memory cells a
8560: 6e 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  nd break out of 
8570: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
8580: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8590: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
85a0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
85b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
85c0: 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e  sultCol<=pDest->
85d0: 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20  nSdst );.       
85e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
85f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
8600: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8610: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
8620: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
8630: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
8640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8650: 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74   assert( nResult
8660: 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73  Col==pDest->nSds
8670: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  t );.        ass
8680: 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d  ert( regResult==
8690: 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  iParm );.       
86a0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
86b0: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
86c0: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
86d0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d  or us */.      }
86e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
86f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
8700: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8710: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
8720: 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
8730: 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20  utine:       /* 
8740: 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63  Send data to a c
8750: 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  o-routine */.   
8760: 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74   case SRT_Output
8770: 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  : {        /* Re
8780: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73  turn the results
8790: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
87a0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
87b0: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
87c0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
87d0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
87e0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
87f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
8800: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
8810: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
8820: 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c  Result, regOrig,
8830: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20   nResultCol,.   
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b      nPrefixReg);
8860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8870: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
8880: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  utine ){.       
8890: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
88a0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
88b0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
88c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
88d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
88e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
88f0: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
8900: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8910: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8920: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
8930: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
8940: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8950: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  ltCol);.      }.
8960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8970: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
8980: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
8990: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73  /* Write the res
89a0: 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f  ults into a prio
89b0: 72 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20  rity queue that 
89c0: 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69  is order accordi
89d0: 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65  ng to.    ** pDe
89e0: 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e  st->pOrderBy (in
89f0: 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69   pSO).  pDest->i
8a00: 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d  SDParm (in iParm
8a10: 29 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  ) is the cursor 
8a20: 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e  for an.    ** in
8a30: 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45  dex with pSO->nE
8a40: 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20  xpr+2 columns.  
8a50: 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e  Build a key usin
8a60: 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69  g pSO for the fi
8a70: 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e  rst.    ** pSO->
8a80: 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74  nExpr columns, t
8a90: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  hen make sure al
8aa0: 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  l keys are uniqu
8ab0: 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20  e by adding a.  
8ac0: 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65    ** final OP_Se
8ad0: 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20  quence column.  
8ae0: 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  The last column 
8af0: 69 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73  is the record as
8b00: 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a   a blob..    */.
8b10: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
8b20: 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65  tQueue:.    case
8b30: 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20   SRT_Queue: {.  
8b40: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
8b50: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
8b60: 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  r3;.      int ad
8b70: 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  drTest = 0;.    
8b80: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b    ExprList *pSO;
8b90: 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65  .      pSO = pDe
8ba0: 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  st->pOrderBy;.  
8bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20      assert( pSO 
8bc0: 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  );.      nKey = 
8bd0: 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pSO->nExpr;.    
8be0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
8bf0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
8c00: 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
8c10: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
8c20: 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29  (pParse, nKey+2)
8c30: 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b  ;.      r3 = r2+
8c40: 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66  nKey+1;.      if
8c50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
8c60: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
8c70: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
8c80: 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51  ination is DistQ
8c90: 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f  ueue, then curso
8ca0: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
8cb0: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
8cc0: 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d  n a second ephem
8cd0: 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  eral index that 
8ce0: 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73  holds all values
8cf0: 20 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c   every previousl
8d00: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  y.        ** add
8d10: 65 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e  ed to the queue.
8d20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
8d30: 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
8d40: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
8d50: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
8d60: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8d90: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8da0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Col);.        Vd
8db0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8dc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8dd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8de0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
8df0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8e00: 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20  ultCol, r3);.   
8e10: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
8e20: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
8e30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8e40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8e50: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b  dxInsert, iParm+
8e60: 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  1, r3);.        
8e70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8e80: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
8e90: 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
8ea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8eb0: 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b  i=0; i<nKey; i++
8ec0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8ed0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8ee0: 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20  OP_SCopy,.      
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f00: 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20      regResult + 
8f10: 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  pSO->a[i].u.x.iO
8f20: 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20  rderByCol - 1,. 
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a           r2+i);.
8f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8f60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8f70: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
8f80: 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b  iParm, r2+nKey);
8f90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8fa0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8fb0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e  akeRecord, r2, n
8fc0: 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20  Key+2, r1);.    
8fd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8fe0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
8ff0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
9000: 31 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  1, r2, nKey+2);.
9010: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65        if( addrTe
9020: 73 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  st ) sqlite3Vdbe
9030: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
9040: 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Test);.      sql
9050: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9060: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
9070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
9080: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
9090: 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32  arse, r2, nKey+2
90a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
90b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
90c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
90d0: 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e  */....#if !defin
90e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
90f0: 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44  RIGGER).    /* D
9100: 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c  iscard the resul
9110: 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ts.  This is use
9120: 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  d for SELECT sta
9130: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20  tements inside. 
9140: 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f     ** the body o
9150: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68  f a TRIGGER.  Th
9160: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63  e purpose of suc
9170: 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20  h selects is to 
9180: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72  call.    ** user
9190: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
91a0: 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64  ns that have sid
91b0: 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64  e effects.  We d
91c0: 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a  o not care.    *
91d0: 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75  * about the actu
91e0: 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  al results of th
91f0: 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f  e select..    */
9200: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
9210: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
9220: 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
9230: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
9240: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9250: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
9260: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
9270: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
9280: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78   is reached.  Ex
9290: 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68  cept, if.  ** th
92a0: 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c  ere is a sorter,
92b0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
92c0: 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c  he sorter has al
92d0: 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20  ready limited.  
92e0: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f  ** the output fo
92f0: 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  r us..  */.  if(
9300: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e   pSort==0 && p->
9310: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
9320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9330: 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65  v, OP_DecrJumpZe
9340: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
9350: 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
9360: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a  rage(v);.  }.}..
9370: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
9380: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9390: 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61  sufficient for a
93a0: 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79  n index of N key
93b0: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20   columns and.** 
93c0: 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e  X extra columns.
93d0: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
93e0: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
93f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
9400: 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69  t N, int X){.  i
9410: 6e 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58  nt nExtra = (N+X
9420: 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  )*(sizeof(CollSe
9430: 71 2a 29 2b 31 29 3b 0a 20 20 4b 65 79 49 6e 66  q*)+1);.  KeyInf
9440: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
9450: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
9460: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
9470: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
9480: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
9490: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
94a0: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
94b0: 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28     p->nField = (
94c0: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58  u16)N;.    p->nX
94d0: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a  Field = (u16)X;.
94e0: 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43      p->enc = ENC
94f0: 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  (db);.    p->db 
9500: 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = db;.    p->nRe
9510: 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  f = 1;.    memse
9520: 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74  t(&p[1], 0, nExt
9530: 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ra);.  }else{.  
9540: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
9550: 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t(db);.  }.  ret
9560: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
9570: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  Deallocate a Key
9580: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  Info object.*/.v
9590: 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oid sqlite3KeyIn
95a0: 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20  foUnref(KeyInfo 
95b0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
95c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
95d0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
95e0: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
95f0: 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c  p->nRef==0 ) sql
9600: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
9610: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
9620: 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f  ** Make a new po
9630: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
9640: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79  fo object.*/.Key
9650: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
9660: 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20  InfoRef(KeyInfo 
9670: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
9680: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9690: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
96a0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nRef++;.  }.  re
96b0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65  turn p;.}..#ifde
96c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
96d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
96e0: 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   if a KeyInfo ob
96f0: 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e  ject can be chan
9700: 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ge.  The KeyInfo
9710: 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f   object.** can o
9720: 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69  nly be changed i
9730: 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61  f this is just a
9740: 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63   single referenc
9750: 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e  e to the object.
9760: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9770: 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
9780: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
9790: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
97a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65  */.int sqlite3Ke
97b0: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
97c0: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65  (KeyInfo *p){ re
97d0: 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b  turn p->nRef==1;
97e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
97f0: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
9800: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
9810: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
9820: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
9830: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
9840: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
9850: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
9860: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
9870: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
9880: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
9890: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
98a0: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
98b0: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
98c0: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
98d0: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
98e0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
98f0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
9900: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
9910: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
9920: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
9930: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
9940: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
9950: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
9960: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
9970: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
9980: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
9990: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
99a0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
99b0: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
99c0: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
99d0: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
99e0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
99f0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
9a00: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ure is obtained 
9a10: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
9a20: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
9a30: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
9a40: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
9a50: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
9a60: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
9a70: 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73  y.** freed..*/.s
9a80: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
9a90: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
9aa0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
9ab0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
9ac0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9ad0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9ae0: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
9af0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
9b00: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
9b10: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
9b20: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
9b30: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
9b40: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
9b50: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
9b60: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
9b70: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
9b80: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
9b90: 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69  he end */.){.  i
9ba0: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
9bb0: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
9bc0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9bd0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
9be0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9bf0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
9c00: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
9c10: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
9c20: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
9c30: 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
9c40: 2d 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b  -iStart, nExtra+
9c50: 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20  1);.  if( pInfo 
9c60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
9c70: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
9c80: 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20  riteable(pInfo) 
9c90: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74  );.    for(i=iSt
9ca0: 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  art, pItem=pList
9cb0: 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45  ->a+iStart; i<nE
9cc0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
9cd0: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
9ce0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
9cf0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
9d00: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
9d10: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
9d20: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
9d30: 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
9d40: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
9d50: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
9d60: 2d 69 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c  -iStart] = pColl
9d70: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
9d80: 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61  SortOrder[i-iSta
9d90: 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  rt] = pItem->sor
9da0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
9db0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
9dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  ;.}../*.** Name 
9dd0: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
9de0: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
9df0: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
9e00: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
9e10: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
9e20: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
9e30: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
9e40: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
9e50: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
9e60: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
9e70: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
9e80: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
9e90: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
9ea0: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
9eb0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
9ec0: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
9ed0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9ee0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
9ef0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
9f00: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
9f10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
9f20: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9f30: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
9f40: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22  *.** Unless an "
9f50: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
9f60: 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62  AN" command is b
9f70: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
9f80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
9f90: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
9fa0: 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20  erwise, it adds 
9fb0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
9fc0: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51  output to the EQ
9fd0: 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65  P result,.** whe
9fe0: 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69  re the caption i
9ff0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
a000: 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50  *.**   "USE TEMP
a010: 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22   B-TREE FOR xxx"
a020: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78  .**.** where xxx
a030: 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54   is one of "DIST
a040: 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59  INCT", "ORDER BY
a050: 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e  " or "GROUP BY".
a060: 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a   Exactly which.*
a070: 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  * is determined 
a080: 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72  by the zUsage ar
a090: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
a0a0: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65  c void explainTe
a0b0: 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  mpTable(Parse *p
a0c0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
a0d0: 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66  r *zUsage){.  if
a0e0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
a0f0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
a100: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a110: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
a120: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
a130: 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
a140: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
a150: 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67  E FOR %s", zUsag
a160: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
a170: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a180: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
a190: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
a1a0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
a1b0: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
a1c0: 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73  * Assign express
a1d0: 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20  ion b to lvalue 
a1e0: 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d  a. A second, no-
a1f0: 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  op, version of t
a200: 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20  his macro.** is 
a210: 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51  provided when SQ
a220: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
a230: 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  N is defined. Th
a240: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  is allows the co
a250: 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33  de.** in sqlite3
a260: 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69  Select() to assi
a270: 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72  gn values to str
a280: 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61  ucture member va
a290: 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20  riables that.** 
a2a0: 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51  only exist if SQ
a2b0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
a2c0: 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  N is not defined
a2d0: 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69   without polluti
a2e0: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  ng the.** code w
a2f0: 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65  ith #ifndef dire
a300: 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66  ctives..*/.# def
a310: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
a320: 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20  teger(a, b) a = 
a330: 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  b..#else./* No-o
a340: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
a350: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
a360: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
a370: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
a380: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
a390: 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20  e(y,z).# define 
a3a0: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
a3b0: 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23  r(y,z).#endif..#
a3c0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a3d0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
a3e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
a3f0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
a400: 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20  D_SELECT)./*.** 
a410: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
a420: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
a430: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
a440: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
a450: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
a460: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
a470: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
a480: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
a490: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
a4a0: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
a4b0: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
a4c0: 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66  one of the two f
a4d0: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43  orms:.**.**   "C
a4e0: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
a4f0: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
a500: 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22  ub2 (op)".**   "
a510: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
a520: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
a530: 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20  Sub2 USING TEMP 
a540: 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a  B-TREE (op)".**.
a550: 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61  ** where iSub1 a
a560: 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65  nd iSub2 are the
a570: 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64   integers passed
a580: 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
a590: 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  nding.** functio
a5a0: 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e  n parameters, an
a5b0: 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74  d op is the text
a5c0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
a5d0: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
a5e0: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
a5f0: 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65  name. The parame
a600: 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65  ter "op" must be
a610: 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   one of TK_UNION
a620: 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20  , TK_EXCEPT,.** 
a630: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20  TK_INTERSECT or 
a640: 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73  TK_ALL. The firs
a650: 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69  t form is used i
a660: 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54  f argument bUseT
a670: 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c  mp is .** false,
a680: 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66   or the second f
a690: 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75  orm if it is tru
a6a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
a6b0: 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  d explainComposi
a6c0: 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  te(.  Parse *pPa
a6d0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
a6e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
a6f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
a700: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
a710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a720: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
a730: 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a  TK_EXCEPT etc. *
a740: 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20  /.  int iSub1,  
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a760: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
a770: 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53  id 1 */.  int iS
a780: 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub2,            
a790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
a7a0: 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20  query id 2 */.  
a7b0: 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20  int bUseTmp     
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d  /* True if a tem
a7e0: 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64  p table was used
a7f0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
a800: 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c   op==TK_UNION ||
a810: 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
a820: 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
a830: 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  CT || op==TK_ALL
a840: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
a850: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
a860: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
a870: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
a880: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
a890: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20  lite3MPrintf(.  
a8a0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
a8b0: 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51  , "COMPOUND SUBQ
a8c0: 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64  UERIES %d AND %d
a8d0: 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c   %s(%s)", iSub1,
a8e0: 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20   iSub2,.        
a8f0: 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54  bUseTmp?"USING T
a900: 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c  EMP B-TREE ":"",
a910: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70   selectOpName(op
a920: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ).    );.    sql
a930: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
a940: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
a950: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
a960: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
a970: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
a980: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
a990: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
a9a0: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
a9b0: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
a9c0: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
a9d0: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76  plainComposite(v
a9e0: 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
a9f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
aa00: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
aa10: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
aa20: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
aa30: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
aa40: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
aa50: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
aa60: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
aa70: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
aa80: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
aa90: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
aaa0: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
aab0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
aac0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
aad0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
aae0: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
aaf0: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
ab00: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
ab10: 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50  ateSortTail(.  P
ab20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ab30: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ab40: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
ab50: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
ab60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
ab70: 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  nt */.  SortCtx 
ab80: 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66  *pSort,   /* Inf
ab90: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20  ormation on the 
aba0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
abb0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
abc0: 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ,      /* Number
abd0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
abe0: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
abf0: 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72  est *pDest /* Wr
ac00: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
ac10: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
ac20: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
ac30: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
ac60: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
ac70: 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20  int addrBreak = 
ac80: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65  pSort->labelDone
ac90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
aca0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69  Jump here to exi
acb0: 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  t loop */.  int 
acc0: 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73  addrContinue = s
acd0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ace0: 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70  bel(v);  /* Jump
acf0: 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63   here for next c
ad00: 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ycle */.  int ad
ad10: 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e  dr;.  int addrOn
ad20: 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  ce = 0;.  int iT
ad30: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
ad40: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74  pOrderBy = pSort
ad50: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
ad60: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
ad70: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
ad80: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
ad90: 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52  Parm;.  int regR
ada0: 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ow;.  int regRow
adb0: 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  id;.  int iCol;.
adc0: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e    int nKey;.  in
add0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
adf0: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
ae00: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
ae10: 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20   int nSortData; 
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c   /* Trailing val
ae40: 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ues to read from
ae50: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74   sorter */.  int
ae60: 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20   i;.  int bSeq; 
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
ae90: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69   sorter record i
aea0: 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e  ncludes seq. no.
aeb0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
aec0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74  rList_item *aOut
aed0: 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Ex = p->pEList->
aee0: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64  a;..  assert( ad
aef0: 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69  drBreak<0 );.  i
af00: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
af10: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  kOut ){.    sqli
af20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
af30: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
af40: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
af50: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
af60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
af70: 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61  Goto(v, addrBrea
af80: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
af90: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
afa0: 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  v, pSort->labelB
afb0: 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61  kOut);.  }.  iTa
afc0: 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  b = pSort->iECur
afd0: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
afe0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
aff0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
b000: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
b010: 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  RT_Mem ){.    re
b020: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  gRowid = 0;.    
b030: 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e  regRow = pDest->
b040: 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74  iSdst;.    nSort
b050: 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  Data = nColumn;.
b060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
b070: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
b080: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
b090: 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  );.    regRow = 
b0a0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
b0b0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
b0c0: 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44  umn);.    nSortD
b0d0: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
b0e0: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
b0f0: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
b100: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
b110: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
b120: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
b130: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
b140: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
b150: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
b160: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
b170: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
b180: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
b190: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
b1a0: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
b1b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
b1c0: 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
b1d0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b1e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b1f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b200: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72  OpenPseudo, iSor
b210: 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  tTab, regSortOut
b220: 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61  , nKey+1+nSortDa
b230: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  ta);.    if( add
b240: 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56  rOnce ) sqlite3V
b250: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b260: 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64  ddrOnce);.    ad
b270: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
b280: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b290: 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61  _SorterSort, iTa
b2a0: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
b2b0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
b2c0: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
b2d0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
b2e0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
b2f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b300: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
b310: 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72  terData, iTab, r
b320: 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74  egSortOut, iSort
b330: 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d  Tab);.    bSeq =
b340: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
b350: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
b360: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b370: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
b380: 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
b390: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b3a0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
b3b0: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
b3c0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53  ontinue);.    iS
b3d0: 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ortTab = iTab;. 
b3e0: 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d     bSeq = 1;.  }
b3f0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c  .  for(i=0, iCol
b400: 3d 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c 6e 53  =nKey+bSeq; i<nS
b410: 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20  ortData; i++){. 
b420: 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20     int iRead;.  
b430: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
b440: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
b450: 29 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d  ){.      iRead =
b460: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
b470: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
b480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b490: 52 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b 0a 20  Read = iCol++;. 
b4a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b4b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b4c0: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
b4d0: 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77  b, iRead, regRow
b4e0: 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  +i);.    VdbeCom
b4f0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61  ment((v, "%s", a
b500: 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f  OutEx[i].zName ?
b510: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
b520: 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70   : aOutEx[i].zSp
b530: 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  an));.  }.  swit
b540: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
b550: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
b560: 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab: {.      sqli
b570: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b580: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
b590: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
b5a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b5b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
b5c0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
b5d0: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
b5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b5f0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
b600: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
b610: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b620: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b630: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
b640: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
b650: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
b660: 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53  Column==sqlite3S
b670: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
b680: 41 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20  AffSdst) );.    
b690: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b6a0: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
b6b0: 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  cord, regRow, nC
b6c0: 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c  olumn, regRowid,
b6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b6e0: 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
b6f0: 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  zAffSdst, nColum
b700: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
b710: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
b720: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
b730: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
b740: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b750: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
b760: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
b770: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20  Parm, regRowid, 
b780: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
b790: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b7a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
b7b0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f  T_Mem: {.      /
b7c0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
b7d0: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
b7e0: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
b7f0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
b800: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b810: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
b820: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
b830: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
b840: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
b850: 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20  utine ); .      
b860: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
b870: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
b880: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
b890: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b8a0: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ine );.      if(
b8b0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
b8c0: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
b8d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b8e0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
b8f0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
b900: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
b910: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
b920: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
b930: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
b940: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
b950: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b960: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b970: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
b980: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
b990: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
b9a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b9b0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
b9c0: 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44  id ){.    if( eD
b9d0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a  est==SRT_Set ){.
b9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
b9f0: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
ba00: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
ba10: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  olumn);.    }els
ba20: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
ba30: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
ba40: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
ba50: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ba60: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
ba70: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
ba80: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
ba90: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
baa0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
bab0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
bac0: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
bad0: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
bae0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
baf0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
bb00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
bb10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
bb20: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
bb30: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
bb40: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
bb50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
bb60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
bb70: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
bb80: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
bb90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
bba0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
bbb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
bbc0: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
bbd0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
bbe0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
bbf0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
bc00: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
bc10: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
bc20: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
bc30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
bc40: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
bc50: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
bc60: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
bc70: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
bc80: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
bc90: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
bca0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
bcb0: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
bcc0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
bcd0: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
bce0: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
bcf0: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
bd00: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
bd10: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
bd20: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
bd30: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
bd40: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
bd50: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
bd60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
bd70: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
bd80: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
bd90: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
bda0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
bdb0: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
bdc0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
bdd0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
bde0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
bdf0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
be00: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
be10: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
be20: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
be30: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
be40: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
be50: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
be60: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
be70: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
be80: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
be90: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
bea0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
beb0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
bec0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
bed0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
bee0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
bef0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
bf00: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
bf10: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
bf20: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
bf30: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
bf40: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
bf50: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
bf60: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
bf70: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
bf80: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
bf90: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
bfa0: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
bfb0: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
bfc0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
bfd0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
bfe0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
bff0: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
c000: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
c010: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
c020: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c030: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
c040: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
c050: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
c060: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c  nTypeImpl(A,B,C,
c070: 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20  D,E,F).#else /* 
c080: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c090: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c0a0: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
c0b0: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
c0c0: 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63  e(A,B,C,D,E,F) c
c0d0: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
c0e0: 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  B,F).#endif.stat
c0f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
c100: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
c110: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
c120: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
c130: 72 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r,.#ifdef SQLITE
c140: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c150: 45 54 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20  ETADATA.  const 
c160: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c  char **pzOrigDb,
c170: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
c180: 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e  pzOrigTab,.  con
c190: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
c1a0: 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38  Col,.#endif.  u8
c1b0: 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20   *pEstWidth.){. 
c1c0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
c1d0: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
c1e0: 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d  .  u8 estWidth =
c1f0: 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
c200: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c210: 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20  METADATA.  char 
c220: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d  const *zOrigDb =
c230: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
c240: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
c250: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
c260: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64  rigCol = 0;.#end
c270: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45  if..  assert( pE
c280: 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  xpr!=0 );.  asse
c290: 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
c2a0: 74 21 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68  t!=0 );.  switch
c2b0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
c2c0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
c2d0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
c2e0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
c2f0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
c300: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
c310: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
c320: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
c330: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
c340: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
c350: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
c360: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
c370: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
c380: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
c390: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
c3a0: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
c3b0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c3c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c3d0: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
c3e0: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
c3f0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
c400: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
c410: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c420: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
c430: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
c440: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
c450: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
c460: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
c470: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
c480: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
c490: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
c4a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
c4b0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
c4c0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
c4d0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
c4e0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
c4f0: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
c500: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
c510: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
c520: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
c530: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
c540: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
c550: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
c560: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
c570: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
c580: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
c590: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
c5a0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
c5b0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
c5c0: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
c5d0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
c5e0: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
c5f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
c600: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
c610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c620: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
c630: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
c640: 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20  /* At one time, 
c650: 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45  code such as "SE
c660: 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68  LECT new.x" with
c670: 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75  in a trigger wou
c680: 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ld.        ** ca
c690: 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69  use this conditi
c6a0: 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63  on to run.  Sinc
c6b0: 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20  e then, we have 
c6c0: 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77  restructured how
c6d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67  .        ** trig
c6e0: 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65  ger code is gene
c6f0: 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69  rated and so thi
c700: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  s condition is n
c710: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
c720: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48    ** possible. H
c730: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73  owever, it can s
c740: 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72  till be true for
c750: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
c760: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
c770: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
c780: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
c790: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
c7a0: 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b  t1(col INTEGER);
c7b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
c7c0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e  LECT (SELECT t1.
c7d0: 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74  col) FROM FROM t
c7e0: 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  1;.        **.  
c7f0: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f        ** when co
c800: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
c810: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
c820: 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20  ession "t1.col" 
c830: 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
c840: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49  ** sub-select. I
c850: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
c860: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
c870: 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20   to NULL, even. 
c880: 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
c890: 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c   it should reall
c8a0: 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a  y be "INTEGER"..
c8b0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c8c0: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
c8d0: 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20  t a problem, as 
c8e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
c8f0: 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e  of "t1.col" is n
c900: 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ever.        ** 
c910: 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d  used. When colum
c920: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
c930: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
c940: 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ion .        ** 
c950: 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29  "(SELECT t1.col)
c960: 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  ", the correct t
c970: 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ype is returned 
c980: 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45  (see the TK_SELE
c990: 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72  CT.        ** br
c9a0: 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  anch below.  */.
c9b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c9c0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
c9d0: 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45  sert( pTab && pE
c9e0: 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20  xpr->pTab==pTab 
c9f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
ca00: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
ca10: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
ca20: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
ca30: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
ca40: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
ca50: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
ca60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
ca70: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
ca80: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
ca90: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
caa0: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
cab0: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
cac0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
cad0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
cae0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
caf0: 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Col>=0 && ALWAYS
cb00: 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74  (iCol<pS->pEList
cb10: 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
cb20: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c        /* If iCol
cb30: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
cb40: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ro, then the exp
cb50: 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73  ression requests
cb60: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
cb70: 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73  * rowid of the s
cb80: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
cb90: 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69  w. This expressi
cba0: 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65  on is legal (see
cbb0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
cbc0: 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32  est case misc2.2
cbd0: 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20  .2) - it always 
cbe0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
cbf0: 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  L..          **.
cc00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65            ** The
cc10: 20 41 4c 57 41 59 53 28 29 20 69 73 20 62 65 63   ALWAYS() is bec
cc20: 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53 2d 3e 70  ause iCol>=pS->p
cc30: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 77 69 6c  EList->nExpr wil
cc40: 6c 20 68 61 76 65 20 62 65 65 6e 0a 20 20 20 20  l have been.    
cc50: 20 20 20 20 20 20 2a 2a 20 63 61 75 67 68 74 20        ** caught 
cc60: 61 6c 72 65 61 64 79 20 62 79 20 6e 61 6d 65 20  already by name 
cc70: 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20 20  resolution..    
cc80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
cc90: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
cca0: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
ccb0: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
ccc0: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
ccd0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
cce0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
ccf0: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
cd00: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
cd10: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
cd20: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
cd30: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
cd40: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
cd50: 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67  e(&sNC, p,&zOrig
cd60: 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f  Db,&zOrigTab,&zO
cd70: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
cd80: 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  h); .        }. 
cd90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
cda0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
cdb0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
cdc0: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
cdd0: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
cde0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
cdf0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
ce00: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
ce10: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
ce20: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
ce30: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
ce40: 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ol) );.#ifdef SQ
ce50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
ce60: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
ce70: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
ce80: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
ce90: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
cea0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
ceb0: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
cec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ced0: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
cee0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
cef0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
cf00: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
cf10: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54  e3ColumnType(&pT
cf20: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30  ab->aCol[iCol],0
cf30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  );.          est
cf40: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
cf50: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
cf60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf70: 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61    zOrigTab = pTa
cf80: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
cf90: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
cfa0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
cfb0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
cfc0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
cfd0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
cfe0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
cff0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62           zOrigDb
d000: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
d010: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
d020: 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  SName;.        }
d030: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69  .#else.        i
d040: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
d050: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
d060: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
d070: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d080: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
d090: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54  e3ColumnType(&pT
d0a0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30  ab->aCol[iCol],0
d0b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  );.          est
d0c0: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
d0d0: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
d0e0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
d0f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d100: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
d110: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d120: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
d130: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
d140: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
d150: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
d160: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
d170: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
d180: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
d190: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
d1a0: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
d1b0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
d1c0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
d1d0: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
d1e0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
d1f0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
d200: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
d210: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
d220: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
d230: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
d240: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
d250: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
d260: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
d270: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
d280: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
d290: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
d2a0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
d2b0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
d2c0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
d2d0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
d2e0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
d2f0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d300: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
d310: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
d320: 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20  , &estWidth); . 
d330: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d340: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
d350: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d360: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
d370: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
d380: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
d390: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
d3a0: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
d3b0: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
d3c0: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
d3d0: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
d3e0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
d3f0: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
d400: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73  #endif.  if( pEs
d410: 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69  tWidth ) *pEstWi
d420: 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a  dth = estWidth;.
d430: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
d440: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
d450: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
d460: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
d470: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
d480: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
d490: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
d4a0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
d4b0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
d4c0: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
d4d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d4e0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
d4f0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
d500: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
d510: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
d520: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
d530: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
d540: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
d550: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
d560: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
d570: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
d580: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
d590: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
d5a0: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
d5b0: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
d5c0: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
d5d0: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
d5e0: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
d5f0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
d600: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
d610: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
d620: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
d640: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
d650: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
d660: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
d670: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
d680: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
d690: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
d6a0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
d6b0: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
d6c0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
d6d0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d6e0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
d6f0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
d700: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
d710: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
d720: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
d730: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
d740: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
d750: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
d760: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
d770: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
d780: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
d790: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
d7a0: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
d7b0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
d7c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d7d0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d7e0: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
d7f0: 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f  zOrigDb, SQLITE_
d800: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d810: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d820: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d830: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
d840: 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Tab, SQLITE_TRAN
d850: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
d860: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d870: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d880: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
d890: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d8a0: 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  NT);.#else.    z
d8b0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
d8c0: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
d8d0: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
d8e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d8f0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d900: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
d910: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
d920: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
d930: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
d940: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
d950: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a  CLTYPE) */.}../*
d960: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d970: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
d980: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
d990: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
d9a0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
d9b0: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
d9c0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
d9d0: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
d9e0: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
d9f0: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
da00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
da10: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
da20: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
da30: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
da40: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
da50: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
da60: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
da70: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
da80: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
da90: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
daa0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
dab0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
dac0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
dad0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
dae0: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
daf0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
db00: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
db10: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
db20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
db30: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
db40: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
db50: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
db60: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
db70: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
db80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
db90: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
dba0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
dbb0: 53 65 74 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Set || db->mallo
dbc0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
dbd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
dbe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
dbf0: 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 70  abList!=0 );.  p
dc00: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
dc10: 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61  et = 1;.  fullNa
dc20: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
dc30: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
dc40: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68  lNames)!=0;.  sh
dc50: 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ortNames = (db->
dc60: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
dc70: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
dc80: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
dc90: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c  etNumCols(v, pEL
dca0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66  ist->nExpr);.  f
dcb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
dcc0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
dcd0: 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
dce0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
dcf0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
dd00: 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f  NEVER(p==0) ) co
dd10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
dd20: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
dd30: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
dd40: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
dd50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
dd60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
dd70: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
dd80: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
dd90: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ame, SQLITE_TRAN
dda0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
ddb0: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
ddc0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d  COLUMN || p->op=
ddd0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
dde0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
ddf0: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
de00: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
de10: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
de20: 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  mn;.      for(j=
de30: 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62  0; ALWAYS(j<pTab
de40: 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b  List->nSrc); j++
de50: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
de60: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
de70: 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65  ursor==p->iTable
de80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
de90: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
dea0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
deb0: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
dec0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
ded0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
dee0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
def0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
df00: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
df10: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
df20: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
df30: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
df40: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
df50: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
df60: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
df70: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
df80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
df90: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
dfa0: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
dfb0: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
dfc0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  es ){.        sq
dfd0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
dfe0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
dff0: 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20  E_NAME, .       
e000: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
e010: 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
e020: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51  >a[i].zSpan), SQ
e030: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
e040: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
e050: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
e060: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
e070: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
e080: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
e090: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
e0a0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
e0b0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
e0c0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
e0d0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
e0e0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
e0f0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
e100: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e110: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e120: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
e130: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
e140: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
e150: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
e160: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e170: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
e180: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
e190: 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
e1a0: 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
e1b0: 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
e1c0: 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
e1d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
e1e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e1f0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
e200: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
e210: 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
e220: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
e230: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
e240: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
e250: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
e260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
e270: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
e280: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
e290: 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
e2a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
e2b0: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
e2c0: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
e2d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
e2e0: 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
e2f0: 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
e300: 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
e310: 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
e320: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
e330: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
e340: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
e350: 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
e360: 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
e370: 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
e380: 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
e390: 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
e3a0: 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
e3b0: 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
e3c0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
e3d0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
e3e0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
e3f0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
e400: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
e410: 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
e420: 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
e430: 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
e440: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
e450: 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  NOMEM..*/.int sq
e460: 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
e470: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
e480: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e490: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e4a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
e4b0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
e4c0: 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74      /* Expr list
e4d0: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64   from which to d
e4e0: 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  erive column nam
e4f0: 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43  es */.  i16 *pnC
e500: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
e510: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
e520: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68  ber of columns h
e530: 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  ere */.  Column 
e540: 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20  **paCol         
e550: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65   /* Write the ne
e560: 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65  w column list he
e570: 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
e580: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e590: 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61  >db;   /* Databa
e5a0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
e5b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e5d0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
e5e0: 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20  */.  u32 cnt;   
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20   /* Index added 
e610: 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65  to make the name
e620: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c   unique */.  Col
e630: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c  umn *aCol, *pCol
e640: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
e650: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73  looping over res
e660: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
e670: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e690: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
e6a0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
e6b0: 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  set */.  Expr *p
e6c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e6d0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
e6e0: 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  on for a single 
e6f0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
e700: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e720: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
e730: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e750: 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69  * Size of name i
e760: 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48  n zName[] */.  H
e770: 61 73 68 20 68 74 3b 20 20 20 20 20 20 20 20 20  ash ht;         
e780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
e790: 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75  sh table of colu
e7a0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73  mn names */..  s
e7b0: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
e7c0: 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ht);.  if( pELis
e7d0: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
e7e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
e7f0: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
e800: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
e810: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
e820: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
e830: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
e840: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
e850: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
e860: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  l = 0;.  }.  ass
e870: 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29  ert( nCol==(i16)
e880: 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c  nCol );.  *pnCol
e890: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f   = nCol;.  *paCo
e8a0: 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72  l = aCol;..  for
e8b0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
e8c0: 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e   i<nCol && !db->
e8d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b  mallocFailed; i+
e8e0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
e8f0: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
e900: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
e910: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
e920: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
e930: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
e940: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
e950: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  pr);.    if( (zN
e960: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
e970: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
e980: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
e990: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
e9a0: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
e9b0: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
e9c0: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
e9d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e9e0: 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72    Expr *pColExpr
e9f0: 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78   = p;  /* The ex
ea00: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
ea10: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
ea20: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
ea30: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
ea40: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61        /* Table a
ea50: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
ea60: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
ea70: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
ea80: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
ea90: 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70  DOT ){.        p
eaa0: 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78  ColExpr = pColEx
eab0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
eac0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
ead0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
eae0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f   }.      if( pCo
eaf0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
eb00: 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70  LUMN && ALWAYS(p
eb10: 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30  ColExpr->pTab!=0
eb20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
eb30: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20  For columns use 
eb40: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
eb50: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
eb60: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45  int iCol = pColE
eb70: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
eb80: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f        pTab = pCo
eb90: 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  lExpr->pTab;.   
eba0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
ebb0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
ebc0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e  PKey;.        zN
ebd0: 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  ame = iCol>=0 ? 
ebe0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
ebf0: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
ec00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ec10: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
ec20: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
ec30: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
ec40: 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
ec50: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
ec60: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
ec70: 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  e = pColExpr->u.
ec80: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  zToken;.      }e
ec90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
eca0: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
ecb0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
ecc0: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
ecd0: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
ece0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
ecf0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
ed00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ed10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
ed20: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
ed30: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20  %s", zName);..  
ed40: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
ed50: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
ed60: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
ed70: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
ed80: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
ed90: 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
eda0: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
edb0: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
edc0: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
edd0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
ede0: 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71  ile( zName && sq
edf0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 68  lite3HashFind(&h
ee00: 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  t, zName)!=0 ){.
ee10: 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71        nName = sq
ee20: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
ee30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
ee40: 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20  nName>0 ){.     
ee50: 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31     for(j=nName-1
ee60: 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33  ; j>0 && sqlite3
ee70: 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d  Isdigit(zName[j]
ee80: 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20  ); j--){}.      
ee90: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d    if( zName[j]==
eea0: 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b  ':' ) nName = j;
eeb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
eec0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
eed0: 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a  rintf(db, "%.*z:
eee0: 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  %u", nName, zNam
eef0: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
ef00: 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c   if( cnt>3 ) sql
ef10: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
ef20: 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e  sizeof(cnt), &cn
ef30: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  t);.    }.    pC
ef40: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
ef50: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  e;.    sqlite3Co
ef60: 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72  lumnPropertiesFr
ef70: 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b  omName(0, pCol);
ef80: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  .    if( zName &
ef90: 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  & sqlite3HashIns
efa0: 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20  ert(&ht, zName, 
efb0: 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20  pCol)==pCol ){. 
efc0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
efd0: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ault(db);.    }.
efe0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
eff0: 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69  hClear(&ht);.  i
f000: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f010: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
f020: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
f030: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
f040: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
f050: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
f060: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f070: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
f080: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
f090: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
f0a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f0b0: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
f0c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f0d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
f0e0: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
f0f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
f100: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
f110: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
f120: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
f130: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
f140: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
f150: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
f160: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
f170: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
f180: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
f190: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
f1a0: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
f1b0: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
f1c0: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
f1d0: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
f1e0: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
f1f0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
f200: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
f210: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
f220: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
f230: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
f240: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
f250: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
f260: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
f270: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
f280: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f290: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
f2a0: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
f2b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
f2c0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
f2d0: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
f2e0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
f2f0: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
f300: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
f310: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
f320: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
f330: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
f340: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
f350: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
f360: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
f370: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
f380: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
f390: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
f3a0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
f3b0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
f3c0: 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c  m *a;.  u64 szAl
f3d0: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
f3e0: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
f3f0: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
f400: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
f410: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
f420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
f430: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
f440: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
f450: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
f460: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
f470: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
f480: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
f490: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
f4a0: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
f4b0: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
f4c0: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
f4d0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
f4e0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
f4f0: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
f500: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
f510: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  pCol++){.    con
f520: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
f530: 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20      int n, m;.  
f540: 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72    p = a[i].pExpr
f550: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
f560: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
f570: 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 43 6f 6c  , 0, 0, 0, &pCol
f580: 2d 3e 73 7a 45 73 74 29 3b 0a 20 20 20 20 73 7a  ->szEst);.    sz
f590: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
f5a0: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
f5b0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
f5c0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
f5d0: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20 26  .    if( zType &
f5e0: 26 20 28 6d 20 3d 20 73 71 6c 69 74 65 33 53 74  & (m = sqlite3St
f5f0: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 29 3e 30  rlen30(zType))>0
f600: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71   ){.      n = sq
f610: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43  lite3Strlen30(pC
f620: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
f630: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
f640: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
f650: 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  OrFree(db, pCol-
f660: 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a  >zName, n+m+2);.
f670: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
f680: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
f690: 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a   memcpy(&pCol->z
f6a0: 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65  Name[n+1], zType
f6b0: 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , m+1);.        
f6c0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
f6d0: 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50  = COLFLAG_HASTYP
f6e0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
f6f0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
f700: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
f710: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
f720: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
f730: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
f740: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
f750: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
f760: 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d  ( pColl && pCol-
f770: 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >zColl==0 ){.   
f780: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
f790: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
f7a0: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
f7b0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
f7c0: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
f7d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73   sqlite3LogEst(s
f7e0: 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zAll*4);.}../*.*
f7f0: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
f800: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
f810: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
f820: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
f830: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
f840: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
f850: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
f860: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
f870: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
f880: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
f890: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
f8a0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
f8b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
f8c0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
f8d0: 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
f8e0: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
f8f0: 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
f900: 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
f910: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
f920: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
f930: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
f940: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
f950: 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
f960: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
f970: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
f980: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
f990: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
f9a0: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
f9b0: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
f9c0: 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
f9d0: 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
f9e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
f9f0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
fa00: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
fa10: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
fa20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
fa30: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
fa40: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
fa50: 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
fa60: 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
fa70: 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
fa80: 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
fa90: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
faa0: 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
fab0: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
fac0: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
fad0: 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77   0;.  pTab->nRow
fae0: 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
faf0: 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
fb00: 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
fb10: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  ) );.  sqlite3Co
fb20: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
fb30: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
fb40: 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
fb50: 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
fb60: 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Col);.  sqlite3S
fb70: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
fb80: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
fb90: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
fba0: 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
fbb0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
fbc0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
fbd0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
fbe0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
fbf0: 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
fc00: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
fc10: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
fc20: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
fc30: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
fc40: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
fc50: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
fc60: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
fc70: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
fc80: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
fc90: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
fca0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73   in pParse..*/.s
fcb0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
fcc0: 4e 4c 49 4e 45 20 56 64 62 65 20 2a 61 6c 6c 6f  NLINE Vdbe *allo
fcd0: 63 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  cVdbe(Parse *pPa
fce0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
fcf0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
fd00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  = sqlite3VdbeCre
fd10: 61 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ate(pParse);.  i
fd20: 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64  f( v ) sqlite3Vd
fd30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fd40: 6e 69 74 2c 20 30 2c 20 31 29 3b 0a 20 20 69 66  nit, 0, 1);.  if
fd50: 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
fd60: 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74  vel==0.   && Opt
fd70: 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
fd80: 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49  (pParse->db,SQLI
fd90: 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
fda0: 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72  t).  ){.    pPar
fdb0: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
fdc0: 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  r = 1;.  }.  ret
fdd0: 75 72 6e 20 76 3b 0a 7d 0a 56 64 62 65 20 2a 73  urn v;.}.Vdbe *s
fde0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
fdf0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
fe00: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
fe10: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 65 74 75 72  ->pVdbe;.  retur
fe20: 6e 20 76 20 3f 20 76 20 3a 20 61 6c 6c 6f 63 56  n v ? v : allocV
fe30: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a  dbe(pParse);.}..
fe40: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
fe50: 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
fe60: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
fe70: 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
fe80: 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
fe90: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78  t and pOffset ex
fea0: 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d  pressions.  pLim
feb0: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68  it and pOffset h
fec0: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
fed0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
fee0: 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
fef0: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
ff00: 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
ff10: 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
ff20: 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
ff30: 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
ff40: 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
ff50: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
ff60: 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
ff70: 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
ff80: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
ff90: 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
ffa0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
ffb0: 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
ffc0: 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
ffd0: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
ffe0: 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
fff0: 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
10000 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
10010 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
10020 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
10030 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
10040 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
10050 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
10060 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
10070 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
10080 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e  mit and pOffset.
10090 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
100a0 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
100b0 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
100c0 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
100d0 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
100e0 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
100f0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
10100 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
10110 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
10120 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
10130 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
10140 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
10150 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
10160 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
10170 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
10180 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
10190 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
101a0 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
101b0 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
101c0 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
101d0 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70  f pLimit!=0 or p
101e0 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65  Offset!=0 do the
101f0 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
10200 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65   get.** redefine
10210 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  d.  The UNION AL
10220 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20  L operator uses 
10230 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f  this property to
10240 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65   force.** the re
10250 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  use of the same 
10260 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
10270 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73   registers acros
10280 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45  s multiple.** SE
10290 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
102a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
102b0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
102c0 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61  sters(Parse *pPa
102d0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
102e0 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56  int iBreak){.  V
102f0 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e  dbe *v = 0;.  in
10300 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  t iLimit = 0;.  
10310 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69  int iOffset;.  i
10320 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69  nt n;.  if( p->i
10330 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a  Limit ) return;.
10340 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d  .  /* .  ** "LIM
10350 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68  IT -1" always sh
10360 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54  ows all rows.  T
10370 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a  here is some.  *
10380 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62  * controversy ab
10390 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72  out what the cor
103a0 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68  rect behavior sh
103b0 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68  ould be..  ** Th
103c0 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
103d0 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72  entation interpr
103e0 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f  ets "LIMIT 0" to
103f0 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f   mean.  ** no ro
10400 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ws..  */.  sqlit
10410 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
10420 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
10430 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
10440 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d  0 || p->pLimit!=
10450 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  0 );.  if( p->pL
10460 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
10470 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
10480 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
10490 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
104a0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
104b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
104c0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
104d0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
104e0 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29  r(p->pLimit, &n)
104f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10500 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10510 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
10520 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
10530 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
10540 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
10550 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
10560 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10570 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
10580 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
10590 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
105a0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69  >nSelectRow>sqli
105b0 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
105c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
105d0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
105e0 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
105f0 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  n);.        p->s
10600 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69  elFlags |= SF_Fi
10610 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  xedLimit;.      
10620 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
10630 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10640 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
10650 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  imit, iLimit);. 
10660 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10670 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
10680 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
10690 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
106a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
106b0 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
106c0 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
106d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
106e0 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
106f0 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
10700 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10720 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
10730 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
10740 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
10750 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
10760 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
10770 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
10780 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
10790 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
107a0 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
107b0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
107c0 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
107d0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
107e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
107f0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
10800 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
10810 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10820 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
10830 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
10840 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
10850 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10860 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
10870 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
10880 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  t+1, iOffset);. 
10890 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
108a0 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
108b0 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ET"));.    }.  }
108c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
108d0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
108e0 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
108f0 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
10900 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
10910 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
10920 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
10930 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
10940 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
10950 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
10960 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
10970 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
10980 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
10990 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
109a0 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
109b0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
109c0 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
109d0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
109e0 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
109f0 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
10a00 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
10a10 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
10a20 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
10a40 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
10a50 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
10a60 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
10a70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
10a80 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
10a90 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
10aa0 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
10ab0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
10ac0 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
10ad0 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
10ae0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
10af0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
10b00 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43  ol>=0 );.  /* iC
10b10 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20  ol must be less 
10b20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  than p->pEList->
10b30 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73  nExpr.  Otherwis
10b40 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64  e an error would
10b50 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
10b60 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61  thrown during na
10b70 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e  me resolution an
10b80 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68  d we would not h
10b90 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20  ave gotten.  ** 
10ba0 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66  this far */.  if
10bb0 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57  ( pRet==0 && ALW
10bc0 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69  AYS(iCol<p->pELi
10bd0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
10be0 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
10bf0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
10c00 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
10c10 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
10c20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
10c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
10c40 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
10c50 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
10c60 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
10c70 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
10c80 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
10c90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
10ca0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
10cb0 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
10cc0 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
10cd0 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
10ce0 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
10cf0 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
10d00 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
10d10 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
10d20 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
10d30 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
10d40 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
10d50 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
10d60 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
10d70 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
10d80 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
10d90 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
10da0 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
10db0 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
10dc0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
10dd0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
10de0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
10df0 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
10e00 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
10e10 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
10e20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
10e30 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
10e40 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
10e50 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10e60 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
10e70 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
10e80 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
10e90 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
10ea0 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
10eb0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
10ec0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
10ed0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
10ee0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
10ef0 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
10f00 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
10f10 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
10f20 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
10f30 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
10f40 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
10f50 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
10f60 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
10f70 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
10f80 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
10f90 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
10fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10fb0 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
10fc0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
10fd0 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
10fe0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
10ff0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
11000 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
11010 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
11020 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
11030 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
11040 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11050 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
11060 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
11070 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
11080 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
11090 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
110a0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
110b0 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
110c0 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
110d0 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
110e0 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
110f0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
11100 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
11110 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
11120 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
11130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11140 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
11150 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
11160 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
11170 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
11180 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
11190 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
111a0 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
111b0 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
111c0 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
111d0 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
111e0 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
111f0 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
11220 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
11230 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
11240 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
11260 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
11280 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
11290 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
112a0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
112b0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
112c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
112d0 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
112e0 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
112f0 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
11300 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  >a[].fg.isRecurs
11310 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ive flag..**.** 
11320 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  The setup-query 
11330 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e  runs once to gen
11340 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c  erate an initial
11350 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61   set of rows tha
11360 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51  t go.** into a Q
11370 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77  ueue table.  Row
11380 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
11390 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74  from the Queue t
113a0 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f  able one by.** o
113b0 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78  ne.  Each row ex
113c0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
113d0 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20  ue is output to 
113e0 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65  pDest.  Then the
113f0 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61   single.** extra
11400 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e  cted row (now in
11410 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61   the iCurrent ta
11420 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65  ble) becomes the
11430 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
11440 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  ** recursive-tab
11450 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69  le for a recursi
11460 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54  ve-query run.  T
11470 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
11480 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
11490 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63  .** is added bac
114a0 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  k into the Queue
114b0 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e   table.  Then an
114c0 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74  other row is ext
114d0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
114e0 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65  e.** and the ite
114f0 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ration continues
11500 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
11510 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
11520 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
11530 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65  mpound query ope
11540 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74  rator is UNION t
11550 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  hen no duplicate
11560 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a   rows are ever.*
11570 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
11580 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
11590 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20    The iDistinct 
115a0 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f  table keeps a co
115b0 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a  py of all rows.*
115c0 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72  * that have ever
115d0 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
115e0 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61  nto Queue and ca
115f0 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20  uses duplicates 
11600 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64  to be.** discard
11610 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72  ed.  If the oper
11620 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c  ator is UNION AL
11630 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  L, then duplicat
11640 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  es are allowed..
11650 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ** .** If the qu
11660 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52  ery has an ORDER
11670 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65   BY, then entrie
11680 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74  s in the Queue t
11690 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e  able are kept in
116a0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64  .** ORDER BY ord
116b0 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  er and the first
116c0 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63   entry is extrac
116d0 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63  ted for each cyc
116e0 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20  le.  Without.** 
116f0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
11700 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
11710 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a  just a FIFO..**.
11720 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c  ** If a LIMIT cl
11730 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64  ause is provided
11740 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
11750 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72  tion stops after
11760 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68   LIMIT rows.** h
11770 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20  ave been output 
11780 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d  to pDest.  A LIM
11790 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73  IT of zero means
117a0 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f   to output no ro
117b0 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61  ws and a.** nega
117c0 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73  tive LIMIT means
117d0 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72   to output all r
117e0 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ows.  If there i
117f0 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54  s also an OFFSET
11800 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20   clause.** with 
11810 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
11820 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
11830 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20   OFFSET outputs 
11840 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61  are discarded ra
11850 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69  ther.** than bei
11860 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74  ng sent to pDest
11870 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75  .  The LIMIT cou
11880 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  nt does not begi
11890 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46  n until after OF
118a0 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76  FSET.** rows hav
118b0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a  e been skipped..
118c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
118d0 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
118e0 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72  siveQuery(.  Par
118f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11900 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
11910 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
11920 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
11930 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76   /* The recursiv
11940 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63  e SELECT to be c
11950 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
11960 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
11970 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
11980 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
11990 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
119a0 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
119b0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
119c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
119d0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
119e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
119f0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
11a00 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  r;  /* Number of
11a10 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
11a20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20  recursive table 
11a30 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
11a40 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
11a50 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
11a60 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
11a70 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
11a80 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
11a90 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  tup = p->pPrior;
11aa0 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20     /* The setup 
11ab0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61  query */.  int a
11ac0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
11ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
11ae0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
11af0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61   int addrCont, a
11b00 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f  ddrBreak;      /
11b10 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42  * CONTINUE and B
11b20 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a  REAK addresses *
11b30 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  /.  int iCurrent
11b40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11b50 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74    /* The Current
11b60 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
11b70 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20  regCurrent;     
11b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
11b90 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75  ister holding Cu
11ba0 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
11bb0 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20   int iQueue;    
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11bd0 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c  * The Queue tabl
11be0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74  e */.  int iDist
11bf0 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20  inct = 0;       
11c00 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72       /* To ensur
11c10 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73  e unique results
11c20 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69   if UNION */.  i
11c30 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46  nt eDest = SRT_F
11c40 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ifo;         /* 
11c50 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20  How to write to 
11c60 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63  Queue */.  Selec
11c70 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b  tDest destQueue;
11c80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
11c90 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e  ctDest targettin
11ca0 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  g the Queue tabl
11cb0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11ce0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
11cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11d00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
11d10 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  t code */.  Expr
11d20 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
11d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11d40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11d50 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
11d60 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20  it, *pOffset;   
11d70 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d      /* Saved LIM
11d80 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
11d90 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c  .  int regLimit,
11da0 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20   regOffset;     
11db0 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73   /* Registers us
11dc0 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20  ed by LIMIT and 
11dd0 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20  OFFSET */..  /* 
11de0 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61  Obtain authoriza
11df0 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63  tion to do a rec
11e00 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
11e10 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
11e20 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
11e30 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c  QLITE_RECURSIVE,
11e40 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
11e50 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73  rn;..  /* Proces
11e60 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  s the LIMIT and 
11e70 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20  OFFSET clauses, 
11e80 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f  if they exist */
11e90 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  .  addrBreak = s
11ea0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11eb0 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74  bel(v);.  comput
11ec0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
11ed0 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42  pParse, p, addrB
11ee0 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20  reak);.  pLimit 
11ef0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70  = p->pLimit;.  p
11f00 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
11f10 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20  set;.  regLimit 
11f20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72  = p->iLimit;.  r
11f30 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  egOffset = p->iO
11f40 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d  ffset;.  p->pLim
11f50 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20  it = p->pOffset 
11f60 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  = 0;.  p->iLimit
11f70 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20   = p->iOffset = 
11f80 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  0;.  pOrderBy = 
11f90 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
11fa0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75  /* Locate the cu
11fb0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
11fc0 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
11fd0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41   */.  for(i=0; A
11fe0 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53  LWAYS(i<pSrc->nS
11ff0 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rc); i++){.    i
12000 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67  f( pSrc->a[i].fg
12010 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a  .isRecursive ){.
12020 20 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d        iCurrent =
12030 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
12040 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  sor;.      break
12050 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12060 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
12070 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51  rs numbers for Q
12080 75 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63  ueue and Distinc
12090 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e  t.  The cursor n
120a0 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74  umber for.  ** t
120b0 68 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c  he Distinct tabl
120c0 65 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  e must be exactl
120d0 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68  y one greater th
120e0 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65  an Queue in orde
120f0 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53  r.  ** for the S
12100 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20  RT_DistFifo and 
12110 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65  SRT_DistQueue de
12120 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f  stinations to wo
12130 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20  rk. */.  iQueue 
12140 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
12150 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
12160 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65  K_UNION ){.    e
12170 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
12180 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ? SRT_DistQueue 
12190 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a  : SRT_DistFifo;.
121a0 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20      iDistinct = 
121b0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
121c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65    }else{.    eDe
121d0 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
121e0 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f  SRT_Queue : SRT_
121f0 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Fifo;.  }.  sqli
12200 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
12210 74 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44  t(&destQueue, eD
12220 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  est, iQueue);.. 
12230 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72   /* Allocate cur
12240 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74  sors for Current
12250 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73  , Queue, and Dis
12260 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43  tinct. */.  regC
12270 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73  urrent = ++pPars
12280 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
12290 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
122a0 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69  OP_OpenPseudo, i
122b0 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72  Current, regCurr
122c0 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66  ent, nCol);.  if
122d0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
122e0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
122f0 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  nfo = multiSelec
12300 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
12310 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
12320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12330 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
12340 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
12350 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
12360 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
12380 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
12390 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
123a0 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72  destQueue.pOrder
123b0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
123c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
123d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
123e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
123f0 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29  l, iQueue, nCol)
12400 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d  ;.  }.  VdbeComm
12410 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74  ent((v, "Queue t
12420 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69  able"));.  if( i
12430 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
12440 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
12450 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  0] = sqlite3Vdbe
12460 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
12470 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73  nEphemeral, iDis
12480 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70  tinct, 0);.    p
12490 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
124a0 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
124b0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68    }..  /* Detach
124c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
124d0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  ause from the co
124e0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
124f0 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
12500 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20   0;..  /* Store 
12510 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
12520 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69  he setup-query i
12530 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53  n Queue. */.  pS
12540 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  etup->pNext = 0;
12550 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
12560 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
12570 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65  etup, &destQueue
12580 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  );.  pSetup->pNe
12590 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63  xt = p;.  if( rc
125a0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72   ) goto end_of_r
125b0 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a  ecursive_query;.
125c0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  /* Find the n
125d0 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51  ext row in the Q
125e0 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20  ueue and output 
125f0 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64  that row */.  ad
12600 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
12610 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12620 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20  Rewind, iQueue, 
12630 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
12640 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
12650 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
12660 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75  next row in Queu
12670 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e  e over to Curren
12680 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  t */.  sqlite3Vd
12690 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
126a0 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74  ullRow, iCurrent
126b0 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63  ); /* To reset c
126c0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20  olumn cache */. 
126d0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
126e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
126f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
12700 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  umn, iQueue, pOr
12710 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
12720 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
12730 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
12740 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12750 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75  P_RowData, iQueu
12760 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  e, regCurrent);.
12770 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
12780 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
12790 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a  lete, iQueue);..
127a0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
127b0 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
127c0 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43  rrent */.  addrC
127d0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
127e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
127f0 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72   codeOffset(v, r
12800 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  egOffset, addrCo
12810 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  nt);.  selectInn
12820 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
12830 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75  , p->pEList, iCu
12840 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20  rrent,.      0, 
12850 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f  0, pDest, addrCo
12860 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  nt, addrBreak);.
12870 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29    if( regLimit )
12880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12890 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
128a0 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c  crJumpZero, regL
128b0 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29  imit, addrBreak)
128c0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
128d0 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
128e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
128f0 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
12900 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  );..  /* Execute
12910 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 53   the recursive S
12920 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65  ELECT taking the
12930 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43   single row in C
12940 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74  urrent as.  ** t
12950 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
12960 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
12970 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  . Store the resu
12980 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  lts in the Queue
12990 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
129a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
129b0 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73  gregate ){.    s
129c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
129d0 50 61 72 73 65 2c 20 22 72 65 63 75 72 73 69 76  Parse, "recursiv
129e0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
129f0 69 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  ies not supporte
12a00 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d");.  }else{.  
12a10 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
12a20 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
12a30 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
12a40 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61  estQueue);.    a
12a50 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
12a60 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50  ==0 );.    p->pP
12a70 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20  rior = pSetup;. 
12a80 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75   }..  /* Keep ru
12a90 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75  nning the loop u
12aa0 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69  ntil the Queue i
12ab0 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c  s empty */.  sql
12ac0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
12ad0 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
12ae0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
12af0 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
12b00 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
12b10 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
12b20 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
12b30 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
12b40 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
12b50 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
12b60 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
12b70 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
12b80 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
12b90 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  fset;.  return;.
12ba0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12bb0 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
12bc0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
12bd0 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
12be0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
12bf0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
12c00 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12c10 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12c20 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12c30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
12c40 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
12c50 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
12c60 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
12c70 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
12c80 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
12c90 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
12ca0 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
12cb0 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
12cc0 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
12cd0 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
12ce0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
12cf0 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
12d00 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
12d10 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
12d20 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
12d30 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
12d40 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
12d50 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
12d60 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
12d70 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
12d80 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
12d90 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
12da0 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
12db0 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
12dc0 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
12dd0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
12de0 2a 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20  **   (1) It has 
12df0 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53  no LIMIT or OFFS
12e00 45 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20  ET.**   (2) All 
12e10 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
12e20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
12e30 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
12e40 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74  Y clause.*/.stat
12e50 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
12e60 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73  ctValues(.  Pars
12e70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12e80 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12e90 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
12ea0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12eb0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
12ec0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
12ed0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
12ee0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
12ef0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
12f00 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
12f10 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ults */.){.  Sel
12f20 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69  ect *pPrior;.  i
12f30 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
12f40 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  nt rc = 0;.  ass
12f50 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
12f60 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
12f70 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73   );.  do{.    as
12f80 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
12f90 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b  s & SF_Values );
12fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12fb0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70  op==TK_ALL || (p
12fc0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
12fd0 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29  && p->pPrior==0)
12fe0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12ff0 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a  p->pLimit==0 );.
13000 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13010 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
13020 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
13030 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  t==0 || p->pELis
13040 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65  t->nExpr==p->pNe
13050 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  xt->pEList->nExp
13060 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r );.    if( p->
13070 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61  pPrior==0 ) brea
13080 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
13090 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d  ->pPrior->pNext=
130a0 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  =p );.    p = p-
130b0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f  >pPrior;.    nRo
130c0 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  w++;.  }while(1)
130d0 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
130e0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e      pPrior = p->
130f0 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
13100 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72  Prior = 0;.    r
13110 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
13120 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
13130 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  st);.    p->pPri
13140 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
13150 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
13160 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
13170 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70  ow = nRow;.    p
13180 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
13190 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
131a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
131b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
131c0 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
131d0 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
131e0 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
131f0 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
13200 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
13210 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
13220 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
13230 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
13240 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
13250 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
13260 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
13270 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
13280 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
13290 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
132a0 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
132b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
132c0 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
132d0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
132e0 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
132f0 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
13300 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
13310 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
13320 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
13330 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
13340 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
13350 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
13360 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
13370 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
13380 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
13390 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
133a0 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
133b0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
133c0 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
133d0 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
133e0 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
133f0 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
13400 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
13410 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
13420 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
13430 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
13440 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
13450 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
13460 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
13480 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13490 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
134a0 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
134b0 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
134c0 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
134d0 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
134e0 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
134f0 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
13500 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13510 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
13520 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
13530 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
13540 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
13550 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
13560 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
13570 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
13580 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
13590 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
135a0 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
135b0 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
135c0 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
135d0 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
135e0 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
135f0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
13600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
13610 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
13620 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13630 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13640 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
13650 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
13660 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
13670 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
13680 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
13690 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
136a0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
136b0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
136c0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
136d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
136e0 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
136f0 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
13700 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
13710 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
13720 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
13730 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
13740 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
13750 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
13760 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
13770 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
13780 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
13790 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
137a0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
137b0 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
137c0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
137d0 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
137e0 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
137f0 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
13800 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
13810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
13820 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13830 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
13840 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
13850 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b    int iSub1 = 0;
13860 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
13870 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
13880 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
13890 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ub2 = 0;        
138a0 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
138b0 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
138c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
138d0 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
138e0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
138f0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
13900 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
13910 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
13920 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
13930 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
13940 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
13950 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
13960 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
13970 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
13980 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
13990 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
139a0 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
139b0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  /.  assert( (p->
139c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
139d0 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70  cursive)==0 || p
139e0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
139f0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
13a00 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
13a10 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d  ->db;.  pPrior =
13a20 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65   p->pPrior;.  de
13a30 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69  st = *pDest;.  i
13a40 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
13a50 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
13a60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13a70 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
13a80 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
13a90 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
13aa0 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
13ab0 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
13ac0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
13ad0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
13ae0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
13af0 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
13b00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
13b10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
13b20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
13b30 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
13b40 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
13b50 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
13b60 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
13b70 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
13b80 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13b90 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
13ba0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13bb0 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
13bc0 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
13bd0 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
13be0 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
13bf0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
13c00 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
13c10 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
13c20 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
13c30 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
13c40 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
13c50 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
13c60 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13c70 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
13c80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13c90 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13ca0 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
13cb0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
13cc0 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
13cd0 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
13ce0 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68  ..  /* Special h
13cf0 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f  andling for a co
13d00 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
13d10 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73  at originates as
13d20 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
13d30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13d40 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75  selFlags & SF_Mu
13d50 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  ltiValue ){.    
13d60 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
13d70 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70  Values(pParse, p
13d80 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f  , &dest);.    go
13d90 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
13da0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
13db0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
13dc0 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
13dd0 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
13de0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
13df0 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
13e00 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
13e10 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13e20 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
13e30 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
13e40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13e50 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69  ist->nExpr==pPri
13e60 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
13e70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  r );..#ifndef SQ
13e80 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
13e90 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
13ea0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
13eb0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
13ec0 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
13ed0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
13ee0 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
13ef0 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
13f00 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
13f10 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
13f20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
13f30 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
13f40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
13f50 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
13f60 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
13f70 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
13f80 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
13f90 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  e..  /* Generate
13fa0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
13fb0 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
13fc0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
13fd0 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
13fe0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
13ff0 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
14000 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
14010 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
14020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14030 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
14040 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
14050 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  iLimit = p->iLim
14060 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
14070 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
14080 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50  Offset;.      pP
14090 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
140a0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
140b0 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
140c0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
140d0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
140e0 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
140f0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14100 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
14110 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
14120 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
14130 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
14140 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
14150 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
14160 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
14170 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
14180 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
14190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
141a0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
141b0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
141c0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
141d0 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
141e0 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
141f0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
14200 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
14210 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
14220 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14230 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69  _IfNot, p->iLimi
14240 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
14250 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
14260 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
14270 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
14280 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
14290 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66        if( p->iOf
142a0 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
142b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
142c0 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74  Op3(v, OP_Offset
142d0 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d     p->iLimit, p-
14300 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69  >iOffset+1, p->i
14310 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
14320 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14330 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14340 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
14350 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14360 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14370 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14380 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
14390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
143a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
143b0 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
143c0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
143d0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
143e0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  or;.      p->nSe
143f0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
14400 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
14410 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
14420 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
14430 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d       if( pPrior-
14440 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26  >pLimit.       &
14450 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
14460 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70  nteger(pPrior->p
14470 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a  Limit, &nLimit).
14480 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74         && nLimit
14490 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  >0 && p->nSelect
144a0 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67  Row > sqlite3Log
144b0 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29  Est((u64)nLimit)
144c0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
144d0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
144e0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
144f0 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20  ((u64)nLimit);. 
14500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14510 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
14520 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14530 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
14540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14550 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14560 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
14570 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
14580 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
14590 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
145a0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
145b0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
145c0 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
145d0 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20   */.      u8 op 
145e0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
145f0 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
14600 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
14610 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
14620 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
14630 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
14640 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
14650 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
14660 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
14670 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
14680 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
14690 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
146a0 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
146b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
146c0 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
146d0 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
146e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
146f0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
14700 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
14710 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
14720 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
14730 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
14740 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
14750 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
14760 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
14770 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
14780 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
14790 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
147a0 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
147b0 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
147c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
147d0 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
147e0 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
147f0 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
14800 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
14810 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14820 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
14830 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
14840 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
14850 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
14860 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
14870 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
14880 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14890 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
148a0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
148b0 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
148c0 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
148d0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
148e0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
148f0 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
14900 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
14910 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14920 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
14930 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
14940 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
14950 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14960 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
14970 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
14980 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
14990 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
149a0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
149b0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
149c0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
149d0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
149e0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
149f0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
14a00 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
14a10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14a20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
14a30 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
14a40 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
14a50 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
14a60 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
14a70 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
14a80 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
14a90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
14aa0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
14ab0 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
14ac0 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
14ad0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
14ae0 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
14af0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14b00 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
14b10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
14b20 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
14b30 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
14b40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
14b50 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14b60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
14b70 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
14b80 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
14b90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
14ba0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
14bb0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
14bc0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
14bd0 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
14be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14bf0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
14c00 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
14c10 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
14c20 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
14c30 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14c40 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
14c50 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
14c60 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14c70 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
14c80 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
14c90 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14ca0 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
14cb0 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
14cc0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
14cd0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
14ce0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
14cf0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
14d00 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
14d10 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
14d20 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
14d30 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
14d40 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
14d50 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
14d60 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
14d70 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
14d80 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
14d90 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
14da0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
14db0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
14dc0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
14dd0 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
14de0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
14df0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
14e00 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
14e10 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
14e20 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
14e30 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
14e40 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
14e50 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
14e60 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
14e70 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  N ){.        p->
14e80 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
14e90 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
14ea0 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
14eb0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
14ec0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14ed0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14ee0 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
14ef0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14f00 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
14f10 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
14f20 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
14f30 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
14f40 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
14f50 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  0;..      /* Con
14f60 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
14f70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
14f80 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
14f90 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
14fa0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
14fb0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
14fc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
14fd0 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
14fe0 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
14ff0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
15000 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  rOp );.      if(
15010 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
15020 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
15030 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
15040 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
15050 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
15060 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
15070 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
15080 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
15090 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
150a0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
150b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
150c0 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
150d0 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
150e0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
150f0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
15100 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 46 69  ames(pParse, pFi
15110 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73  rst->pSrc, pFirs
15120 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
15130 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
15140 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
15150 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15160 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
15170 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15180 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
15190 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
151a0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
151b0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
151c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
151d0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
151e0 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
151f0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
15200 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  ge(v);.        i
15210 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
15220 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15230 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
15240 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
15250 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
15260 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20   unionTab,.     
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
15290 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
152a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
152b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
152c0 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
152d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
152e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
152f0 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
15300 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
15310 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
15320 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15330 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
15340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15350 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15360 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
15370 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
15380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15390 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
153a0 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
153b0 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20  INTERSECT ); {. 
153c0 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
153d0 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
153e0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
153f0 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
15400 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
15410 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  et;.      int ad
15420 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
15430 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65  Dest intersectde
15440 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  st;.      int r1
15450 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
15460 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
15470 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
15480 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
15490 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
154a0 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
154b0 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
154c0 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
154d0 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
154e0 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
154f0 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
15500 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
15510 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
15520 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
15530 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
15540 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
15550 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
15560 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rBy==0 );..     
15570 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15580 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15590 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
155a0 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
155b0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
155c0 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
155d0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
155e0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
155f0 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69  dr;.      findRi
15600 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
15610 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
15620 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
15630 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15640 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
15650 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
15660 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
15670 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15680 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
15690 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
156a0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
156b0 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
156c0 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
156d0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
156e0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
156f0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
15700 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
15710 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
15720 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
15730 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
15740 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
15750 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
15760 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
15770 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
15780 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
15790 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
157a0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
157b0 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
157c0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
157d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
157e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
157f0 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
15800 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
15810 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
15820 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
15830 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
15840 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
15850 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
15860 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
15870 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
15880 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
15890 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
158a0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
158b0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
158c0 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
158d0 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
158e0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
158f0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
15900 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
15910 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
15920 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
15930 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
15940 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
15950 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
15960 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
15970 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
15980 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
15990 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
159a0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
159b0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
159c0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
159d0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
159e0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
159f0 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
15a00 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
15a10 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
15a20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
15a30 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
15a40 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
15a50 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
15a60 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
15a70 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
15a80 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
15a90 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
15aa0 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
15ab0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
15ac0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
15ad0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
15ae0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
15af0 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
15b00 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
15b10 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
15b20 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
15b30 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
15b40 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
15b50 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
15b60 65 73 28 70 50 61 72 73 65 2c 20 70 46 69 72 73  es(pParse, pFirs
15b70 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d  t->pSrc, pFirst-
15b80 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
15b90 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
15ba0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15bb0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
15bc0 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
15bd0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15be0 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
15bf0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
15c00 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
15c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15c20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15c30 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
15c40 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
15c50 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20  ge(v);.      r1 
15c60 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15c70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
15c80 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
15c90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15ca0 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62   OP_RowData, tab
15cb0 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  1, r1);.      sq
15cc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
15cd0 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
15ce0 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20  d, tab2, iCont, 
15cf0 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  r1, 0); VdbeCove
15d00 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
15d10 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15d20 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
15d30 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
15d40 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
15d50 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
15d60 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b1,.            
15d70 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
15d80 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
15d90 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
15da0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15db0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
15dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15dd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
15de0 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
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 73 71 6c 69 74 65  v);.      sqlite
15e10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15e20 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
15e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15e40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
15e50 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
15e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15e70 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
15e80 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
15e90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15ea0 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d   }..  explainCom
15eb0 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
15ec0 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
15ed0 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  b2, p->op!=TK_AL
15ee0 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  L);..  /* Comput
15ef0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
15f00 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
15f10 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
15f20 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
15f30 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
15f40 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
15f50 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
15f60 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
15f70 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
15f80 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
15f90 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
15fa0 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
15fb0 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
15fc0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
15fd0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
15fe0 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
15ff0 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
16000 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
16010 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
16020 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
16030 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
16040 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
16050 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
16060 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
16070 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
16080 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
16090 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
160a0 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
160b0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
160e0 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
160f0 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
16100 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
16110 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
16120 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
16130 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
16140 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
16150 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
16160 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
16170 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
16180 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
16190 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
161a0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
161b0 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
161c0 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
161d0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
16200 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
16210 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
16220 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
16230 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
16240 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
16250 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
16260 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
16270 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
16280 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
16290 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
162a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
162b0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
162c0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
162d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
162e0 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
162f0 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
16300 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
16310 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
16320 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
16330 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
16340 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
16350 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
16360 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
16370 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
16380 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
16390 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
163a0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
163b0 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
163c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
163d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
163e0 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
163f0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
16400 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
16410 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
16420 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
16430 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
16440 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
16450 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
16460 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
16470 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
16480 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
16490 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
164a0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
164b0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
164c0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
164d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
164e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
164f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16500 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
16510 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
16520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16530 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
16540 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
16550 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
16560 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16590 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
165a0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
165b0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
165c0 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
165d0 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
165e0 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
165f0 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
16600 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
16610 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
16620 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
16630 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
16640 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
16650 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
16660 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
16670 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
16680 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
16690 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
166a0 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
166b0 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
166c0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
166d0 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
166e0 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
166f0 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
16700 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
16710 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
16720 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
16730 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
16740 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
16750 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
16760 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16770 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
16780 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
16790 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
167a0 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
167b0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
167c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
167d0 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
167e0 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
167f0 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
16800 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
16810 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
16820 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
16830 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
16840 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
16850 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
16860 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
16870 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
16880 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
16890 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
168a0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
168b0 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
168c0 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
168d0 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
168e0 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
168f0 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
16900 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
16910 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
16920 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
16930 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
16940 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
16950 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
16960 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
16970 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
16980 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
16990 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
169a0 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
169b0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
169c0 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
169d0 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
169e0 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
169f0 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
16a00 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
16a10 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
16a20 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
16a30 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
16a40 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
16a50 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
16a60 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
16a70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
16a80 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
16a90 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
16aa0 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
16ab0 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
16ac0 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
16ad0 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
16ae0 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
16af0 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
16b00 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
16b10 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
16b20 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
16b30 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
16b40 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
16b50 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b70 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
16b80 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
16b90 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
16ba0 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
16bb0 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
16bc0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
16bd0 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
16be0 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
16bf0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
16c00 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
16c10 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
16c20 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
16c30 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
16c40 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
16c50 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
16c60 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
16c70 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
16c80 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
16c90 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
16ca0 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
16cb0 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
16cc0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
16cd0 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
16ce0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
16cf0 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
16d00 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
16d10 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
16d20 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
16d30 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
16d40 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
16d50 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
16d60 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
16d70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16d80 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
16d90 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
16da0 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
16db0 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
16dc0 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
16dd0 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
16de0 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
16df0 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
16e00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16e10 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
16e20 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
16e30 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
16e40 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
16e50 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
16e60 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
16e70 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
16e80 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ea0 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
16eb0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
16ec0 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
16ed0 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
16ee0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16ef0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
16f00 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
16f10 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
16f20 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
16f30 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16f40 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
16f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16f60 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
16f70 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
16f80 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
16f90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16fa0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16fb0 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
16fc0 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
16fd0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16fe0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
16ff0 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
17000 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
17010 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
17020 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
17030 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
17040 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
17050 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
17060 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
17070 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
17080 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
17090 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
170a0 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
170b0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
170c0 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
170d0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
170e0 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
170f0 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
17100 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17110 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
17120 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
17130 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17140 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17150 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
17160 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
17170 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
17180 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17190 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
171a0 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
171b0 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
171c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
171d0 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
171e0 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
171f0 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
17200 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17210 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
17220 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
17230 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
17240 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
17250 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
17260 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
17270 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17280 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
17290 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
172a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
172b0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
172c0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
172d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
172e0 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
172f0 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
17300 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
17310 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
17320 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
17330 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
17340 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
17350 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17360 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
17370 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
17380 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
17390 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
173a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
173b0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
173c0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
173d0 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
173e0 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
173f0 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
17400 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17410 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
17420 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
17430 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
17440 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
17450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17460 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
17470 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
17480 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20  Parm, r1,.      
17490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174a0 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c       pIn->iSdst,
174b0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
174c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
174d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
174e0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
174f0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
17500 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
17510 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
17520 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
17530 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
17540 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
17550 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
17560 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
17570 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
17580 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
17590 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
175a0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
175b0 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
175c0 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
175d0 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65  dst==1 || pParse
175e0 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73  ->nErr>0 );  tes
175f0 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
17600 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  t!=1 );.      sq
17610 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
17620 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17630 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  Sdst, pDest->iSD
17640 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
17650 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
17660 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
17670 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
17680 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
17690 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
176a0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
176b0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
176c0 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  Y */..    /* The
176d0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
176e0 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
176f0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  e of registers. 
17700 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
17710 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20  t pDest->iSdst. 
17720 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75   Then the co-rou
17730 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20  tine yields..   
17740 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
17750 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  _Coroutine: {.  
17760 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69      if( pDest->i
17770 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sdst==0 ){.     
17780 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
17790 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
177a0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  Range(pParse, pI
177b0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
177c0 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
177d0 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20  = pIn->nSdst;.  
177e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
177f0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
17800 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17810 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  st, pDest->iSdst
17820 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17830 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17840 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
17850 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
17860 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
17870 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17880 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
17890 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
178a0 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
178b0 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
178c0 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
178d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
178e0 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
178f0 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
17900 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
17910 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
17920 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
17930 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
17940 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
17950 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
17960 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
17970 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
17980 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
17990 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
179a0 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
179b0 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
179c0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
179d0 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
179e0 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
179f0 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
17a00 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
17a10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
17a20 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
17a30 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
17a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17a50 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
17a60 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  w, pIn->iSdst, p
17a70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17a80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17a90 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
17aa0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
17ab0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
17ac0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17ad0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
17ae0 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
17af0 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
17b00 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
17b10 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
17b20 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
17b30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17b40 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
17b50 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
17b60 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
17b70 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
17b80 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
17b90 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
17ba0 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
17bb0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17bc0 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
17bd0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17be0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
17bf0 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
17c00 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
17c10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
17c20 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
17c30 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
17c40 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
17c50 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
17c60 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
17c70 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
17c80 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
17c90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
17ca0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
17cb0 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
17cc0 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
17cd0 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
17ce0 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
17cf0 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
17d00 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
17d10 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
17d20 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
17d30 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
17d40 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
17d50 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
17d60 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
17d70 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
17d80 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
17d90 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
17da0 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
17db0 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
17dc0 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
17dd0 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
17de0 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
17df0 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
17e00 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
17e10 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
17e20 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
17e30 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
17e40 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
17e50 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
17e60 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
17e70 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
17e80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17e90 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
17ea0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
17eb0 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
17ec0 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
17ed0 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
17ee0 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
17ef0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
17f00 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
17f10 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
17f20 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
17f30 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
17f40 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
17f50 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
17f60 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
17f70 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
17f80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
17f90 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
17fa0 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
17fb0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17fc0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
17fd0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
17fe0 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
17ff0 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
18000 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
18010 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
18020 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
18030 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
18040 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
18050 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
18060 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
18070 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
18080 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
18090 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
180a0 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
180b0 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
180c0 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
180d0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
180e0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
180f0 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
18100 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
18110 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
18120 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
18130 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
18140 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
18150 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
18160 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
18170 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
18180 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
18190 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
181a0 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
181b0 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
181c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
181d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
181e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
181f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
18200 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
18210 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
18220 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
18230 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
18240 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
18250 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
18260 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
18270 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
18280 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
18290 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
182a0 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
182b0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
182c0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
182d0 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
182e0 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
182f0 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
18300 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
18310 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
18320 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
18330 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
18340 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
18350 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
18360 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
18370 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
18380 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
18390 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
183a0 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
183b0 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
183c0 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
183d0 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
183e0 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
183f0 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
18400 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
18410 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
18420 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
18430 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
18440 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
18450 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
18460 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
18470 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
18480 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
18490 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
184a0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
184b0 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
184c0 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
184d0 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
184e0 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
184f0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
18500 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
18510 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
18520 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
18530 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
18540 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
18550 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
18560 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
18570 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
18580 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
18590 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
185a0 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
185b0 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
185c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
185d0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
185e0 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
185f0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
18600 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
18610 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
18620 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
18630 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
18640 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
18650 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
18660 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
18670 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
18680 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
18690 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
186a0 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
186b0 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
186c0 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
186d0 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
186e0 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
186f0 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
18700 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
18710 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
18720 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
18730 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
18740 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
18750 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
18760 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
18770 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
18780 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
18790 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
187a0 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
187b0 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
187c0 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
187d0 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
187e0 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
187f0 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
18800 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
18810 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
18820 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
18830 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
18840 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
18850 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
18860 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
18870 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
18880 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
18890 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
188a0 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
188b0 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
188c0 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
188d0 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
188e0 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
188f0 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
18900 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
18910 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
18920 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
18930 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
18940 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
18950 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
18960 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
18970 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66   or EofB..*/.#if
18980 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18990 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
189a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
189b0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
189c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
189d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
189e0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
189f0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
18a00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
18a10 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
18a20 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
18a30 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
18a40 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
18a50 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
18a60 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
18a70 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
18a80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
18a90 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53   counters */.  S
18aa0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
18ab0 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
18ac0 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
18ad0 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
18ae0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
18af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
18b00 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
18b10 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
18b20 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20  ectDest destA;  
18b30 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
18b40 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
18b50 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  A */.  SelectDes
18b60 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20  t destB;     /* 
18b70 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
18b80 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20  coroutine B */. 
18b90 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20   int regAddrA;  
18ba0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18bb0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
18bc0 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
18bd0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  e */.  int regAd
18be0 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drB;         /* 
18bf0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
18c00 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f   for select-B co
18c10 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18c20 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
18c30 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18c40 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
18c50 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18c60 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
18c70 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18c80 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
18c90 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18ca0 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
18cb0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
18cc0 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
18cd0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
18ce0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
18cf0 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
18d00 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
18d10 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
18d20 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
18d30 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
18d40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18d50 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
18d60 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
18d70 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
18d80 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
18d90 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
18da0 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
18db0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
18dc0 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
18dd0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
18de0 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
18df0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18e00 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  int addrEofA_noB
18e10 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61  ;     /* Alterna
18e20 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42  te addrEofA if B
18e30 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   is uninitialize
18e40 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  d */.  int addrE
18e50 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
18e60 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
18e70 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
18e80 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
18e90 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
18ea0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18eb0 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
18ec0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18ed0 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
18ee0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18ef0 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
18f00 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18f10 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
18f20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18f30 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
18f40 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
18f50 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
18f60 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
18f70 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
18f80 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
18f90 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
18fa0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
18fb0 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
18fc0 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
18fd0 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
18fe0 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
18ff0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19000 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
19010 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
19020 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
19030 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
19040 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
19050 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
19060 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
19070 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
19080 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
19090 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
190a0 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
190b0 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
190c0 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
190d0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
190e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
190f0 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
19100 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  tmt */.  int add
19110 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  r1;            /
19120 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
19130 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
19140 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
19150 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
19160 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
19170 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
19180 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
19190 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
191a0 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20  Info *pKeyDup = 
191b0 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  0; /* Comparison
191c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
191d0 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
191e0 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
191f0 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
19200 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
19210 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
19220 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
19230 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
19240 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
19250 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
19260 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
19270 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
19280 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
19290 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
192a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
192b0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
192c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
192d0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
192e0 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
192f0 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
19300 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
19310 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
19320 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
19330 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
19340 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20  .  int iSub1;   
19350 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
19360 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  id of left-hand 
19370 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
19380 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20  Sub2;           
19390 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69   /* EQP id of ri
193a0 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  ght-hand query *
193b0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
193c0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  rt( p->pOrderBy!
193d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
193e0 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a  pKeyDup==0 ); /*
193f0 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20   "Managed" code 
19400 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63  needs this.  Tic
19410 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20  ket #3382. */.  
19420 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
19430 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
19440 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
19450 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
19460 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20   Already thrown 
19470 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42  the error if VDB
19480 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a  E alloc failed *
19490 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  /.  labelEnd = s
194a0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
194b0 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
194c0 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
194d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
194e0 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
194f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19500 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
19510 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
19520 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
19530 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
19540 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
19550 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
19560 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
19570 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
19580 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
19590 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
195a0 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
195b0 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
195c0 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
195d0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
195e0 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
195f0 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
19600 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
19610 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
19620 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
19630 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19640 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
19650 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
19660 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
19670 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
19680 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
19690 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
196a0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
196b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
196c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
196d0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
196e0 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
196f0 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
19700 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19710 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
19720 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19730 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
19740 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
19750 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
19760 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19770 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
19780 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
19790 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
197a0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
197b0 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
197c0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
197d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
197e0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
197f0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
19800 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
19810 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19820 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
19830 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
19840 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
19850 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
19860 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
19870 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
19880 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
19890 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78  [nOrderBy++].u.x
198a0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
198b0 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
198c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
198d0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
198e0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
198f0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
19900 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
19910 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
19920 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
19930 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
19940 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
19950 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
19960 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
19970 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
19980 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
19990 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
199a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
199b0 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
199c0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
199d0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
199e0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
199f0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
19a00 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
19a10 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
19a20 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
19a30 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
19a40 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
19a50 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72  sizeof(int)*(nOr
19a60 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69  derBy + 1));.  i
19a70 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
19a80 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
19a90 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
19aa0 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20      aPermute[0] 
19ab0 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = nOrderBy;.    
19ac0 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70  for(i=1, pItem=p
19ad0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e  OrderBy->a; i<=n
19ae0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
19af0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
19b00 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
19b10 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29  .iOrderByCol>0 )
19b20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19b30 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19b40 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  rByCol<=p->pELis
19b50 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
19b60 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
19b70 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19b80 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  rByCol - 1;.    
19b90 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
19ba0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
19bb0 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
19bc0 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c  se, p, 1);.  }el
19bd0 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
19be0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
19bf0 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
19c00 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
19c10 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
19c20 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
19c30 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
19c40 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
19c50 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
19c60 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
19c70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
19c80 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
19c90 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
19ca0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
19cb0 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
19cc0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
19cd0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
19ce0 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
19cf0 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
19d00 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
19d10 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
19d20 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
19d30 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
19d40 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
19d50 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
19d60 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
19d70 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
19d80 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
19d90 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
19da0 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
19db0 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
19dc0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
19dd0 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
19de0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
19df0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78  rse->nMem += nEx
19e00 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr+1;.    sqlite
19e10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19e20 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
19e30 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
19e40 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Dup = sqlite3Key
19e50 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
19e60 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  xpr, 1);.    if(
19e70 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
19e80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19e90 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
19ea0 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a  ble(pKeyDup) );.
19eb0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
19ec0 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
19ed0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
19ee0 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
19ef0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
19f00 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
19f10 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
19f20 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
19f30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19f40 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
19f50 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
19f60 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
19f70 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
19f80 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
19f90 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
19fa0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pNext = 0;.  sql
19fb0 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
19fc0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
19fd0 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
19fe0 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
19ff0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
1a000 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1a010 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
1a020 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
1a030 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
1a040 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
1a050 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
1a060 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
1a070 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
1a080 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
1a090 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
1a0a0 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
1a0b0 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
1a0c0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
1a0d0 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
1a0e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
1a0f0 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
1a100 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1a110 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a120 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
1a130 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
1a140 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
1a150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
1a180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a190 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1a1a0 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
1a1b0 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
1a1c0 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
1a1d0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
1a1e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
1a1f0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
1a200 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
1a210 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
1a220 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1a230 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
1a240 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
1a250 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
1a260 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a270 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
1a280 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1a290 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
1a2a0 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
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 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
1a2d0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1a2e0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
1a2f0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1a300 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1a310 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
1a320 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1a330 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
1a340 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1a350 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1a360 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1a370 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
1a380 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
1a390 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
1a3a0 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
1a3b0 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1a3c0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
1a3d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1a3e0 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1a3f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a400 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1a410 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c  ne, regAddrA, 0,
1a420 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
1a430 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1a440 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29   "left SELECT"))
1a450 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
1a460 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
1a470 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
1a480 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
1a490 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
1a4a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1a4b0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
1a4c0 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
1a4d0 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1a4e0 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1a4f0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1a500 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1a510 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  r1);..  /* Gener
1a520 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1a530 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1a540 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1a550 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
1a560 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
1a570 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
1a580 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
1a590 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1a5a0 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31  (v) + 1;.  addr1
1a5b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a5c0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
1a5d0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1a5e0 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rB, 0, addrSelec
1a5f0 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tB);.  VdbeComme
1a600 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45  nt((v, "right SE
1a610 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
1a620 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
1a630 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
1a640 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
1a650 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
1a660 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
1a670 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78  fset = 0;  .  ex
1a680 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
1a690 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
1a6a0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
1a6b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
1a6c0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
1a6d0 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
1a6e0 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
1a6f0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
1a700 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
1a710 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69  e3VdbeEndCorouti
1a720 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b  ne(v, regAddrB);
1a730 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a740 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1a750 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
1a760 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
1a770 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
1a780 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
1a790 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
1a7a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
1a7b0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1a7c0 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1a7d0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
1a7e0 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
1a7f0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
1a800 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
1a810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a820 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
1a830 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1a850 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
1a860 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
1a870 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1a880 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1a890 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
1a8a0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
1a8b0 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
1a8c0 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
1a8d0 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
1a8e0 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
1a8f0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1a900 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1a910 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
1a920 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
1a930 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
1a940 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
1a950 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
1a960 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
1a970 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1a980 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
1a990 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
1a9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a9b0 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
1a9c0 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
1a9d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49   }.  sqlite3KeyI
1a9e0 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70  nfoUnref(pKeyDup
1a9f0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1aa00 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1aa10 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1aa20 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1aa30 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
1aa40 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1aa50 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1aa60 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
1aa70 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43    if( op==TK_EXC
1aa80 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
1aa90 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1aaa0 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64  ddrEofA_noB = ad
1aab0 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e  drEofA = labelEn
1aac0 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  d;.  }else{  .  
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 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
1aaf0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1ab00 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
1ab10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ab20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1ab30 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1ab40 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1ab50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab60 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1ab70 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45  regAddrB, labelE
1ab80 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
1abb0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1abc0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1abd0 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
1abe0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1abf0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1ac00 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
1ac10 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1ac20 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Row);.  }..  /* 
1ac30 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1ac40 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1ac50 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1ac60 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
1ac70 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1ac80 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1ac90 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
1aca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1acb0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1acc0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1acd0 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66  addrEofA;.    if
1ace0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ( p->nSelectRow 
1acf0 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  > pPrior->nSelec
1ad00 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
1ad10 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
1ad20 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c  SelectRow;.  }el
1ad30 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1ad40 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1ad50 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
1ad60 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
1ad70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1ad80 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1ad90 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1ada0 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
1adb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1adc0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1add0 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64  A, labelEnd); Vd
1ade0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1adf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1ae00 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b  to(v, addrEofB);
1ae10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1ae20 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1ae30 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1ae40 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
1ae50 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1ae60 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
1ae70 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
1ae80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ae90 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1aea0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1aeb0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
1aec0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1aed0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1aee0 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
1aef0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1af00 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1af10 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1af20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1af30 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1af40 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
1af50 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1af60 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
1af70 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1af80 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
1af90 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1afa0 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1afb0 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
1afc0 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
1afd0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1afe0 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
1aff0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1b000 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
1b010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b020 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b030 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1b040 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1b050 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1b060 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1b070 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20  belCmpr);.  }.. 
1b080 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1b090 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1b0a0 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f  case of A>B.  */
1b0b0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1b0c0 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73  nt((v, "A-gt-B s
1b0d0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1b0e0 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74  addrAgtB = sqlit
1b0f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1b100 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r(v);.  if( op==
1b110 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
1b120 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  _UNION ){.    sq
1b130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b140 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1b150 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1b160 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1b170 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b180 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1b190 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1b1a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b1b0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b1c0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1b1d0 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e  /* This code run
1b1e0 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  s once to initia
1b1f0 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e  lize everything.
1b200 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1b210 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1b220 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr1);.  sqlite3
1b230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b240 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1b250 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b  , addrEofA_noB);
1b260 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b270 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1b280 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1b290 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1b2a0 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1b2b0 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  rage(v);..  /* I
1b2c0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
1b2d0 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
1b2e0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1b2f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1b300 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
1b310 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1b320 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
1b330 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1b340 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
1b350 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
1b360 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b370 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
1b380 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
1b390 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
1b3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b3b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1b3c0 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
1b3d0 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
1b3e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1b3f0 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
1b400 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b410 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
1b420 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
1b430 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
1b440 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b450 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
1b460 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
1b470 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
1b480 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
1b490 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1b4a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1b4b0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
1b4c0 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
1b4d0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
1b4e0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
1b4f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1b500 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
1b510 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
1b520 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
1b530 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
1b540 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
1b550 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
1b560 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
1b570 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 46  Names(pParse, pF
1b580 69 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69 72  irst->pSrc, pFir
1b590 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st->pEList);.  }
1b5a0 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
1b5b0 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
1b5c0 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
1b5d0 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
1b5e0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
1b5f0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
1b600 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
1b610 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
1b620 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1b630 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
1b640 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
1b650 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70  or = pPrior;.  p
1b660 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
1b670 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20  ;..  /*** TBD:  
1b680 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e  Insert subroutin
1b690 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65  e calls to close
1b6a0 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f   cursors on inco
1b6b0 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75  mplete.  **** su
1b6c0 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20  bqueries ****/. 
1b6d0 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
1b6e0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
1b6f0 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30   iSub1, iSub2, 0
1b700 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  );.  return pPar
1b710 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23  se->nErr!=0;.}.#
1b720 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
1b730 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1b740 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1b750 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1b760 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61  T_VIEW)./* Forwa
1b770 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
1b780 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1b790 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c  ubstExprList(sql
1b7a0 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a  ite3*, ExprList*
1b7b0 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
1b7c0 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
1b7d0 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74  ubstSelect(sqlit
1b7e0 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69  e3*, Select *, i
1b7f0 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  nt, ExprList*, i
1b800 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  nt);../*.** Scan
1b810 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
1b820 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
1b830 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
1b840 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
1b850 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
1b860 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
1b870 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1b880 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
1b890 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
1b8a0 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
1b8b0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
1b8c0 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
1b8d0 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
1b8e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1b8f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
1b900 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
1b910 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
1b920 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
1b930 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
1b940 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
1b950 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
1b960 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
1b970 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
1b980 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
1b990 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1b9a0 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
1b9b0 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
1b9c0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
1b9d0 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
1b9e0 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
1b9f0 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
1ba00 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
1ba10 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
1ba20 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
1ba30 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
1ba40 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
1ba50 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
1ba60 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
1ba70 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
1ba80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1ba90 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1baa0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f  malloc errors to
1bab0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1bac0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1bad0 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  r,        /* Exp
1bae0 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74  r in which subst
1baf0 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a  itution occurs *
1bb00 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1bb10 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1bb20 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
1bb30 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1bb40 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53   *pEList    /* S
1bb50 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73  ubstitute expres
1bb60 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  sions */.){.  if
1bb70 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1bb80 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
1bb90 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1bba0 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
1bbb0 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
1bbc0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
1bbd0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1bbe0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
1bbf0 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
1bc00 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
1bc10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bc20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
1bc30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
1bc40 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1bc50 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1bc60 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
1bc70 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
1bc80 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
1bc90 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1bca0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  , pEList->a[pExp
1bcb0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1bcc0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
1bcd0 20 70 4e 65 77 20 26 26 20 28 70 45 78 70 72 2d   pNew && (pExpr-
1bce0 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d  >flags & EP_From
1bcf0 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
1bd00 20 70 4e 65 77 2d 3e 69 52 69 67 68 74 4a 6f 69   pNew->iRightJoi
1bd10 6e 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  nTable = pExpr->
1bd20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
1bd30 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
1bd40 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a  lags |= EP_FromJ
1bd50 6f 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oin;.      }.   
1bd60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1bd70 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
1bd80 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
1bd90 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  New;.    }.  }el
1bda0 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  se{.    pExpr->p
1bdb0 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
1bdc0 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
1bdd0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1bde0 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
1bdf0 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
1be00 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  r(db, pExpr->pRi
1be10 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
1be20 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ist);.    if( Ex
1be30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1be40 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1be50 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
1be60 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70  tSelect(db, pExp
1be70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54  r->x.pSelect, iT
1be80 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31 29  able, pEList, 1)
1be90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bea0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1beb0 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (db, pExpr->x.pL
1bec0 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
1bed0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1bee0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1bef0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1bf00 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73  bstExprList(.  s
1bf10 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1bf20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1bf30 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
1bf40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1bf50 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69  pList,     /* Li
1bf60 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
1bf70 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1bf80 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20  substitutes */. 
1bf90 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1bfa0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1bfb0 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
1bfc0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1bfd0 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
1bfe0 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
1bff0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1c000 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1c010 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1c020 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1c030 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
1c040 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
1c050 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1c060 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1c070 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1c080 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
1c090 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1c0a0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1c0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
1c0c0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1c0d0 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
1c0e0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1c0f0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1c100 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1c110 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1c120 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
1c130 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1c140 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
1c150 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
1c160 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f  st *pEList,    /
1c170 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
1c180 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50  ues */.  int doP
1c190 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a  rior          /*
1c1a0 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20   Do substitutes 
1c1b0 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f  on p->pPrior too
1c1c0 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1c1d0 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1c1e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1c1f0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1c200 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1c210 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73  ;.  do{.    subs
1c220 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1c230 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
1c240 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
1c250 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1c260 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61  p->pGroupBy, iTa
1c270 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1c280 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1c290 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
1c2a0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1c2b0 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
1c2c0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1c2d0 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
1c2e0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1c2f0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1c300 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
1c310 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70  Where, iTable, p
1c320 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 53 72 63  EList);.    pSrc
1c330 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
1c340 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
1c350 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  );.    for(i=pSr
1c360 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
1c370 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
1c380 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c390 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
1c3a0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1c3b0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1c3c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
1c3d0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
1c3e0 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
1c3f0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1c400 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
1c410 41 72 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  Arg, iTable, pEL
1c420 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
1c430 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f    }.  }while( do
1c440 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d  Prior && (p = p-
1c450 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d  >pPrior)!=0 );.}
1c460 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
1c470 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1c480 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1c490 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1c4a0 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20  T_VIEW) */..#if 
1c4b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1c4c0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1c4d0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1c4e0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
1c4f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c500 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
1c510 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61  ten subqueries a
1c520 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
1c530 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  optimization..**
1c540 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1c550 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
1c560 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
1c570 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
1c580 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ng occurs..**.**
1c590 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
1c5a0 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
1c5b0 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
1c5c0 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
1c5d0 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
1c5e0 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
1c5f0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
1c600 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
1c610 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
1c620 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
1c630 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
1c640 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
1c650 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
1c660 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
1c670 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
1c680 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
1c690 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
1c6a0 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
1c6b0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c6c0 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
1c6d0 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
1c6e0 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
1c6f0 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
1c700 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
1c710 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
1c720 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
1c730 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
1c740 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
1c750 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
1c760 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
1c770 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
1c780 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c790 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
1c7a0 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
1c7b0 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
1c7c0 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
1c7d0 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
1c7e0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1c7f0 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
1c800 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1c810 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
1c820 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
1c830 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
1c840 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67  simplification g
1c850 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65  ives the same re
1c860 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79  sult.** but only
1c870 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65   has to scan the
1c880 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64   data once.  And
1c890 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73   because indices
1c8a0 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74   might .** exist
1c8b0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31   on the table t1
1c8c0 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61  , a complete sca
1c8d0 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69  n of the data mi
1c8e0 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65  ght be.** avoide
1c8f0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e  d..**.** Flatten
1c900 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ing is only atte
1c910 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20  mpted if all of 
1c920 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
1c930 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
1c940 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
1c950 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1c960 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1c970 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  h use aggregates
1c980 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54  ..**.**   (2)  T
1c990 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1c9a0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1c9b0 6f 72 20 28 32 61 29 20 74 68 65 20 6f 75 74 65  or (2a) the oute
1c9c0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1c9d0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
1c9e0 61 6e 64 20 28 32 62 29 20 74 68 65 20 6f 75 74  and (2b) the out
1c9f0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
1ca00 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65 73  t use subqueries
1ca10 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1ca20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 46 52  one.**        FR
1ca30 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1ca40 72 79 20 74 68 61 74 20 69 73 20 61 20 63 61 6e  ry that is a can
1ca50 64 69 64 61 74 65 20 66 6f 72 20 66 6c 61 74 74  didate for flatt
1ca60 65 6e 69 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a  ening.  (2b is.*
1ca70 2a 20 20 20 20 20 20 20 20 64 75 65 20 74 6f 20  *        due to 
1ca80 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37  ticket [2f7170d7
1ca90 33 62 66 39 61 62 66 38 30 5d 20 66 72 6f 6d 20  3bf9abf80] from 
1caa0 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a  2015-02-09.).**.
1cab0 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
1cac0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
1cad0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1cae0 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
1caf0 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  join.**        (
1cb00 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65  Originally ticke
1cb10 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74  t #306.  Strengt
1cb20 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20  hened by ticket 
1cb30 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28  #3300).**.**   (
1cb40 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1cb50 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
1cb60 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41  ..**.**  (**)  A
1cb70 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74  t one point rest
1cb80 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64  rictions (4) and
1cb90 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73   (5) defined a s
1cba0 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43  ubset of DISTINC
1cbb0 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d  T.**        sub-
1cbc0 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72  queries that wer
1cbd0 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
1cbe0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1cbf0 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a  n. Restriction .
1cc00 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61  **        (4) ha
1cc10 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70  s since been exp
1cc20 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65  anded to exclude
1cc30 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75   all DISTINCT su
1cc40 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  bqueries..**.** 
1cc50 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
1cc60 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1cc70 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
1cc80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1cc90 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1cca0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1ccb0 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
1ccc0 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
1ccd0 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
1cce0 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
1ccf0 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
1cd00 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
1cd10 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
1cd20 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68   FROM close with
1cd30 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
1cd40 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c         table sql
1cd50 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f  ite_once that co
1cd60 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67  nsists of a sing
1cd70 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  le row containin
1cd80 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69  g a.**        si
1cd90 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  ngle NULL..**.**
1cda0 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
1cdb0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1cdc0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1cdd0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1cde0 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
1cdf0 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
1ce00 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1ce10 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1ce20 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1ce30 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
1ce40 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1ce50 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69  **  (**)  Restri
1ce60 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72  ction (10) was r
1ce70 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1ce80 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d  code on 2005-02-
1ce90 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20  05 but we.**    
1cea0 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63      accidently c
1ceb0 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65  arried the comme
1cec0 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c  nt forward until
1ced0 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72   2014-09-15.  Or
1cee0 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  iginal.**       
1cef0 20 74 65 78 74 3a 20 22 54 68 65 20 73 75 62 71   text: "The subq
1cf00 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1cf10 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
1cf20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1cf30 0a 2a 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20  .**        does 
1cf40 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a  not use LIMIT.".
1cf50 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
1cf60 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1cf70 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1cf80 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
1cf90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
1cfa0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f  .**.**  (**)  No
1cfb0 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
1cfc0 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
1cfd0 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
1cfe0 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
1cff0 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
1d000 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
1d010 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
1d020 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
1d030 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
1d040 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
1d050 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1d060 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
1d070 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
1d080 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1d090 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  se OFFSET..**.**
1d0a0 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65    (15)  The oute
1d0b0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70  r query is not p
1d0c0 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
1d0d0 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a  d select or the.
1d0e0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
1d0f0 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
1d100 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
1d110 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
1d120 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
1d130 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
1d140 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
1d150 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
1d160 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1d170 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
1d180 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
1d190 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
1d1a0 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
1d1b0 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
1d1c0 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
1d1d0 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
1d1e0 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
1d1f0 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
1d200 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
1d210 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
1d220 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
1d230 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
1d240 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
1d250 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
1d260 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
1d270 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
1d280 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
1d290 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1d2a0 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
1d2b0 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
1d2c0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
1d2d0 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
1d2e0 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
1d2f0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
1d300 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1d310 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1d320 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
1d330 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
1d340 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f     * is not a jo
1d350 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  in.**.**        
1d360 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
1d370 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
1d380 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
1d390 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
1d3a0 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
1d3b0 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
1d3c0 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
1d3d0 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
1d3e0 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
1d3f0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
1d400 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62  lauses.  The sub
1d410 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65  query cannot use
1d420 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1d430 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1d440 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
1d450 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c  N ALL because al
1d460 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70  l the other comp
1d470 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1d480 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e  perators have an
1d490 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43   implied DISTINC
1d4a0 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c  T which is disal
1d4b0 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
1d4c0 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28     restriction (
1d4d0 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  4)..**.**       
1d4e0 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70   Also, each comp
1d4f0 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62  onent of the sub
1d500 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75  -query must retu
1d510 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  rn the same numb
1d520 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  er.**        of 
1d530 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
1d540 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79  This is actually
1d550 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66   a requirement f
1d560 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  or any compound.
1d570 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1d580 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
1d590 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72  all the code her
1d5a0 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  e does is make s
1d5b0 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20  ure that no.**  
1d5c0 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65        such (ille
1d5d0 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69  gal) sub-query i
1d5e0 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65  s flattened. The
1d5f0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74   caller will det
1d600 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ect the.**      
1d610 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61    syntax error a
1d620 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61  nd return a deta
1d630 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  iled message..**
1d640 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
1d650 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1d660 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1d670 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
1d680 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
1d690 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
1d6a0 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
1d6b0 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
1d6c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
1d6d0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
1d6e0 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1d6f0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
1d700 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1d710 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1d720 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1d730 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
1d740 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
1d750 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
1d760 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75   (20)  If the su
1d770 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1d780 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1d790 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75  en it must not u
1d7a0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  se.**        an 
1d7b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1d7c0 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20    Ticket #3773. 
1d7d0 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20   We could relax 
1d7e0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a  this constraint.
1d7f0 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68  **        somewh
1d800 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61  at by saying tha
1d810 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  t the terms of t
1d820 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1d830 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20  se must.**      
1d840 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f    appear as unmo
1d850 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f  dified result co
1d860 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74  lumns in the out
1d870 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77  er query.  But w
1d880 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  e.**        have
1d890 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
1d8a0 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20  ions in mind to 
1d8b0 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63  deal with that c
1d8c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29  ase..**.**  (21)
1d8d0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1d8e0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1d8f0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1d900 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
1d910 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
1d920 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
1d930 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
1d940 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62  *  (22)  The sub
1d950 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72  query is not a r
1d960 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a  ecursive CTE..**
1d970 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20 70  .**  (23)  The p
1d980 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72  arent is not a r
1d990 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72  ecursive CTE, or
1d9a0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1d9b0 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20  s not a.**      
1d9c0 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79    compound query
1d9d0 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  . This restricti
1d9e0 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72  on is because tr
1d9f0 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a  ansforming the.*
1da00 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20  *        parent 
1da10 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  to a compound qu
1da20 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65  ery confuses the
1da30 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c   code that handl
1da40 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63  es.**        rec
1da50 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69  ursive queries i
1da60 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e  n multiSelect().
1da70 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68  .**.**  (24)  Th
1da80 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1da90 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74  t an aggregate t
1daa0 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69  hat uses the bui
1dab0 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a  lt-in min() or .
1dac0 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78  **        or max
1dad0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28  () functions.  (
1dae0 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73  Without this res
1daf0 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72  triction, a quer
1db00 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20  y like:.**      
1db10 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d    "SELECT x FROM
1db20 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c   (SELECT max(y),
1db30 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75   x FROM t1)" wou
1db40 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  ld not necessari
1db50 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74  ly.**        ret
1db60 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20  urn the value X 
1db70 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20  for which Y was 
1db80 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a  maximal.).**.**.
1db90 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
1dba0 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
1dbb0 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
1dbc0 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
1dbd0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
1dbe0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
1dbf0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
1dc00 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1dc10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
1dc20 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
1dc30 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
1dc40 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1dc50 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1dc60 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1dc70 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1dc80 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
1dc90 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1dca0 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
1dcb0 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
1dcc0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
1dcd0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
1dce0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
1dcf0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
1dd00 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
1dd10 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
1dd20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
1dd30 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
1dd40 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
1dd50 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1dd60 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
1dd70 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
1dd80 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
1dd90 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
1dda0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1ddb0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1ddc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ddd0 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
1dde0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ddf0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1de00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1de10 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
1de20 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
1de30 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
1de40 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
1de50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
1de60 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
1de70 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1de80 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
1de90 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
1dea0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
1deb0 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
1dec0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1ded0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1dee0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1def0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1df00 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1df10 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
1df20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55      /* Current U
1df30 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66  NION ALL term of
1df40 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79   the other query
1df50 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1df60 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
1df70 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
1df80 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
1df90 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
1dfa0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1dfb0 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
1dfc0 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
1dfd0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1dfe0 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
1dff0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1e000 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1e010 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1e020 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
1e030 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1e040 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
1e050 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1e060 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
1e070 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1e080 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1e090 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
1e0a0 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
1e0b0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
1e0c0 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
1e0d0 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
1e0e0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1e0f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1e100 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
1e110 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e130 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1e140 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1e150 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
1e160 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
1e170 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
1e180 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e190 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ->db;..  /* Chec
1e1a0 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
1e1b0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1e1c0 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
1e1d0 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  f not..  */.  as
1e1e0 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
1e1f0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
1e200 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62  r==0 );  /* Unab
1e210 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f  le to flatten co
1e220 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a  mpound queries *
1e230 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
1e240 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1e250 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
1e260 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
1e270 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
1e280 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1e290 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
1e2a0 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
1e2b0 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
1e2c0 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
1e2d0 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
1e2e0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
1e2f0 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
1e300 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1e310 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
1e320 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71  =0 );.  if( subq
1e330 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1e340 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65 74   if( isAgg ) ret
1e350 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e370 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e380 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20  tion (1)   */.  
1e390 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
1e3a0 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1e3d0 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20  ction (2a)  */. 
1e3e0 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72     if( (p->pWher
1e3f0 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  e && ExprHasProp
1e400 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45  erty(p->pWhere,E
1e410 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20 20  P_Subquery)).   
1e420 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70    || (sqlite3Exp
1e430 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45  rListFlags(p->pE
1e440 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71 75  List) & EP_Subqu
1e450 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ery)!=0.     || 
1e460 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  (sqlite3ExprList
1e470 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42  Flags(p->pOrderB
1e480 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79  y) & EP_Subquery
1e490 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
1e4a0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e4e0 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20  ion (2b)  */.   
1e4f0 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53   }.  }.    .  pS
1e500 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1e510 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1e520 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1e530 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1e540 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1e550 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1e560 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1e570 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1e580 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1e590 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
1e5a0 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
1e5b0 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
1e5c0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
1e5d0 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
1e5e0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
1e5f0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
1e600 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1e610 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
1e620 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
1e630 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
1e640 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
1e650 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
1e660 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
1e670 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1e680 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
1e690 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e6b0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
1e6c0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1e6d0 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
1e6e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e700 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
1e710 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1e720 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
1e730 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
1e740 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
1e750 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e790 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
1e7a0 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1e7b0 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
1e7c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e7d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1e7e0 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
1e7f0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1e800 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1e810 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1e820 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1e830 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20  iction (5)  */. 
1e840 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1e850 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
1e860 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
1e870 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1e880 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1e890 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
1e8a0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1e8b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1e8c0 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
1e8d0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1e8e0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1e8f0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e900 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
1e910 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1e920 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1e930 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1e940 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1e980 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1e990 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1e9a0 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1e9b0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1e9c0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e9d0 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1e9e0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1e9f0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1ea00 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1ea10 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1ea20 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1ea30 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1ea40 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1ea50 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1ea60 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1ea70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1ea80 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1ea90 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
1eaa0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1eab0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
1eac0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  ;.  testcase( pS
1ead0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1eae0 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20  F_MinMaxAgg );. 
1eaf0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1eb00 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
1eb10 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67  ive|SF_MinMaxAgg
1eb20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1eb30 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1eb40 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29  ns (22) and (24)
1eb50 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1eb60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1eb70 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53  Recursive) && pS
1eb80 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1eb90 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1eba0 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20  estriction (23) 
1ebb0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53  */.  }..  /* OBS
1ebc0 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
1ebd0 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
1ebe0 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
1ebf0 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
1ec00 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1ec10 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
1ec20 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
1ec30 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1ec40 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
1ec50 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
1ec60 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
1ec70 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1ec80 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1ec90 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1eca0 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
1ecb0 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1ecc0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1ecd0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1ece0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1ecf0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1ed00 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
1ed10 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
1ed20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
1ed30 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
1ed40 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
1ed50 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
1ed60 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
1ed70 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1ed80 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1ed90 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1eda0 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
1edb0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1edc0 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
1edd0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
1ede0 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
1edf0 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1ee00 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1ee10 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1ee20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1ee30 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
1ee40 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
1ee50 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
1ee60 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
1ee70 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
1ee80 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1ee90 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
1eea0 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
1eeb0 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
1eec0 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
1eed0 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
1eee0 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
1eef0 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
1ef00 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
1ef10 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
1ef20 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
1ef30 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
1ef40 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
1ef50 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
1ef60 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
1ef70 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
1ef80 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
1ef90 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
1efa0 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1efb0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
1efc0 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
1efd0 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
1efe0 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
1eff0 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
1f000 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1f010 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
1f020 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1f030 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
1f040 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
1f050 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67  f( (pSubitem->fg
1f060 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
1f070 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
1f080 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1f090 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1f0a0 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  17: If the sub-q
1f0b0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1f0c0 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
1f0d0 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
1f0e0 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
1f0f0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
1f100 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
1f110 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
1f120 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
1f130 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
1f140 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
1f150 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
1f160 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
1f170 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
1f180 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1f190 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
1f1a0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1f1b0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
1f1c0 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
1f1d0 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d  tion 20 */.    }
1f1e0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
1f1f0 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1f200 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1f210 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
1f220 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
1f230 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
1f240 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
1f250 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
1f260 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
1f270 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1f280 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1f290 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1f2a0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
1f2b0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
1f2c0 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1f2d0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1f2e0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1f2f0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
1f300 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
1f310 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1f320 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
1f330 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
1f340 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
1f350 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
1f360 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
1f370 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1f380 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1f390 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
1f3a0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
1f3b0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
1f3c0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
1f3d0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
1f3e0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20  ->pSrc->nSrc<1. 
1f3f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1f400 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1f410 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
1f420 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
1f430 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
1f440 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f450 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66  on 18. */.    if
1f460 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
1f470 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
1f480 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1f490 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
1f4a0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1f4b0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
1f4c0 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
1f4d0 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
1f4e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1f4f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1f500 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
1f510 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
1f520 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1f530 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20  mitted. *****/. 
1f540 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
1f550 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65  Parse,p,("flatte
1f560 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72  n %s.%p from ter
1f570 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m %d\n",.       
1f580 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
1f590 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62  ->zSelName, pSub
1f5a0 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
1f5b0 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
1f5c0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
1f5d0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1f5e0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
1f5f0 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
1f600 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
1f610 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1f620 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1f630 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
1f640 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
1f650 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
1f660 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
1f670 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
1f680 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
1f690 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1f6a0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
1f6b0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
1f6c0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
1f6d0 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
1f6e0 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
1f6f0 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
1f700 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1f710 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
1f720 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
1f730 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1f740 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
1f750 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
1f760 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
1f770 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
1f780 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
1f790 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
1f7a0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1f7b0 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
1f7c0 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
1f7d0 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
1f7e0 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
1f7f0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1f800 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
1f810 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
1f820 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
1f830 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
1f840 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
1f850 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
1f860 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
1f870 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
1f880 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f890 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
1f8a0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
1f8b0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
1f8c0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
1f8d0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
1f8e0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1f8f0 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
1f900 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
1f910 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
1f920 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
1f930 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1f940 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
1f950 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1f960 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1f970 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
1f980 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
1f990 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
1f9a0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
1f9b0 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
1f9c0 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
1f9d0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
1f9e0 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
1f9f0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
1fa00 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1fa10 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
1fa20 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
1fa30 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1fa40 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1fa50 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
1fa60 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
1fa70 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
1fa80 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
1fa90 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
1faa0 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
1fab0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1fac0 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
1fad0 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
1fae0 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
1faf0 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
1fb00 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
1fb10 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
1fb20 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
1fb30 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1fb40 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
1fb50 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
1fb60 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20  Expr *pOffset = 
1fb70 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
1fb80 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
1fb90 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
1fba0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
1fbb0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
1fbc0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
1fbd0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
1fbe0 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  it = 0;.    p->p
1fbf0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
1fc00 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
1fc10 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30  lectDup(db, p, 0
1fc20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1fc30 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77  lectSetName(pNew
1fc40 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65  , pSub->zSelName
1fc50 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  );.    p->pOffse
1fc60 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
1fc70 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
1fc80 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
1fc90 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1fca0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
1fcb0 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
1fcc0 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
1fcd0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1fce0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1fcf0 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
1fd00 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
1fd10 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1fd20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
1fd30 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1fd40 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
1fd50 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
1fd60 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1fd70 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
1fd80 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
1fd90 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63  ,p,.         ("c
1fda0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1fdb0 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74   flattener creat
1fdc0 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
1fdd0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e  \n",.         pN
1fde0 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e  ew->zSelName, pN
1fdf0 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew));.    }.    
1fe00 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1fe10 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1fe20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1fe30 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1fe40 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
1fe50 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1fe60 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
1fe70 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
1fe80 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
1fe90 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1fea0 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
1feb0 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
1fec0 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
1fed0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1fee0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1fef0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
1ff00 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1ff10 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1ff20 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1ff30 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1ff40 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
1ff50 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1ff60 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1ff70 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
1ff80 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
1ff90 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
1ffa0 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
1ffb0 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
1ffc0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
1ffd0 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
1ffe0 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
1fff0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
20000 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
20010 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
20020 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
20030 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
20040 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
20050 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
20060 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
20070 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
20080 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
20090 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
200a0 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
200b0 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
200c0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
200d0 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
200e0 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
200f0 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
20100 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
20110 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
20120 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
20130 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
20140 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
20150 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
20160 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31  abToDel->nRef==1
20170 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
20180 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
20190 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
201a0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
201b0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
201c0 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
201d0 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
201e0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
201f0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
20200 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
20210 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
20220 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  oDel->nRef--;.  
20230 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
20240 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
20250 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
20260 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
20270 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
20280 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
20290 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
202a0 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
202b0 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
202c0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
202d0 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
202e0 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
202f0 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
20300 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
20310 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
20320 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
20330 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
20340 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
20350 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
20360 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
20370 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
20380 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
20390 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
203a0 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
203b0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
203c0 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
203d0 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
203e0 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
203f0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
20400 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
20410 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
20420 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
20430 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
20440 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
20450 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
20460 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
20470 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
20480 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
20490 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
204a0 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
204b0 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
204c0 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
204d0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
204e0 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
204f0 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
20500 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
20510 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
20520 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
20530 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
20540 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
20550 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
20560 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
20570 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
20580 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20      u8 jointype 
20590 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63  = 0;.    pSubSrc
205a0 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
205b0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
205c0 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
205d0 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
205e0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
205f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
20600 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
20610 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
20620 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
20630 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
20640 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
20650 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
20660 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
20670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20680 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
20690 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
206a0 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
206b0 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
206c0 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f   pSubitem->fg.jo
206d0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
206e0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
206f0 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
20700 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
20710 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
20720 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
20730 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
20740 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
20750 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
20760 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
20770 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
20780 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
20790 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
207a0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
207b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
207c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
207d0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
207e0 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
207f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
20800 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
20810 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
20820 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
20830 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
20840 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
20850 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
20860 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
20870 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
20880 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
20890 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
208a0 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
208b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
208c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
208d0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
208e0 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
208f0 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
20900 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
20910 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
20920 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
20930 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
20940 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
20950 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
20960 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
20970 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
20980 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
20990 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
209a0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
209b0 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
209c0 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
209d0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
209e0 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73  query FROM claus
209f0 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20  e to 4 slots..  
20a00 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20    ** The middle 
20a10 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
20a20 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
20a30 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
20a40 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20  pace.    ** for 
20a50 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73  the two elements
20a60 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
20a70 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
20a80 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
20a90 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
20aa0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20ab0 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71  pSrc = pSrc = sq
20ac0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
20ad0 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53  rge(db, pSrc, nS
20ae0 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29  ubSrc-1,iFrom+1)
20af0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
20b00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
20b10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20b20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20b30 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
20b40 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
20b50 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  rms from the sub
20b60 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
20b70 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
20b80 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
20b90 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
20ba0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
20bb0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
20bc0 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b  e(db, pSrc->a[i+
20bd0 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a  iFrom].pUsing);.
20be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
20bf0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66  rc->a[i+iFrom].f
20c00 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29  g.isTabFunc==0 )
20c10 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
20c20 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
20c30 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
20c40 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
20c50 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
20c60 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
20c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
20c80 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f  ->a[iFrom].fg.jo
20c90 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
20ca0 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
20cb0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
20cc0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
20cd0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
20ce0 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
20cf0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
20d00 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
20d10 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
20d20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
20d30 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
20d40 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
20d50 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
20d60 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
20d70 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
20d80 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
20d90 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
20da0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
20db0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
20dc0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
20dd0 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
20de0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
20df0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
20e00 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
20e10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20e20 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
20e30 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
20e40 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
20e50 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
20e60 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
20e70 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
20e80 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
20e90 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
20ea0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
20eb0 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
20ec0 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
20ed0 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50  /.    pList = pP
20ee0 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  arent->pEList;. 
20ef0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
20f00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
20f10 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  {.      if( pLis
20f20 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
20f30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
20f40 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
20f50 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c  3DbStrDup(db, pL
20f60 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
20f70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20f80 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
20f90 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
20fa0 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  a[i].zName = zNa
20fb0 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
20fc0 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
20fd0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
20fe0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
20ff0 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f  nt, any non-zero
21000 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c   iOrderByCol val
21010 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ues indicate tha
21020 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  t the.      ** O
21030 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65  RDER BY column e
21040 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65  xpression is ide
21050 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f  ntical to the iO
21060 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20  rderByCol'th.   
21070 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
21080 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
21090 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
210a0 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20  ub. Since these 
210b0 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
210c0 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  do not necessari
210d0 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ly correspond to
210e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45   columns in SELE
210f0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61  CT statement pPa
21100 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a  rent,.      ** z
21110 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20  ero them before 
21120 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20  transfering the 
21130 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
21140 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21150 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69  ** Not doing thi
21160 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65  s may cause an e
21170 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71  rror if a subseq
21180 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69  uent call to thi
21190 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
211a0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
211b0 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75  flatten a compou
211c0 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74  nd sub-query int
211d0 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20  o pParent.      
211e0 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79  ** (the only way
211f0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
21200 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f   is if the compo
21210 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73  und sub-query is
21220 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
21230 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62  tly part of pSub
21240 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63  ->pSrc). See tic
21250 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d  ket [d11a6e908f]
21260 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  .  */.      Expr
21270 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
21280 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
21290 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
212a0 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
212b0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
212c0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
212d0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
212e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
212f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21300 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
21310 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21320 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30   pSub->pPrior==0
21330 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
21340 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  t->pOrderBy = pO
21350 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
21360 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
21370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65  ;.    }.    pWhe
21380 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
21390 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
213a0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  here, 0);.    if
213b0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
213c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
213d0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
213e0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  g==0 );.      pP
213f0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
21400 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
21410 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21420 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
21430 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21440 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
21450 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 0a 20  e3ExprAnd(db, . 
21460 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21470 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
21480 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 2c 20 70  ->pHaving, 0), p
21490 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 0a  Parent->pHaving.
214a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
214b0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
214c0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
214d0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
214e0 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
214f0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
21500 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
21510 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
21520 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
21530 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
21540 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65  prAnd(db, pWhere
21550 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
21560 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75  e);.    }.    su
21570 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 50  bstSelect(db, pP
21580 61 72 65 6e 74 2c 20 69 50 61 72 65 6e 74 2c 20  arent, iParent, 
21590 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 30 29  pSub->pEList, 0)
215a0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
215b0 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
215c0 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
215d0 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
215e0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
215f0 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
21600 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
21610 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
21620 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
21630 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
21640 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
21650 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
21660 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
21670 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
21680 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
21690 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
216a0 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
216b0 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
216c0 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
216d0 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
216e0 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
216f0 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
21700 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
21710 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
21720 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
21730 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
21740 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
21750 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
21760 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
21770 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
21780 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
21790 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
217a0 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
217b0 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
217c0 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
217d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
217e0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
217f0 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c  pSub1);..#if SEL
21800 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
21810 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
21820 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
21830 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
21840 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
21850 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74  e,p,("After flat
21860 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20  tening:\n"));.  
21870 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
21880 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
21890 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
218a0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
218b0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
218c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
218d0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
218e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
218f0 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  W) */....#if !de
21900 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
21910 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
21920 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
21930 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
21940 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72  Make copies of r
21950 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c  elevant WHERE cl
21960 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68  ause terms of th
21970 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e  e outer query in
21980 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  to.** the WHERE 
21990 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
219a0 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ry.  Example:.**
219b0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
219c0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
219d0 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
219e0 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35  OM t1) WHERE x=5
219f0 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
21a00 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
21a10 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  o:.**.**    SELE
21a20 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
21a30 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
21a40 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   y FROM t1 WHERE
21a50 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29   a=5 AND c-d=10)
21a60 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d  .**     WHERE x=
21a70 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
21a80 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68  * The hope is th
21a90 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64  at the terms add
21aa0 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20  ed to the inner 
21ab0 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20  query will make 
21ac0 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63  it more.** effic
21ad0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  ient..**.** Do n
21ae0 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20  ot attempt this 
21af0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a  optimization if:
21b00 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65  .**.**   (1) The
21b10 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
21b20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 28  an aggregate.  (
21b30 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 77 65  In that case, we
21b40 27 64 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a  'd really want.*
21b50 2a 20 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20  *       to copy 
21b60 74 68 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d  the outer WHERE-
21b70 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74  clause terms ont
21b80 6f 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  o the HAVING cla
21b90 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  use of the.**   
21ba0 20 20 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e      inner query.
21bb0 20 20 42 75 74 20 74 68 65 79 20 70 72 6f 62 61    But they proba
21bc0 62 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74  bly won't help t
21bd0 68 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62  here so do not b
21be0 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  other.).**.**   
21bf0 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (2) The inner qu
21c00 65 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72  ery is the recur
21c10 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63  sive part of a c
21c20 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72  ommon table expr
21c30 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
21c40 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (3) The inner qu
21c50 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20  ery has a LIMIT 
21c60 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68  clause (since th
21c70 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
21c80 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20   WHERE.**       
21c90 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e  close would chan
21ca0 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f  ge the meaning o
21cb0 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a  f the LIMIT)..**
21cc0 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e  .**   (4) The in
21cd0 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
21ce0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
21cf0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
21d00 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20  (The caller.**  
21d10 20 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68       enforces th
21d20 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73  is restriction s
21d30 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
21d40 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  e does not have 
21d50 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20  enough.**       
21d60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b  information to k
21d70 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35  now.).**.**   (5
21d80 29 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  ) The WHERE clau
21d90 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  se expression or
21da0 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20  iginates in the 
21db0 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
21dc0 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61  se.**       of a
21dd0 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a   LEFT JOIN..**.*
21de0 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f  * Return 0 if no
21df0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
21e00 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  e and non-zero i
21e10 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  f one or more WH
21e20 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65  ERE clause.** te
21e30 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74  rms are duplicat
21e40 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71  ed into the subq
21e50 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
21e60 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72  int pushDownWher
21e70 65 54 65 72 6d 73 28 0a 20 20 73 71 6c 69 74 65  eTerms(.  sqlite
21e80 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
21e90 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
21ea0 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20  connection (for 
21eb0 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20 20 53  malloc()) */.  S
21ec0 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20  elect *pSubq,   
21ed0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
21ee0 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45  uery whose WHERE
21ef0 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65   clause is to be
21f00 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   augmented */.  
21f10 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
21f20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
21f30 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
21f40 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
21f50 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20    int iCursor   
21f60 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
21f70 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
21f80 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
21f90 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
21fa0 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20  nt nChng = 0;.  
21fb0 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 20 20 20  Select *pX;     
21fc0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
21fd0 70 69 6e 67 20 6f 76 65 72 20 63 6f 6d 70 6f 75  ping over compou
21fe0 6e 64 20 53 45 4c 45 43 54 73 20 69 6e 20 70 53  nd SELECTs in pS
21ff0 75 62 71 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ubq */.  if( pWh
22000 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ere==0 ) return 
22010 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70 53 75 62  0;.  for(pX=pSub
22020 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50  q; pX; pX=pX->pP
22030 72 69 6f 72 29 7b 0a 20 20 20 20 69 66 28 20 28  rior){.    if( (
22040 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  pX->selFlags & (
22050 53 46 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f  SF_Aggregate|SF_
22060 52 65 63 75 72 73 69 76 65 29 29 21 3d 30 20 29  Recursive))!=0 )
22070 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
22080 28 20 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( pX->selFlags &
22090 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b   SF_Aggregate );
220a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
220b0 20 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   pX->selFlags & 
220c0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
220d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
220e0 70 58 21 3d 70 53 75 62 71 20 29 3b 0a 20 20 20  pX!=pSubq );.   
220f0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
22100 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 29  restrictions (1)
22110 20 61 6e 64 20 28 32 29 20 2a 2f 0a 20 20 20 20   and (2) */.    
22120 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  }.  }.  if( pSub
22130 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a  q->pLimit!=0 ){.
22140 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
22150 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
22160 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   */.  }.  while(
22170 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f   pWhere->op==TK_
22180 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67  AND ){.    nChng
22190 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72   += pushDownWher
221a0 65 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62 71  eTerms(db, pSubq
221b0 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74  , pWhere->pRight
221c0 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  , iCursor);.    
221d0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d  pWhere = pWhere-
221e0 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66  >pLeft;.  }.  if
221f0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
22200 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d  y(pWhere,EP_From
22210 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
22220 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
22230 20 35 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69   5 */.  if( sqli
22240 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
22250 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69  nstant(pWhere, i
22260 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e  Cursor) ){.    n
22270 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  Chng++;.    whil
22280 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20  e( pSubq ){.    
22290 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
222a0 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65  ExprDup(db, pWhe
222b0 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  re, 0);.      pN
222c0 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ew = substExpr(d
222d0 62 2c 20 70 4e 65 77 2c 20 69 43 75 72 73 6f 72  b, pNew, iCursor
222e0 2c 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 29  , pSubq->pEList)
222f0 3b 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70  ;.      pSubq->p
22300 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
22310 78 70 72 41 6e 64 28 64 62 2c 20 70 53 75 62 71  xprAnd(db, pSubq
22320 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b  ->pWhere, pNew);
22330 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70  .      pSubq = p
22340 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  Subq->pPrior;.  
22350 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22360 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66   nChng;.}.#endif
22370 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
22380 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
22390 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
223a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
223b0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64   */../*.** Based
223c0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   on the contents
223d0 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20   of the AggInfo 
223e0 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
223f0 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ted by the first
22400 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  .** argument, th
22410 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
22420 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ks if the follow
22430 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
22440 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65  .**    * the que
22450 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74  ry contains just
22460 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67   a single aggreg
22470 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a  ate function,.**
22480 20 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67      * the aggreg
22490 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
224a0 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20  either min() or 
224b0 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20  max(), and.**   
224c0 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20   * the argument 
224d0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65  to the aggregate
224e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63   function is a c
224f0 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  olumn value..**.
22500 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
22510 20 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c   above are true,
22520 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45   then WHERE_ORDE
22530 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45  RBY_MIN or WHERE
22540 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20  _ORDERBY_MAX.** 
22550 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61  is returned as a
22560 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f  ppropriate. Also
22570 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73  , *ppMinMax is s
22580 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
22590 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61  he .** list of a
225a0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
225b0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65  to the aggregate
225c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
225d0 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  g..**.** Or, if 
225e0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  the conditions a
225f0 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74  bove are not met
22600 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73  , *ppMinMax is s
22610 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57  et to 0 and.** W
22620 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
22630 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MAL is returned.
22640 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
22650 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66  nMaxQuery(AggInf
22660 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70  o *pAggInfo, Exp
22670 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78  rList **ppMinMax
22680 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20  ){.  int eRet = 
22690 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
226a0 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f  RMAL;          /
226b0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
226c0 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d  /..  *ppMinMax =
226d0 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e   0;.  if( pAggIn
226e0 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a  fo->nFunc==1 ){.
226f0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
22700 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
22710 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41  c[0].pExpr; /* A
22720 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22730 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73  n */.    ExprLis
22740 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70  t *pEList = pExp
22750 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20  r->x.pList;     
22760 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
22770 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   agg function */
22780 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ..    assert( pE
22790 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
227a0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
227b0 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
227c0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26  List->nExpr==1 &
227d0 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  & pEList->a[0].p
227e0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
227f0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
22800 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
22810 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  nc = pExpr->u.zT
22820 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  oken;.      if( 
22830 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
22840 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20  Func, "min")==0 
22850 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
22860 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
22870 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MIN;.        *pp
22880 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
22890 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
228a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
228b0 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30  zFunc, "max")==0
228c0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74   ){.        eRet
228d0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
228e0 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70  _MAX;.        *p
228f0 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74  pMinMax = pEList
22900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22910 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
22920 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28  ppMinMax==0 || (
22930 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70  *ppMinMax)->nExp
22940 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  r==1 );.  return
22950 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   eRet;.}../*.** 
22960 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
22970 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
22980 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
22990 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  t is an aggregat
229a0 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  e query..** The 
229b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
229c0 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  is the associate
229d0 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f  d aggregate-info
229e0 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a   object. This .*
229f0 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73  * function tests
22a00 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69   if the SELECT i
22a10 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
22a20 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
22a30 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
22a40 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  >.**.** where ta
22a50 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73  ble is a databas
22a60 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73  e table, not a s
22a70 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
22a80 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a  w. If the query.
22a90 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68  ** does match th
22aa0 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e  is pattern, then
22ab0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
22ac0 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e Table object r
22ad0 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c  epresenting.** <
22ae0 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64  tbl> is returned
22af0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69  . Otherwise, 0 i
22b00 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
22b10 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53  tatic Table *isS
22b20 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63  impleCount(Selec
22b30 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70  t *p, AggInfo *p
22b40 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c  AggInfo){.  Tabl
22b50 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20  e *pTab;.  Expr 
22b60 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72  *pExpr;..  asser
22b70 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20  t( !p->pGroupBy 
22b80 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68  );..  if( p->pWh
22b90 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74  ere || p->pEList
22ba0 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c  ->nExpr!=1 .   |
22bb0 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21  | p->pSrc->nSrc!
22bc0 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61  =1 || p->pSrc->a
22bd0 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b  [0].pSelect.  ){
22be0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
22bf0 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70   }.  pTab = p->p
22c00 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
22c10 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
22c20 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
22c30 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20  .  assert( pTab 
22c40 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63  && !pTab->pSelec
22c50 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20  t && pExpr );.. 
22c60 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
22c70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
22c80 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
22c90 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
22ca0 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
22cb0 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e  if( NEVER(pAggIn
22cc0 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20  fo->nFunc==0) ) 
22cd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
22ce0 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  (pAggInfo->aFunc
22cf0 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  [0].pFunc->funcF
22d00 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43  lags&SQLITE_FUNC
22d10 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74  _COUNT)==0 ) ret
22d20 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
22d30 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73  pr->flags&EP_Dis
22d40 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
22d50 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  ;..  return pTab
22d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
22d70 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74  e source-list it
22d80 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  em passed as an 
22d90 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67  argument was aug
22da0 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a  mented with an.*
22db0 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
22dc0 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  use, then try to
22dd0 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63   locate the spec
22de0 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20  ified index. If 
22df0 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63  there.** was suc
22e00 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74  h a clause and t
22e10 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63  he named index c
22e20 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20  annot be found, 
22e30 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
22e40 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76  E_ERROR and leav
22e50 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
22e60 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  arse. Otherwise,
22e70 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46   populate .** pF
22e80 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20  rom->pIndex and 
22e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22ea0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22eb0 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
22ec0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
22ed0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22ee0 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
22ef0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26  ( pFrom->pTab &&
22f00 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64   pFrom->fg.isInd
22f10 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61  exedBy ){.    Ta
22f20 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
22f30 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
22f40 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  r *zIndexedBy = 
22f50 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pFrom->u1.zIndex
22f60 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20  edBy;.    Index 
22f70 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
22f80 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
22f90 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
22fa0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
22fb0 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
22fc0 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20  IndexedBy); .   
22fd0 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
22fe0 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
22ff0 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
23000 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23010 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
23020 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
23030 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b   zIndexedBy, 0);
23040 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
23050 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
23060 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23070 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
23080 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49  .    pFrom->pIBI
23090 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d  ndex = pIdx;.  }
230a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
230b0 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74  _OK;.}./*.** Det
230c0 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ect compound SEL
230d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
230e0 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52  hat use an ORDER
230f0 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20   BY clause with 
23100 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  .** an alternati
23110 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
23120 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  uence..**.**    
23130 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
23140 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
23150 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44   ... FROM t2 ORD
23160 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45  ER BY .. COLLATE
23170 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65   ....**.** These
23180 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61   are rewritten a
23190 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a  s a subquery:.**
231a0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
231b0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
231c0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
231d0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
231e0 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52  t2).**     ORDER
231f0 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20   BY ... COLLATE 
23200 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  ....**.** This t
23210 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
23220 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
23230 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65  se the multiSele
23240 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74  ctOrderBy() rout
23250 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61  ine.** above tha
23260 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  t generates the 
23270 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f  code for a compo
23280 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20  und SELECT with 
23290 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
232a0 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72  se.** uses a mer
232b0 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61  ge algorithm tha
232c0 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73  t requires the s
232d0 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ame collating se
232e0 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a  quence on the.**
232f0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
23300 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  as on the ORDER 
23310 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20  BY clause.  See 
23320 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f  ticket.** http:/
23330 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
23340 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34  src/info/6709574
23350 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  d2a.**.** This t
23360 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
23370 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72   only needed for
23380 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45   EXCEPT, INTERSE
23390 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a  CT, and UNION..*
233a0 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  * The UNION ALL 
233b0 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66  operator works f
233c0 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65  ine with multiSe
233d0 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76  lectOrderBy() ev
233e0 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65  en when.** there
233f0 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72   are COLLATE ter
23400 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
23410 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  BY..*/.static in
23420 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  t convertCompoun
23430 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
23440 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
23450 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
23460 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74   int i;.  Select
23470 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
23480 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20   *pX;.  sqlite3 
23490 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78  *db;.  struct Ex
234a0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
234b0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53    SrcList *pNewS
234c0 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rc;.  Parse *pPa
234d0 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  rse;.  Token dum
234e0 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50  my;..  if( p->pP
234f0 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
23500 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
23510 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
23520 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23530 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72  _Continue;.  for
23540 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58  (pX=p; pX && (pX
23550 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
23560 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pX->op==TK_SELEC
23570 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  T); pX=pX->pPrio
23580 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30  r){}.  if( pX==0
23590 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
235a0 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d  ntinue;.  a = p-
235b0 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20  >pOrderBy->a;.  
235c0 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42  for(i=p->pOrderB
235d0 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30  y->nExpr-1; i>=0
235e0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
235f0 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67  a[i].pExpr->flag
23600 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
23610 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
23620 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57  ( i<0 ) return W
23630 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20  RC_Continue;..  
23640 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
23650 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
23660 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66  means the transf
23670 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75  ormation is requ
23680 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72  ired. */..  pPar
23690 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
236a0 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
236b0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
236c0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
236d0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
236e0 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
236f0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
23700 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d  n WRC_Abort;.  m
23710 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c  emset(&dummy, 0,
23720 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b   sizeof(dummy));
23730 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c  .  pNewSrc = sql
23740 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
23750 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
23760 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e  ,0,0,0,&dummy,pN
23770 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70  ew,0,0);.  if( p
23780 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75  NewSrc==0 ) retu
23790 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
237a0 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d  *pNew = *p;.  p-
237b0 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b  >pSrc = pNewSrc;
237c0 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73  .  p->pEList = s
237d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
237e0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
237f0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
23800 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29  TK_ASTERISK, 0))
23810 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  ;.  p->op = TK_S
23820 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65  ELECT;.  p->pWhe
23830 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  re = 0;.  pNew->
23840 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
23850 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
23860 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  0;.  pNew->pOrde
23870 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50  rBy = 0;.  p->pP
23880 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rior = 0;.  p->p
23890 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  Next = 0;.  p->p
238a0 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73  With = 0;.  p->s
238b0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43  elFlags &= ~SF_C
238c0 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72  ompound;.  asser
238d0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
238e0 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d  & SF_Converted)=
238f0 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  =0 );.  p->selFl
23900 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72  ags |= SF_Conver
23910 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ted;.  assert( p
23920 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29  New->pPrior!=0 )
23930 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
23940 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
23950 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
23960 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66   0;.  pNew->pOff
23970 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  set = 0;.  retur
23980 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23990 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
239a0 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52 4f  o see if the FRO
239b0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46  M clause term pF
239c0 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61  rom has table-va
239d0 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  lued function.**
239e0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20   arguments.  If 
239f0 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61  it does, leave a
23a00 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
23a10 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
23a20 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
23a30 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73  , since pFrom is
23a40 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
23a50 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65  be a table-value
23a60 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  d function..*/.s
23a70 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74  tatic int cannot
23a80 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  BeFunction(Parse
23a90 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
23aa0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
23ab0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
23ac0 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  om->fg.isTabFunc
23ad0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
23ae0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
23af0 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66  "'%s' is not a f
23b00 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d  unction", pFrom-
23b10 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
23b20 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
23b30 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn 0;.}..#ifnde
23b40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
23b50 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  E./*.** Argument
23b60 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61   pWith (which ma
23b70 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74  y be NULL) point
23b80 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s to a linked li
23b90 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a  st of nested .**
23ba0 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20   WITH contexts, 
23bb0 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75  from inner to ou
23bc0 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20  termost. If the 
23bd0 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
23be0 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   by .** FROM cla
23bf0 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65  use element pIte
23c00 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f  m is really a co
23c10 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65  mmon-table-expre
23c20 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20  ssion (CTE) .** 
23c30 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
23c40 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45  inter to the CTE
23c50 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20   definition for 
23c60 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65  that table. Othe
23c70 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20  rwise.** return 
23c80 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
23c90 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
23ca0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74  is returned, set
23cb0 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70   *ppContext to p
23cc0 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68  oint to the With
23cd0 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
23ce0 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45  the returned CTE
23cf0 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a   belongs to..*/.
23d00 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74  static struct Ct
23d10 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20  e *searchWith(. 
23d20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65   /* Current inne
23d50 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  rmost WITH claus
23d60 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
23d70 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
23d80 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  m,     /* FROM c
23d90 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f  lause element to
23da0 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69   resolve */.  Wi
23db0 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20  th **ppContext  
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23dd0 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73   OUT: WITH claus
23de0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62  e return value b
23df0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a  elongs to */.){.
23e00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
23e10 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ame;.  if( pItem
23e20 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26  ->zDatabase==0 &
23e30 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d  & (zName = pItem
23e40 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
23e50 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20     With *p;.    
23e60 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20  for(p=pWith; p; 
23e70 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20  p=p->pOuter){.  
23e80 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
23e90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
23ea0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
23eb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
23ec0 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e  rICmp(zName, p->
23ed0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
23ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43  {.          *ppC
23ef0 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  ontext = p;.    
23f00 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d        return &p-
23f10 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
23f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23f30 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
23f40 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65  ../* The code ge
23f50 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e  nerator maintain
23f60 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74  s a stack of act
23f70 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73  ive WITH clauses
23f80 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e  .** with the inn
23f90 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  er-most WITH cla
23fa0 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65  use being at the
23fb0 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
23fc0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
23fd0 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65  utine pushes the
23fe0 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73   WITH clause pas
23ff0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
24000 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e  d argument.** on
24010 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  to the top of th
24020 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75  e stack. If argu
24030 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72  ment bFree is tr
24040 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ue, then this.**
24050 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c   WITH clause wil
24060 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65  l never be poppe
24070 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
24080 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
24090 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66  t.** should be f
240a0 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
240b0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
240c0 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73  . In other cases
240d0 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d  , when.** bFree=
240e0 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a  =0, the With obj
240f0 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ect will be free
24100 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
24110 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74   SELECT .** stat
24120 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68  ement with which
24130 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65   it is associate
24140 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
24150 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65  e3WithPush(Parse
24160 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a   *pParse, With *
24170 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29  pWith, u8 bFree)
24180 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65  {.  assert( bFre
24190 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d  e==0 || (pParse-
241a0 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61  >pWith==0 && pPa
241b0 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65  rse->pWithToFree
241c0 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57  ==0) );.  if( pW
241d0 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ith ){.    asser
241e0 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
241f0 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70  !=pWith );.    p
24200 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70  With->pOuter = p
24210 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
24220 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24230 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  = pWith;.    if(
24240 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65 2d   bFree ) pParse-
24250 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70  >pWithToFree = p
24260 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  With;.  }.}../*.
24270 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24280 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d   checks if argum
24290 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73  ent pFrom refers
242a0 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72   to a CTE declar
242b0 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48  ed by .** a WITH
242c0 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73   clause on the s
242d0 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d  tack currently m
242e0 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  aintained by the
242f0 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a   parser. And,.**
24300 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72   if currently pr
24310 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65  ocessing a CTE e
24320 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74  xpression, if it
24330 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a   is a recursive.
24340 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
24350 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e  the current CTE.
24360 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
24370 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65  falls into eithe
24380 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74  r of the two cat
24390 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70  egories above, p
243a0 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e  From->pTab.** an
243b0 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  d other fields a
243c0 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63  re populated acc
243d0 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61  ordingly. The ca
243e0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63  ller should chec
243f0 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61  k.** (pFrom->pTa
24400 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69  b!=0) to determi
24410 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
24420 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d  t a successful m
24430 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e  atch.** was foun
24440 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
24450 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20   or not a match 
24460 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45  is found, SQLITE
24470 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
24480 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f  if no error.** o
24490 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
244a0 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61  or does occur, a
244b0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
244c0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
244d0 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73  .** parser and s
244e0 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ome error code o
244f0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
24500 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
24510 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68  .static int with
24520 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72  Expand(.  Walker
24530 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74   *pWalker, .  st
24540 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
24550 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61  m *pFrom.){.  Pa
24560 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
24570 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
24580 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24590 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72  Parse->db;.  str
245a0 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20  uct Cte *pCte;  
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
245c0 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20  Matched CTE (or 
245d0 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68  NULL if no match
245e0 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  ) */.  With *pWi
245f0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
24600 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63         /* WITH c
24610 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20  lause that pCte 
24620 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
24630 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
24640 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43  pTab==0 );..  pC
24650 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28  te = searchWith(
24660 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70  pParse->pWith, p
24670 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20  From, &pWith);. 
24680 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20   if( pCte ){.   
24690 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
246a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
246b0 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
246c0 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74  pSel;.    Select
246d0 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
246e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
246f0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
24700 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
24710 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20   bMayRecursive; 
24720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
24730 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a  ue if compound j
24740 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b  oined by UNION [
24750 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68  ALL] */.    With
24760 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20   *pSavedWith;   
24770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
24780 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50  tial value of pP
24790 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a  arse->pWith */..
247a0 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e      /* If pCte->
247b0 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e  zCteErr is non-N
247c0 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ULL at this poin
247d0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  t, then this is 
247e0 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a  an illegal.    *
247f0 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  * recursive refe
24800 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74  rence to CTE pCt
24810 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f  e. Leave an erro
24820 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  r in pParse and 
24830 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61  return.    ** ea
24840 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43  rly. If pCte->zC
24850 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74  teErr is NULL, t
24860 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20  hen this is not 
24870 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  a recursive refe
24880 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e  rence..    ** In
24890 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63   this case, proc
248a0 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  eed.  */.    if(
248b0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29   pCte->zCteErr )
248c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
248d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
248e0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70  pCte->zCteErr, p
248f0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
24900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24910 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
24920 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75    if( cannotBeFu
24930 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  nction(pParse, p
24940 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53  From) ) return S
24950 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20  QLITE_ERROR;..  
24960 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
24970 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
24980 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
24990 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
249a0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
249b0 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
249c0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
249d0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
249e0 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  .    pTab->nRef 
249f0 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  = 1;.    pTab->z
24a00 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
24a10 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d  StrDup(db, pCte-
24a20 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
24a30 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
24a40 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
24a50 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
24a60 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
24a70 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
24a80 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
24a90 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
24aa0 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69  eral | TF_NoVisi
24ab0 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46  bleRowid;.    pF
24ac0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
24ad0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
24ae0 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
24af0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  t, 0);.    if( d
24b00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24b10 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24b20 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
24b30 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
24b40 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f  Select );..    /
24b50 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
24b60 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43  is a recursive C
24b70 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20  TE. */.    pSel 
24b80 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
24b90 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73  ;.    bMayRecurs
24ba0 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70  ive = ( pSel->op
24bb0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c  ==TK_ALL || pSel
24bc0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
24bd0 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
24be0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
24bf0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
24c00 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
24c10 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
24c20 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
24c30 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
24c40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
24c50 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24c60 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
24c70 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
24c80 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
24c90 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
24ca0 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
24cb0 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
24cc0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
24cd0 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
24ce0 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
24cf0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
24d00 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
24d10 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
24d20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69       pItem->fg.i
24d30 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a  sRecursive = 1;.
24d40 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
24d50 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
24d60 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
24d70 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65   |= SF_Recursive
24d80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24d90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
24da0 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72  * Only one recur
24db0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
24dc0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20  s permitted. */ 
24dd0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
24de0 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73  Ref>2 ){.      s
24df0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
24e00 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
24e10 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  , "multiple refe
24e20 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73  rences to recurs
24e30 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  ive table: %s", 
24e40 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pCte->zName.    
24e50 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
24e60 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
24e70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
24e80 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20  ( pTab->nRef==1 
24e90 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c  || ((pSel->selFl
24ea0 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65  ags&SF_Recursive
24eb0 29 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d  ) && pTab->nRef=
24ec0 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65  =2 ));..    pCte
24ed0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72  ->zCteErr = "cir
24ee0 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a  cular reference:
24ef0 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64   %s";.    pSaved
24f00 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70  With = pParse->p
24f10 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
24f20 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
24f30 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
24f40 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
24f50 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f 20  bMayRecursive ? 
24f60 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70  pSel->pPrior : p
24f70 53 65 6c 29 3b 0a 20 20 20 20 70 50 61 72 73 65  Sel);.    pParse
24f80 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
24f90 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
24fa0 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
24fb0 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
24fc0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
24fd0 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
24fe0 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
24ff0 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
25000 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
25010 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  & pEList->nExpr!
25020 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45  =pCte->pCols->nE
25030 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
25040 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
25050 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
25060 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66   has %d values f
25070 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a  or %d columns",.
25080 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65              pCte
25090 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d  ->zName, pEList-
250a0 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43  >nExpr, pCte->pC
250b0 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ols->nExpr.     
250c0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50     );.        pP
250d0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
250e0 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20  avedWith;.      
250f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25100 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
25110 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43       pEList = pC
25120 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d  te->pCols;.    }
25130 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ..    sqlite3Col
25140 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
25150 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
25160 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
25170 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
25180 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
25190 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
251a0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sel->selFlags & 
251b0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
251c0 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
251d0 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c  teErr = "multipl
251e0 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
251f0 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20  rences: %s";.   
25200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25210 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
25220 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
25230 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
25240 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
25250 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
25260 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
25270 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
25280 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45  .    pCte->zCteE
25290 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  rr = 0;.    pPar
252a0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
252b0 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72  edWith;.  }..  r
252c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
252d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
252e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
252f0 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  TE./*.** If the 
25300 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73  SELECT passed as
25310 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
25320 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f  ment has an asso
25330 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20  ciated WITH .** 
25340 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66  clause, pop it f
25350 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74  rom the stack st
25360 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
25370 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
25380 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
25390 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
253a0 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c   the xSelectCall
253b0 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b  back2() callback
253c0 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65   by.** sqlite3Se
253d0 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65  lectExpand() whe
253e0 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45  n walking a SELE
253f0 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c  CT tree to resol
25400 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  ve table.** name
25410 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d  s and other FROM
25420 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73   clause elements
25430 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
25440 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28  d selectPopWith(
25450 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
25460 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
25470 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
25480 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
25490 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20    With *pWith = 
254a0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
254b0 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66 28 20 70  ->pWith;.  if( p
254c0 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 61  With!=0 ){.    a
254d0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
254e0 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20  With==pWith );. 
254f0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
25500 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72   = pWith->pOuter
25510 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  ;.  }.}.#else.#d
25520 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57  efine selectPopW
25530 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ith 0.#endif../*
25540 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25550 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c   is a Walker cal
25560 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e  lback for "expan
25570 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73  ding" a SELECT s
25580 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78  tatement..** "Ex
25590 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74  panding" means t
255a0 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  o do the followi
255b0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ng:.**.**    (1)
255c0 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
255d0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
255e0 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
255f0 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
25600 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
25610 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
25620 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
25630 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
25640 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
25650 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
25660 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
25670 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
25680 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
25690 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
256a0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
256b0 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
256c0 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
256d0 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
256e0 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
256f0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
25700 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
25710 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
25720 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
25730 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
25740 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
25750 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
25760 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
25770 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
25780 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
25790 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
257a0 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
257b0 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
257c0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65  he persistent re
257d0 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
257e0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
257f0 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
25800 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
25810 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25820 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20   to accommodate 
25830 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
25840 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
25850 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
25860 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
25870 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
25880 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
25890 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
258a0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
258b0 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
258c0 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
258d0 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
258e0 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
258f0 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
25900 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
25910 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
25920 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
25930 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
25940 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
25950 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
25960 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
25970 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
25980 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73  n TABLE..**.*/.s
25990 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
259a0 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20  Expander(Walker 
259b0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
259c0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
259d0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
259e0 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  >pParse;.  int i
259f0 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73  , j, k;.  SrcLis
25a00 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
25a10 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
25a20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
25a30 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20  t_item *pFrom;. 
25a40 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
25a50 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
25a60 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20  r *pE, *pRight, 
25a70 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65  *pExpr;.  u16 se
25a80 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46  lFlags = p->selF
25a90 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46  lags;..  p->selF
25aa0 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
25ab0 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ded;.  if( db->m
25ac0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a  allocFailed  ){.
25ad0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
25ae0 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  bort;.  }.  if( 
25af0 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30  NEVER(p->pSrc==0
25b00 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26  ) || (selFlags &
25b10 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30   SF_Expanded)!=0
25b20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
25b30 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
25b40 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
25b50 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
25b60 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
25b70 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74  pWalker->xSelect
25b80 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63  Callback2==selec
25b90 74 50 6f 70 57 69 74 68 20 29 7b 0a 20 20 20 20  tPopWith ){.    
25ba0 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
25bb0 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67 68  pParse, findRigh
25bc0 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 2c  tmost(p)->pWith,
25bd0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   0);.  }..  /* M
25be0 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
25bf0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
25c00 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
25c10 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
25c20 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
25c30 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
25c40 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
25c50 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
25c60 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
25c70 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
25c80 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
25c90 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
25ca0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
25cb0 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
25cc0 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
25cd0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
25ce0 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
25cf0 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
25d00 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
25d10 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
25d20 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
25d30 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
25d40 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
25d50 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
25d60 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
25d70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
25d80 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
25d90 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
25da0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
25db0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
25dc0 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d  >fg.isRecursive=
25dd0 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
25de0 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
25df0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
25e00 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65  rsive ) continue
25e10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
25e20 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
25e30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25e40 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20  MIT_CTE.    if( 
25e50 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b  withExpand(pWalk
25e60 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  er, pFrom) ) ret
25e70 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
25e80 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
25e90 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e  ab ) {} else.#en
25ea0 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f  dif.    if( pFro
25eb0 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
25ec0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25ed0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
25ee0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
25ef0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
25f00 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
25f10 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
25f20 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
25f30 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
25f40 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
25f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25f60 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
25f70 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
25f80 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
25f90 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65  lker, pSel) ) re
25fa0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25fb0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
25fc0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
25fd0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
25fe0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
25ff0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
26000 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
26010 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
26020 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
26030 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
26040 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
26050 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71  f(db, "sqlite_sq
26060 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61  _%p", (void*)pTa
26070 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  b);.      while(
26080 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
26090 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
260a0 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71  rior; }.      sq
260b0 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
260c0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
260d0 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70   pSel->pEList,&p
260e0 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d  Tab->nCol,&pTab-
260f0 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54  >aCol);.      pT
26100 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
26110 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
26120 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
26130 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
26140 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
26150 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ) );.      pTab-
26160 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
26170 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69  Ephemeral;.#endi
26180 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
26190 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
261a0 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
261b0 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
261c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
261d0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
261e0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
261f0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
26200 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
26210 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
26220 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a  rse, 0, pFrom);.
26230 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
26240 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
26250 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
26260 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66  pTab->nRef==0xff
26270 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
26280 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
26290 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
262a0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
262b0 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
262c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
262d0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
262e0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
262f0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
26300 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26310 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
26320 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
26330 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
26340 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65  Tab) && cannotBe
26350 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
26360 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
26370 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
26380 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ort;.      }.#if
26390 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
263a0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
263b0 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
263c0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
263d0 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  E).      if( IsV
263e0 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20  irtual(pTab) || 
263f0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
26400 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f  .        i16 nCo
26410 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  l;.        if( s
26420 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
26430 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
26440 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
26450 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26460 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26470 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
26480 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
26490 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
264a0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
264b0 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
264c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
264d0 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46  SelectSetName(pF
264e0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54  rom->pSelect, pT
264f0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
26500 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d      nCol = pTab-
26510 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
26520 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  Tab->nCol = -1;.
26530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
26540 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
26550 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
26560 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  t);.        pTab
26570 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
26580 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26590 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
265a0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
265b0 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
265c0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
265d0 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
265e0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
265f0 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
26600 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
26610 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26620 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26630 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
26640 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
26650 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
26660 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
26670 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
26680 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
26690 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
266a0 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
266b0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
266c0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
266d0 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
266e0 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
266f0 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
26700 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
26710 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
26720 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
26730 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
26740 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
26750 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
26760 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
26770 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
26780 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
26790 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
267a0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
267b0 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f  ASTERISK operato
267c0 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
267d0 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
267e0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  the column.  ** 
267f0 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  list.  The follo
26800 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
26810 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
26820 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a   TK_ASTERISK.  *
26830 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  * expressions an
26840 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e  d expand each on
26850 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
26860 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a   all columns in.
26870 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e    ** all tables.
26880 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
26890 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
268a0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
268b0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
268c0 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
268d0 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
268e0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
268f0 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
26900 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
26910 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
26920 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
26930 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ( pE->op==TK_AST
26940 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
26950 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
26960 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
26970 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
26980 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
26990 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
269a0 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
269b0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
269c0 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
269d0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
269e0 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
269f0 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
26a00 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
26a10 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
26a20 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
26a30 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
26a40 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
26a50 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
26a60 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
26a70 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
26a80 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
26a90 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
26aa0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
26ab0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
26ac0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
26ad0 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
26ae0 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
26af0 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
26b00 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
26b10 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
26b20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
26b30 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
26b40 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
26b50 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
26b60 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
26b70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
26b80 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
26bb0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
26bc0 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
26bd0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
26be0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
26bf0 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70       pE = a[k].p
26c00 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67  Expr;.      pRig
26c10 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
26c20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26c30 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
26c40 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
26c50 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
26c60 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
26c70 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
26c80 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
26c90 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
26ca0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
26cb0 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
26cc0 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
26cd0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
26ce0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
26cf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26d00 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
26d10 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
26d20 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
26d30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
26d40 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
26d50 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
26d60 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
26d70 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
26d80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
26d90 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
26da0 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
26db0 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
26dc0 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
26dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
26de0 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
26df0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
26e00 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
26e10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26e20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
26e30 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
26e40 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
26e50 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
26e60 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
26e70 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
26e80 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
26e90 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
26ea0 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
26eb0 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
26ec0 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
26ed0 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
26ee0 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
26ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
26f00 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
26f10 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
26f20 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
26f30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
26f40 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
26f50 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
26f60 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
26f70 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
26f80 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
26f90 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
26fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
26fb0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
26fc0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
26fd0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
26fe0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
26ff0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
27000 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
27010 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
27020 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
27030 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
27040 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
27050 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
27060 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
27070 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
27080 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
27090 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
270a0 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
270b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
270c0 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
270d0 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
270e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
270f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
27100 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
27110 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
27120 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
27130 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
27140 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
27150 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
27160 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27170 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
27180 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
27190 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
271a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
271b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
271c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
271d0 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
271e0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
271f0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
27200 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
27210 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
27220 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
27230 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
27240 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
27250 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
27260 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
27270 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
27280 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
27290 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
272a0 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
272b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
272c0 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
272d0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
272e0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
272f0 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
27300 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
27310 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
27320 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
27330 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
27340 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
27350 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
27360 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
27370 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
27380 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
27390 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
273a0 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
273b0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
273c0 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
273d0 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
273e0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
273f0 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
27400 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
27420 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27430 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
27440 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
27450 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
27460 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
27470 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
27480 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
27490 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
274a0 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
274b0 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
274c0 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
274d0 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
274e0 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
274f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
27500 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
27510 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
27520 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
27530 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
27540 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
27550 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
27560 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
27570 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
27580 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27590 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
275a0 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
275b0 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
275c0 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
275d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
275e0 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
275f0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
27600 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
27610 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
27620 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
27630 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
27640 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
27650 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
27660 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
27670 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
27680 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
27690 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
276a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
276b0 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
276c0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
276f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27700 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
27710 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
27720 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
27730 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
27740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27750 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
27760 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
27770 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
27780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27790 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
277a0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
277b0 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
277c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
277d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
277e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
277f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27800 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
27810 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
27820 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
27830 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
27840 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
27850 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
27860 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
27870 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
27880 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
27890 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
278a0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
278b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
278c0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
278d0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
278e0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
278f0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
27900 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
27910 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
27920 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
27930 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27940 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
27950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
27960 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
27970 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
27980 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
27990 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
279a0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
279b0 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
279c0 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30   pLeft, pExpr, 0
279d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
279e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
279f0 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
27a00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27a10 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
27a20 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
27a30 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
27a40 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
27a50 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
27a60 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
27a80 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
27a90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27aa0 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
27ab0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27ac0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
27ad0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
27ae0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
27af0 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
27b00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27b10 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e  TokenInit(&sColn
27b20 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  ame, zColname);.
27b30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27b40 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
27b50 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  me(pParse, pNew,
27b60 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a   &sColname, 0);.
27b70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27b80 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46  pNew && (p->selF
27b90 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
27ba0 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20  From)!=0 ){.    
27bb0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
27bc0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
27bd0 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e  pX = &pNew->a[pN
27be0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  ew->nExpr-1];.  
27bf0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27c00 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
27c10 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
27c20 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
27c30 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  Dup(db, pSub->pE
27c40 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
27c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27c60 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
27c70 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
27c80 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
27c90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27ca0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
27cb0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
27cc0 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20   "%s.%s.%s",.   
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cf0 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
27d00 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  ame, zTabName, z
27d10 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
27d20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
27d30 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
27d40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
27d50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27d60 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62    pX->bSpanIsTab
27d70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
27d80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27d90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27da0 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
27db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27dc0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
27dd0 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
27de0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
27df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27e00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27e10 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
27e20 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
27e30 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
27e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27e50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27e60 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
27e70 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
27e80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
27e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27ea0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
27eb0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
27ec0 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
27ed0 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
27ee0 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
27ef0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
27f00 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
27f10 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
27f20 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
27f30 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
27f40 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
27f50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
27f60 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
27f70 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
27f80 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  ");.    return W
27f90 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65  RC_Abort;.  }.#e
27fa0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52  ndif.  return WR
27fb0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
27fc0 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
27fd0 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
27fe0 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a  -tree walker..**
27ff0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
28000 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c  utine is the Wal
28010 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
28020 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  k then expressio
28030 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77  n trees.** are w
28040 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e  alked without an
28050 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20  y actions being 
28060 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f  taken at each no
28070 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c  de.  Presumably,
28080 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
28090 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
280a0 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  r Walker.xExprCa
280b0 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20  llback then .** 
280c0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
280d0 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f  llback is set to
280e0 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73   do something us
280f0 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a  eful for every .
28100 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
28110 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
28120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
28130 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  prWalkNoop(Walke
28140 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72  r *NotUsed, Expr
28150 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
28160 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
28170 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
28180 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
28190 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
281a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
281b0 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45  e "expands" a SE
281c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
281d0 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
281e0 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72  bqueries..** For
281f0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
28200 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20  rmation on what 
28210 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70  it means to "exp
28220 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a  and" a SELECT.**
28230 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20   statement, see 
28240 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
28250 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20  he selectExpand 
28260 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  worker callback 
28270 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70  above..**.** Exp
28280 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20  anding a SELECT 
28290 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65  statement is the
282a0 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70   first step in p
282b0 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53  rocessing a.** S
282c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
282d0 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61    The SELECT sta
282e0 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  tement must be e
282f0 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a  xpanded before.*
28300 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  * name resolutio
28310 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  n is performed..
28320 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e  **.** If anythin
28330 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e  g goes wrong, an
28340 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
28350 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  s written into p
28360 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61  Parse..** The ca
28370 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  lling function c
28380 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72  an detect the pr
28390 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67  oblem by looking
283a0 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   at pParse->nErr
283b0 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73  .** and/or pPars
283c0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
283d0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
283e0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
283f0 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70  tExpand(Parse *p
28400 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
28410 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65  Select){.  Walke
28420 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
28430 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
28440 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
28450 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
28460 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
28470 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
28480 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73   if( pParse->has
28490 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20  Compound ){.    
284a0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
284b0 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  k = convertCompo
284c0 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
284d0 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ery;.    sqlite3
284e0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
284f0 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77  Select);.  }.  w
28500 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
28510 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
28520 72 3b 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63  r;.  if( (pSelec
28530 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
28540 5f 4d 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20  _MultiValue)==0 
28550 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  ){.    w.xSelect
28560 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
28570 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20  ctPopWith;.  }. 
28580 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
28590 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
285a0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
285b0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
285c0 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
285d0 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
285e0 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
285f0 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
28600 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
28610 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
28620 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
28630 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
28640 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
28650 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
28660 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
28670 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
28680 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
28690 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
286a0 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
286b0 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
286c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
286d0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
286e0 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
286f0 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
28700 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
28710 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
28720 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
28730 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
28740 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
28750 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
28760 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
28770 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
28780 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
28790 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
287a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
287b0 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
287c0 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
287d0 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
287e0 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
287f0 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61  Info(Walker *pWa
28800 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
28810 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
28820 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  e;.  int i;.  Sr
28830 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
28840 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
28850 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
28860 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
28870 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
28880 76 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ved );.  assert(
28890 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
288a0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d  SF_HasTypeInfo)=
288b0 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  =0 );.  p->selFl
288c0 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
288d0 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  eInfo;.  pParse 
288e0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
288f0 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  e;.  pTabList = 
28900 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->pSrc;.  for(i
28910 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
28920 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
28930 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
28940 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
28950 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
28960 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
28970 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
28980 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
28990 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
289a0 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
289b0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
289c0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
289d0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
289e0 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
289f0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
28a00 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66  Select;.      if
28a10 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pSel ){.      
28a20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
28a30 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
28a40 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
28a50 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
28a60 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
28a70 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
28a80 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b  se, pTab, pSel);
28a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28aa0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
28ab0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28ac0 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
28ad0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
28ae0 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
28af0 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
28b00 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
28b10 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
28b20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
28b30 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
28b40 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
28b50 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
28b60 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
28b70 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
28b80 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
28b90 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
28ba0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
28bb0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
28bc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28bd0 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
28be0 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
28bf0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
28c00 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
28c10 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
28c20 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
28c30 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
28c40 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
28c50 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
28c60 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
28c70 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
28c80 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
28c90 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
28ca0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28cb0 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
28cc0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
28cd0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
28ce0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
28cf0 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
28d00 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
28d10 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
28d20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
28d30 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
28d40 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
28d50 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
28d60 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
28d70 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
28d80 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
28d90 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
28da0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
28db0 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
28dc0 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
28dd0 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
28de0 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
28df0 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
28e00 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
28e10 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
28e20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
28e30 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
28e40 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
28e50 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
28e60 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
28e70 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
28e80 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
28e90 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
28ea0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
28eb0 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
28ec0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
28ed0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
28ee0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
28ef0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
28f00 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
28f10 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
28f20 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
28f30 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
28f40 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
28f50 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
28f60 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  r */.){.  sqlite
28f70 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56  3 *db;.  if( NEV
28f80 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
28f90 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  n;.  db = pParse
28fa0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
28fb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
28fc0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
28fd0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
28fe0 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
28ff0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
29000 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65  ectExpand(pParse
29010 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , p);.  if( pPar
29020 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
29030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
29040 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
29050 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
29060 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
29070 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
29080 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
29090 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
290a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
290b0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
290c0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b  Info(pParse, p);
290d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
290e0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
290f0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
29100 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
29110 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
29120 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
29130 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
29140 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
29150 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
29160 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
29170 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
29180 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
29190 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65   code that store
291a0 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
291b0 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a  f those memory.*
291c0 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * cells..*/.stat
291d0 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
291e0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
291f0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
29200 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
29210 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
29220 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
29230 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
29240 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
29250 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49  int nReg = pAggI
29260 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67  nfo->nFunc + pAg
29270 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  gInfo->nColumn;.
29280 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20    if( nReg==0 ) 
29290 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53  return;.#ifdef S
292a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
292b0 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c   Verify that all
292c0 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65   AggInfo registe
292d0 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68  rs are within th
292e0 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65  e range specifie
292f0 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66  d by.  ** AggInf
29300 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f  o.mnReg..AggInfo
29310 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65  .mxReg */.  asse
29320 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e  rt( nReg==pAggIn
29330 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e  fo->mxReg-pAggIn
29340 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20  fo->mnReg+1 );. 
29350 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
29360 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
29370 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
29380 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
29390 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
293a0 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
293b0 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
293c0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  Col[i].iMem<=pAg
293d0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
293e0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
293f0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
29400 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
29410 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  rt( pAggInfo->aF
29420 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  unc[i].iMem>=pAg
29430 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
29440 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
29450 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
29460 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
29470 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  g );.  }.#endif.
29480 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29490 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
294a0 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  0, pAggInfo->mnR
294b0 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg, pAggInfo->mx
294c0 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e  Reg);.  for(pFun
294d0 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
294e0 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
294f0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
29500 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66  pFunc++){.    if
29510 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
29520 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
29530 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
29540 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
29550 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
29560 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49  operty(pE, EP_xI
29570 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
29580 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73    if( pE->x.pLis
29590 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c  t==0 || pE->x.pL
295a0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  ist->nExpr!=1 ){
295b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
295c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
295d0 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65   "DISTINCT aggre
295e0 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20  gates must have 
295f0 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20  exactly one ".  
29600 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65           "argume
29610 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  nt");.        pF
29620 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
29630 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
29640 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
29650 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
29660 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
29670 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
29680 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pList, 0, 0);.  
29690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
296a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
296b0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
296c0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
296d0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
296e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
296f0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
29700 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
29710 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
29720 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
29730 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
29740 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
29750 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
29760 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
29770 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
29780 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
29790 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
297a0 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
297b0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
297c0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
297d0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
297e0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
297f0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
29800 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
29810 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
29820 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
29830 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
29840 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
29850 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
29860 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
29870 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
29880 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
29890 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
298a0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71  elect) );.    sq
298b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
298c0 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
298d0 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20  pF->iMem, pList 
298e0 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
298f0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
29910 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
29920 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
29930 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
29940 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
29950 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
29960 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
29970 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
29980 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
29990 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
299a0 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
299b0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
299c0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
299d0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
299e0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
299f0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
29a00 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
29a10 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
29a20 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
29a30 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
29a40 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
29a50 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
29a60 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
29a70 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
29a80 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
29a90 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
29aa0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
29ab0 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
29ac0 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
29ad0 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
29ae0 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
29af0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
29b00 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
29b10 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
29b20 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
29b30 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
29b40 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
29b50 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
29b60 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
29b70 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
29b80 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
29b90 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
29ba0 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
29bb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
29bc0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
29bd0 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
29be0 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  , 0, SQLITE_ECEL
29bf0 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
29c00 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
29c10 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
29c20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
29c30 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
29c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
29c50 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
29c60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29c70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29c80 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45  nArg==0 );  /* E
29c90 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
29ca0 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
29cb0 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a  ( nArg>1 );   /*
29cc0 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a   Also an error *
29cd0 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  /.      codeDist
29ce0 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
29cf0 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
29d00 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
29d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29d20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
29d30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
29d40 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
29d50 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
29d60 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
29d70 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
29d80 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
29d90 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
29da0 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
29db0 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
29dc0 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
29dd0 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
29de0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
29df0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
29e00 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
29e10 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
29e20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
29e30 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
29e40 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
29e50 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
29e60 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
29e70 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
29e80 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
29e90 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
29ea0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
29eb0 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
29ec0 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
29ed0 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
29ee0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
29ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29f00 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
29f10 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
29f20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
29f30 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
29f40 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
29f50 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
29f60 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67  gStep0, 0, regAg
29f70 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20  g, pF->iMem,.   
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f90 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
29fa0 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
29fb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
29fc0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
29fd0 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
29fe0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
29ff0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
2a000 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
2a010 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
2a020 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
2a030 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
2a040 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
2a050 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
2a060 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2a070 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
2a080 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
2a090 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2a0a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
2a0b0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
2a0c0 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
2a0d0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
2a0e0 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
2a0f0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
2a100 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
2a110 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
2a120 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
2a130 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
2a140 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
2a150 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
2a160 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
2a170 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
2a180 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
2a190 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
2a1a0 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
2a1b0 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
2a1c0 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
2a1d0 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
2a1e0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
2a1f0 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
2a200 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
2a210 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
2a220 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
2a230 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
2a240 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
2a250 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
2a260 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
2a270 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
2a280 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
2a290 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
2a2a0 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
2a2b0 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
2a2c0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69    */.  if( regHi
2a2d0 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
2a2e0 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
2a2f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
2a300 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65  f, regHit); Vdbe
2a310 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
2a320 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2a330 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2a340 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  ;.  for(i=0, pC=
2a350 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
2a360 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
2a370 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
2a380 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
2a390 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2a3a0 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
2a3b0 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
2a3c0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
2a3d0 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
2a3e0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2a3f0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61  pParse);.  if( a
2a400 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
2a410 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2a420 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
2a430 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
2a440 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
2a450 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
2a460 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
2a470 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
2a480 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
2a490 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
2a4a0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2a4b0 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
2a4c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a4d0 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
2a4e0 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
2a4f0 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
2a500 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2a510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2a520 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
2a530 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2a560 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
2a570 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2a580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a590 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
2a5a0 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
2a5b0 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
2a5c0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
2a5d0 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  =2 ){.    int bC
2a5e0 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20  over = (pIdx!=0 
2a5f0 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
2a600 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
2a610 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29  KeyIndex(pIdx)))
2a620 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70  ;.    char *zEqp
2a630 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
2a640 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53  f(pParse->db, "S
2a650 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73  CAN TABLE %s%s%s
2a660 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
2a670 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
2a680 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47  bCover ? " USING
2a690 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
2a6a0 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20  " : "",.        
2a6b0 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a  bCover ? pIdx->z
2a6c0 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b  Name : "".    );
2a6d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a6e0 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
2a6f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
2a700 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
2a710 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
2a720 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e   0, zEqp, P4_DYN
2a730 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  AMIC.    );.  }.
2a740 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
2a750 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
2a760 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  unt(a,b,c).#endi
2a770 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
2a780 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
2a790 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2a7a0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
2a7b0 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
2a7c0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
2a7d0 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64   returned accord
2a7e0 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63  ing to the Selec
2a7f0 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
2a800 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  .** See comments
2a810 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
2a820 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f  for further info
2a830 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
2a840 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2a850 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
2a860 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
2a870 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
2a880 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
2a890 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
2a8a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2a8b0 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
2a8c0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2a8d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a8e0 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
2a8f0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
2a900 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
2a910 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
2a920 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
2a930 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
2a940 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
2a950 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2a960 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a970 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2a980 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2a990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a9a0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2a9b0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
2a9c0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
2a9d0 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
2a9e0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
2a9f0 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
2aa00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
2aa10 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2aa20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2aa30 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
2aa40 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
2aa50 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
2aa60 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2aa70 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
2aa80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2aa90 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
2aaa0 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
2aab0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
2aac0 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
2aad0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
2aae0 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
2aaf0 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
2ab00 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
2ab10 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f   = 0;  /* List o
2ab20 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
2ab30 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
2ab40 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
2ab50 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
2ab60 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
2ab70 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
2ab80 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
2ab90 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2aba0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
2abb0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2abc0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
2abd0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
2abe0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
2abf0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
2ac00 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
2ac10 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
2ac20 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
2ac30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
2ac40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2ac50 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
2ac60 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
2ac70 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
2ac80 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
2ac90 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
2aca0 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
2acb0 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
2acc0 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20  SortCtx sSort;  
2acd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f         /* Info o
2ace0 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
2acf0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2ad00 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  e */.  AggInfo s
2ad10 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
2ad20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
2ad30 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
2ad40 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
2ad50 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
2ad60 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2ad70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2ad80 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
2ad90 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
2ada0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
2adb0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
2adc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2add0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
2ade0 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
2adf0 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
2ae00 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
2ae10 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
2ae20 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2ae30 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
2ae40 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2ae50 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
2ae60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2ae70 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
2ae80 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
2ae90 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
2aea0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2aeb0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
2aec0 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
2aed0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
2aee0 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
2aef0 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
2af00 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  ));.#if SELECTTR
2af10 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50  ACE_ENABLED.  pP
2af20 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
2af30 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54  ent++;.  SELECTT
2af40 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
2af50 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73   ("begin process
2af60 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28  ing:\n"));.  if(
2af70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2af80 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2af90 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2afa0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2afb0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2afc0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2afd0 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2afe0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
2aff0 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72  tFifo );.  asser
2b000 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
2b010 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
2b020 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20  t!=SRT_Fifo );. 
2b030 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2b040 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2b050 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
2b060 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65  tQueue );.  asse
2b070 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2b080 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2b090 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b  st!=SRT_Queue );
2b0a0 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
2b0b0 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
2b0c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  {.    assert(pDe
2b0d0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
2b0e0 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
2b0f0 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
2b100 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
2b110 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2b120 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
2b130 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
2b140 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20  scard ||.       
2b150 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2b160 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20  ==SRT_Queue  || 
2b170 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2b180 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20  T_DistFifo ||.  
2b190 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2b1a0 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
2b1b0 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ueue || pDest->e
2b1c0 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b  Dest==SRT_Fifo);
2b1d0 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52  .    /* If ORDER
2b1e0 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66   BY makes no dif
2b1f0 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f  ference in the o
2b200 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68  utput then neith
2b210 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44  er does.    ** D
2b220 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61  ISTINCT so it ca
2b230 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f  n be removed too
2b240 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
2b250 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
2b260 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
2b270 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
2b280 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c   = 0;.    p->sel
2b290 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
2b2a0 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  tinct;.  }.  sql
2b2b0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
2b2c0 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
2b2d0 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30  memset(&sSort, 0
2b2e0 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29  , sizeof(sSort))
2b2f0 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  ;.  sSort.pOrder
2b300 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
2b310 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
2b320 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50  ->pSrc;.  if( pP
2b330 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
2b340 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2b350 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
2b360 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73  t_end;.  }.  ass
2b370 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
2b380 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28  0 );.  isAgg = (
2b390 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2b3a0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
2b3b0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2b3c0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2b3d0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2b3e0 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
2b3f0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
2b400 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66  0,pParse,p, ("af
2b410 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
2b420 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ion:\n"));.    s
2b430 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2b440 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2b450 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2b460 54 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  Try to flatten s
2b470 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  ubqueries in the
2b480 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20   FROM clause up 
2b490 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75  into the main qu
2b4a0 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ery.  */.#if !de
2b4b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2b4c0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
2b4d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2b4e0 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28  MIT_VIEW).  for(
2b4f0 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20  i=0; !p->pPrior 
2b500 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  && i<pTabList->n
2b510 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
2b520 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2b530 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
2b540 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20  bList->a[i];.   
2b550 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
2b560 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
2b570 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62      int isAggSub
2b580 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
2b590 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
2b5a0 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
2b5b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
2b5c0 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61    /* Catch misma
2b5d0 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61  tch in the decla
2b5e0 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61  red columns of a
2b5f0 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75   view and the nu
2b600 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63  mber of.    ** c
2b610 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45  olumns in the SE
2b620 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20  LECT on the RHS 
2b630 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  */.    if( pTab-
2b640 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c  >nCol!=pSub->pEL
2b650 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
2b660 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2b670 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70  Msg(pParse, "exp
2b680 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
2b690 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f   for '%s' but go
2b6a0 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  t %d",.         
2b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
2b6c0 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a  b->nCol, pTab->z
2b6d0 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69  Name, pSub->pELi
2b6e0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
2b6f0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
2b700 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73  d;.    }..    is
2b710 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e  AggSub = (pSub->
2b720 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
2b730 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20  gregate)!=0;.   
2b740 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71   if( flattenSubq
2b750 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
2b760 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53  i, isAgg, isAggS
2b770 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ub) ){.      /* 
2b780 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61  This subquery ca
2b790 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e  n be absorbed in
2b7a0 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a  to its parent. *
2b7b0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67  /.      if( isAg
2b7c0 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  gSub ){.        
2b7d0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
2b7e0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
2b7f0 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
2b800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
2b810 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
2b820 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2b830 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  rc;.    if( db->
2b840 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2b850 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2b860 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62      if( !Ignorab
2b870 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
2b880 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
2b890 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
2b8a0 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
2b8b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
2b8c0 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65  et a pointer the
2b8d0 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
2b8e0 74 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61  truction, alloca
2b8f0 74 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20  ting a new VDBE 
2b900 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73  if one.  ** does
2b910 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
2b920 73 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  st */.  v = sqli
2b930 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
2b940 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
2b950 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2b960 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2b970 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
2b980 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64  SELECT.  /* Hand
2b990 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  le compound SELE
2b9a0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73  CT statements us
2b9b0 69 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65  ing the separate
2b9c0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20   multiSelect(). 
2b9d0 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20   ** procedure.. 
2b9e0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
2b9f0 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ior ){.    rc = 
2ba00 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
2ba10 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
2ba20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
2ba30 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
2ba40 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
2ba50 53 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53  SelectId);.#if S
2ba60 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2ba70 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ED.    SELECTTRA
2ba80 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
2ba90 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  end compound-sel
2baa0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  ect processing\n
2bab0 22 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  "));.    pParse-
2bac0 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d  >nSelectIndent--
2bad0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
2bae0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
2baf0 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
2bb00 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
2bb10 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
2bb20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
2bb30 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2bb40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2bb50 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
2bb60 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2bb70 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  EW).  for(i=0; i
2bb80 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2bb90 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2bba0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2bbb0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
2bbc0 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
2bbd0 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
2bbe0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
2bbf0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
2bc00 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
2bc10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
2bc20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74    /* Sometimes t
2bc30 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
2bc40 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67  bquery will be g
2bc50 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68  enerated more th
2bc60 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20  an.    ** once, 
2bc70 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
2bc80 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57  is part of the W
2bc90 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61  HERE clause in a
2bca0 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20   LEFT JOIN,.    
2bcb0 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  ** for example. 
2bcc0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
2bcd0 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65  o not regenerate
2bce0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e   the code to man
2bcf0 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76  ifest.    ** a v
2bd00 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f  iew or the co-ro
2bd10 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65  utine to impleme
2bd20 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  nt a view.  The 
2bd30 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20  first instance. 
2bd40 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69     ** is suffici
2bd50 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20  ent, though the 
2bd60 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  subroutine to ma
2bd70 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20  nifest the view 
2bd80 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a  does need.    **
2bd90 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61   to be invoked a
2bda0 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
2bdb0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2bdc0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Sub ){.      if(
2bdd0 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
2bde0 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20  routine==0 ){.  
2bdf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2be00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2be10 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  sub, pItem->regR
2be20 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64  eturn, pItem->ad
2be30 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
2be40 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
2be50 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
2be60 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
2be70 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
2be80 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
2be90 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
2bea0 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
2beb0 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69  ferred to by thi
2bec0 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
2bed0 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
2bee0 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
2bef0 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
2bf00 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
2bf10 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
2bf20 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
2bf30 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
2bf40 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
2bf50 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
2bf60 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
2bf70 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
2bf80 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
2bf90 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
2bfa0 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
2bfb0 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
2bfc0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
2bfd0 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
2bfe0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
2bff0 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63  ;..    /* Make c
2c000 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e  opies of constan
2c010 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74  t WHERE-clause t
2c020 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65  erms in the oute
2c030 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20  r query down.   
2c040 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73   ** inside the s
2c050 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63  ubquery.  This c
2c060 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71  an help the subq
2c070 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65  uery to run more
2c080 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20   efficiently..  
2c090 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49    */.    if( (pI
2c0a0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
2c0b0 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a   & JT_OUTER)==0.
2c0c0 20 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e       && pushDown
2c0d0 57 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70  WhereTerms(db, p
2c0e0 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  Sub, p->pWhere, 
2c0f0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a  pItem->iCursor).
2c100 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43      ){.#if SELEC
2c110 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2c120 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2c130 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2c140 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53  100 ){.        S
2c150 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
2c160 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
2c170 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70  r WHERE-clause p
2c180 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a  ush-down:\n"));.
2c190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
2c1a0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2c1b0 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   p, 0);.      }.
2c1c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
2c1d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
2c1e0 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
2c1f0 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
2c200 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
2c210 75 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65  ubquery is imple
2c220 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
2c230 6f 75 74 69 6e 65 20 69 66 20 61 6c 6c 20 6f 66  outine if all of
2c240 20 74 68 65 73 65 20 61 72 65 20 74 72 75 65 3a   these are true:
2c250 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 54  .    **   (1)  T
2c260 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 67  he subquery is g
2c270 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
2c280 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28  the outer loop (
2c290 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a  so that it.    *
2c2a0 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f  *        does no
2c2b0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6d  t need to be com
2c2c0 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  puted more than 
2c2d0 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 20 20 20 28  once).    **   (
2c2e0 32 29 20 20 54 68 65 20 41 4c 4c 20 6b 65 79 77  2)  The ALL keyw
2c2f0 6f 72 64 20 61 66 74 65 72 20 53 45 4c 45 43 54  ord after SELECT
2c300 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 28 41   is omitted.  (A
2c310 70 70 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 0a  pplications are.
2c320 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6c      **        al
2c330 6c 6f 77 65 64 20 74 6f 20 73 61 79 20 22 53 45  lowed to say "SE
2c340 4c 45 43 54 20 41 4c 4c 22 20 69 6e 73 74 65 61  LECT ALL" instea
2c350 64 20 6f 66 20 6a 75 73 74 20 22 53 45 4c 45 43  d of just "SELEC
2c360 54 22 20 74 6f 20 64 69 73 61 62 6c 65 0a 20 20  T" to disable.  
2c370 20 20 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20    **        the 
2c380 75 73 65 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e  use of co-routin
2c390 65 73 2e 29 0a 20 20 20 20 2a 2a 20 20 20 28 33  es.).    **   (3
2c3a0 29 20 20 43 6f 2d 72 6f 75 74 69 6e 65 73 20 61  )  Co-routines a
2c3b0 72 65 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 20  re not disabled 
2c3c0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 74 65  using sqlite3_te
2c3d0 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 20 20 20  st_control().   
2c3e0 20 2a 2a 20 20 20 20 20 20 20 20 77 69 74 68 20   **        with 
2c3f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2c400 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2e 0a 20  OPTIMIZATIONS.. 
2c410 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     **.    ** TOD
2c420 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68  O: Are there oth
2c430 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64  er reasons besid
2c440 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63  e (1) to use a c
2c450 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  o-routine.    **
2c460 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f   implementation?
2c470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2c480 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  i==0.     && (pT
2c490 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2c4b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
2c4c0 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
2c4d0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
2c4e0 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20  0)  /* (1) */.  
2c4f0 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61     && (p->selFla
2c500 67 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 20  gs & SF_All)==0 
2c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c530 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
2c540 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
2c550 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
2c560 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65  TE_SubqCoroutine
2c570 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2c580 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 29 7b  /* (3) */.    ){
2c590 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d  .      /* Implem
2c5a0 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ent a co-routine
2c5b0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72   that will retur
2c5c0 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  n a single row o
2c5d0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
2c5e0 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63     ** set on eac
2c5f0 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20  h invocation..  
2c600 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
2c610 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
2c620 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2c630 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49  r(v)+1;.      pI
2c640 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
2c650 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2c660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c670 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
2c680 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  nitCoroutine, pI
2c690 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2c6a0 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  0, addrTop);.   
2c6b0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2c6c0 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  v, "%s", pItem->
2c6d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2c6e0 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
2c6f0 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f  FillSub = addrTo
2c700 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
2c710 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
2c720 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
2c730 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2c740 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78  eturn);.      ex
2c750 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2c760 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
2c770 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
2c780 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
2c790 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2c7a0 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
2c7b0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
2c7c0 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
2c7d0 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
2c7e0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
2c7f0 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
2c800 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  outine = 1;.    
2c810 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75    pItem->regResu
2c820 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  lt = dest.iSdst;
2c830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c840 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
2c850 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2c860 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
2c870 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2c880 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
2c890 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2c8a0 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2c8b0 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
2c8c0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2c8d0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2c8e0 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
2c8f0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
2c900 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
2c910 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2c920 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
2c930 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2c940 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
2c950 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
2c960 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
2c970 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
2c980 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
2c990 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
2c9a0 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
2c9b0 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
2c9c0 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
2c9d0 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
2c9e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
2c9f0 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
2ca00 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
2ca10 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
2ca20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ca30 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2ca40 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ub==0 );.      p
2ca50 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
2ca60 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2ca70 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20  ;.      topAddr 
2ca80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2ca90 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2caa0 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67  r, 0, pItem->reg
2cab0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70  Return);.      p
2cac0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2cad0 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20  b = topAddr+1;. 
2cae0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2caf0 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d  fg.isCorrelated=
2cb00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
2cb10 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
2cb20 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74   is not correlat
2cb30 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65  ed and if we are
2cb40 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20   not inside of. 
2cb50 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
2cb60 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c  ger, then we onl
2cb70 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  y need to comput
2cb80 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2cb90 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
2cba0 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a      ** once. */.
2cbb0 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72          onceAddr
2cbc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2cbd0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
2cbe0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2cbf0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2cc00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
2cc10 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
2cc20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2cc30 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ame));.      }el
2cc40 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
2cc50 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
2cc60 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
2cc70 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
2cc80 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2cc90 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2cca0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
2ccb0 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
2ccc0 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
2ccd0 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  sor);.      expl
2cce0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
2ccf0 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
2cd00 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
2cd10 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
2cd20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
2cd30 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
2cd40 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
2cd50 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
2cd60 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c  Est = pSub->nSel
2cd70 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ectRow;.      if
2cd80 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c  ( onceAddr ) sql
2cd90 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2cda0 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20  (v, onceAddr);. 
2cdb0 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73       retAddr = s
2cdc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2cdd0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
2cde0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2cdf0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2ce00 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22  ent((v, "end %s"
2ce10 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2ce20 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
2ce30 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2ce40 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65  1(v, topAddr, re
2ce50 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71  tAddr);.      sq
2ce60 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
2ce70 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
2ce80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
2ce90 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2cea0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2ceb0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  ;.    pParse->nH
2cec0 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
2ced0 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
2cee0 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (p);.  }.#endif.
2cef0 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c  .  /* Various el
2cf00 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45  ements of the SE
2cf10 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f  LECT copied into
2cf20 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
2cf30 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e   for.  ** conven
2cf40 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73  ience */.  pELis
2cf50 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
2cf60 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
2cf70 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
2cf80 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
2cf90 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
2cfa0 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e  aving;.  sDistin
2cfb0 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e  ct.isTnct = (p->
2cfc0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
2cfd0 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66  stinct)!=0;..#if
2cfe0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2cff0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
2d000 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2d010 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x400 ){.    SEL
2d020 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
2d030 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
2d040 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
2d050 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a  analysis:\n"));.
2d060 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2d070 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2d080 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2d090 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
2d0a0 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69  y is DISTINCT wi
2d0b0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62  th an ORDER BY b
2d0c0 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ut is not an agg
2d0d0 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a  regate, and .  *
2d0e0 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d  * if the select-
2d0f0 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65  list is the same
2d100 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59   as the ORDER BY
2d110 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73   list, then this
2d120 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20   query.  ** can 
2d130 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  be rewritten as 
2d140 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f  a GROUP BY. In o
2d150 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73  ther words, this
2d160 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2d170 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
2d180 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  xyz FROM ... ORD
2d190 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
2d1a0 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d   ** is transform
2d1b0 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ed to:.  **.  **
2d1c0 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20       SELECT xyz 
2d1d0 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42  FROM ... GROUP B
2d1e0 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78  Y xyz ORDER BY x
2d1f0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
2d200 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
2d210 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
2d220 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
2d230 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
2d240 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
2d250 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
2d260 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2d270 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
2d280 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
2d290 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
2d2a0 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
2d2b0 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
2d2c0 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
2d2d0 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
2d2e0 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
2d2f0 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
2d300 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
2d310 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
2d320 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
2d330 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
2d340 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
2d350 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
2d360 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
2d370 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
2d380 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  e(sSort.pOrderBy
2d390 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30  , pEList, -1)==0
2d3a0 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  .  ){.    p->sel
2d3b0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
2d3c0 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75  tinct;.    pGrou
2d3d0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
2d3e0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
2d3f0 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
2d400 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  t, 0);.    /* No
2d410 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
2d420 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
2d430 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
2d440 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
2d450 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
2d460 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2d470 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
2d480 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
2d490 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
2d4a0 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
2d4b0 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
2d4c0 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
2d4d0 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
2d4e0 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
2d4f0 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
2d500 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53  isTnct );..#if S
2d510 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2d520 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
2d530 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2d540 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53  0x400 ){.      S
2d550 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
2d560 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e  ,pParse,p,("Tran
2d570 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69  sform DISTINCT i
2d580 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22  nto GROUP BY:\n"
2d590 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2d5a0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2d5b0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, p, 0);.    }.
2d5c0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
2d5d0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
2d5e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2d5f0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20   then create an 
2d600 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
2d610 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73  to.  ** do the s
2d620 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69  orting.  But thi
2d630 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65  s sorting epheme
2d640 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20  ral index might 
2d650 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e  end up.  ** bein
2d660 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
2d670 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72  data can be extr
2d680 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
2d690 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20  ted order..  ** 
2d6a0 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
2d6b0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50  ase, then the OP
2d6c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
2d6d0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
2d6e0 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20  be.  ** changed 
2d6f0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
2d700 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ce we figure out
2d710 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
2d720 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20  g index is.  ** 
2d730 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
2d740 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2d750 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73  ndex variable is
2d760 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
2d770 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68  ate.  ** that ch
2d780 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
2d790 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2d7a0 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
2d7b0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
2d7c0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
2d7d0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2d7e0 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  rse, sSort.pOrde
2d7f0 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  rBy, 0, pEList->
2d800 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72  nExpr);.    sSor
2d810 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  t.iECursor = pPa
2d820 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2d830 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2d840 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
2d850 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2d860 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2d870 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53  al,.          sS
2d880 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53  ort.iECursor, sS
2d890 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
2d8a0 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45  xpr+1+pEList->nE
2d8b0 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  xpr, 0,.        
2d8c0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2d8d0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20  o, P4_KEYINFO.  
2d8e0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2d8f0 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
2d900 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
2d910 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
2d920 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
2d930 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
2d940 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
2d950 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
2d960 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
2d970 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
2d980 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2d990 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
2d9a0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
2d9b0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
2d9c0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
2d9d0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
2d9e0 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
2d9f0 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
2da00 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2da10 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2da20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c  = 320;  /* 4 bil
2da30 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63  lion rows */.  c
2da40 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
2da50 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
2da60 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
2da70 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
2da80 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2da90 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
2daa0 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
2dab0 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  de(v, sSort.addr
2dac0 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f  SortIndex, OP_So
2dad0 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73  rterOpen);.    s
2dae0 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
2daf0 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
2db00 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
2db10 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  Open an ephemera
2db20 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
2db30 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
2db40 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
2db50 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2db60 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2db70 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
2db80 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2db90 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
2dba0 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
2dbb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2dbc0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2dbd0 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
2dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbf0 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
2dc00 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
2dc30 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2dc40 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
2dc50 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
2dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc70 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
2dc80 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
2dc90 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2dca0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
2dcb0 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
2dcc0 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2dcd0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
2dce0 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERED;.  }else{. 
2dcf0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2dd00 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
2dd10 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
2dd20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  }..  if( !isAgg 
2dd30 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
2dd40 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72  {.    /* No aggr
2dd50 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2dd60 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
2dd70 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31  clause */.    u1
2dd80 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  6 wctrlFlags = (
2dd90 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2dda0 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   ? WHERE_WANT_DI
2ddb0 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 20 20 20  STINCT : 0);.   
2ddc0 20 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55   assert( WHERE_U
2ddd0 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78  SE_LIMIT==SF_Fix
2dde0 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 77  edLimit );.    w
2ddf0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 70 2d 3e  ctrlFlags |= p->
2de00 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69  selFlags & SF_Fi
2de10 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f  xedLimit;..    /
2de20 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
2de30 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
2de40 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2de50 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2de60 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2de70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
2de80 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
2de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dea0 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
2deb0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e   wctrlFlags, p->
2dec0 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
2ded0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
2dee0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2def0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2df00 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
2df10 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70  ount(pWInfo) < p
2df20 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
2df30 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
2df40 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Row = sqlite3Whe
2df50 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
2df60 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
2df70 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63      if( sDistinc
2df80 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69  t.isTnct && sqli
2df90 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
2dfa0 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ct(pWInfo) ){.  
2dfb0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2dfc0 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65  nctType = sqlite
2dfd0 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
2dfe0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
2dff0 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f      if( sSort.pO
2e000 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
2e010 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73  sSort.nOBSat = s
2e020 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
2e030 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ered(pWInfo);.  
2e040 20 20 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72      sSort.bOrder
2e050 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71  edInnerLoop = sq
2e060 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 65  lite3WhereOrdere
2e070 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66  dInnerLoop(pWInf
2e080 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53  o);.      if( sS
2e090 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72  ort.nOBSat==sSor
2e0a0 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
2e0b0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f  r ){.        sSo
2e0c0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2e0d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2e0e0 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
2e0f0 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
2e100 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
2e110 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
2e120 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
2e130 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
2e140 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
2e150 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
2e160 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
2e170 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
2e180 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
2e190 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72   */.    if( sSor
2e1a0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
2e1b0 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64  =0 && sSort.pOrd
2e1c0 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
2e1d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2e1e0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
2e1f0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
2e200 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2e210 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
2e220 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a   inner loop. */.
2e230 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
2e240 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
2e250 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72  EList, -1, &sSor
2e260 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
2e270 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
2e280 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e290 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
2e2a0 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
2e2d0 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
2e2e0 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
2e2f0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
2e300 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
2e310 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2e320 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
2e330 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
2e340 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
2e350 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
2e360 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
2e370 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
2e380 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
2e390 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
2e3a0 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
2e3b0 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
2e3c0 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
2e3d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
2e3e0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
2e3f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2e400 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2e410 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
2e420 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
2e430 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
2e440 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
2e450 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
2e460 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
2e470 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
2e480 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
2e490 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
2e4a0 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
2e4b0 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
2e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
2e4e0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
2e4f0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
2e500 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
2e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e520 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
2e530 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
2e540 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
2e550 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
2e560 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
2e570 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
2e580 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
2e590 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
2e5a0 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
2e5b0 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
2e5c0 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
2e5d0 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
2e5e0 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
2e5f0 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
2e600 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
2e610 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
2e620 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
2e630 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
2e640 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
2e650 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
2e660 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
2e670 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
2e680 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
2e690 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
2e6a0 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
2e6b0 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
2e6c0 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
2e6d0 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
2e6e0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
2e6f0 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
2e700 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
2e710 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
2e720 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
2e730 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
2e740 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
2e750 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
2e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e770 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2e780 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
2e790 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2e7a0 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
2e7b0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
2e7c0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
2e7d0 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
2e7e0 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
2e7f0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
2e800 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
2e810 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
2e820 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
2e830 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
2e840 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
2e850 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
2e860 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
2e870 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
2e880 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2e890 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
2e8a0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
2e8b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
2e8c0 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
2e8d0 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
2e8e0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
2e8f0 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
2e900 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
2e910 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2e920 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
2e930 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
2e940 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2e950 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
2e960 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
2e970 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
2e980 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2e990 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
2e9a0 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
2e9b0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
2e9c0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
2e9d0 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
2e9e0 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
2e9f0 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
2ea00 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
2ea10 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
2ea20 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
2ea30 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
2ea40 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
2ea50 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
2ea60 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
2ea70 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
2ea80 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
2ea90 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
2eaa0 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
2eab0 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
2eac0 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
2ead0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
2eae0 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
2eaf0 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
2eb00 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
2eb10 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
2eb20 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
2eb30 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
2eb40 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
2eb50 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
2eb60 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
2eb70 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
2eb80 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
2eb90 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
2eba0 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
2ebb0 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
2ebc0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
2ebd0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
2ebe0 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
2ebf0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
2ec00 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
2ec10 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
2ec20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2ec30 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
2ec40 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
2ec50 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
2ec60 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
2ec70 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
2ec80 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
2ec90 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
2eca0 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
2ecb0 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
2ecc0 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
2ecd0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
2ece0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
2ecf0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
2ed00 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
2ed10 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2ed20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
2ed30 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
2ed40 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
2ed50 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
2ed60 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
2ed70 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
2ed80 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
2ed90 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
2eda0 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
2edb0 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
2edc0 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
2edd0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
2ede0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2edf0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
2ee00 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
2ee10 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2ee20 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
2ee30 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
2ee40 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
2ee50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2ee60 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2ee70 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
2ee80 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
2ee90 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
2eea0 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
2eeb0 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f  .nColumn;.    fo
2eec0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2eed0 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  o.nFunc; i++){. 
2eee0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2eef0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41  prHasProperty(sA
2ef00 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
2ef10 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2ef20 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
2ef30 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f  C.ncFlags |= NC_
2ef40 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20  InAggFunc;.     
2ef50 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2ef60 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
2ef70 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
2ef80 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  i].pExpr->x.pLis
2ef90 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63  t);.      sNC.nc
2efa0 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41  Flags &= ~NC_InA
2efb0 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20  ggFunc;.    }.  
2efc0 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67    sAggInfo.mxReg
2efd0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
2efe0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2eff0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2f000 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
2f010 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
2f020 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
2f030 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
2f040 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
2f050 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
2f060 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
2f070 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
2f080 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
2f090 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2f0a0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
2f0b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2f0c0 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
2f0d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
2f0e0 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
2f0f0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
2f100 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
2f110 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
2f120 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
2f130 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
2f140 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
2f150 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
2f160 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
2f170 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
2f180 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
2f190 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
2f1a0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
2f1b0 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
2f1c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
2f1d0 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
2f1e0 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
2f1f0 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
2f200 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
2f210 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
2f220 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
2f230 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
2f240 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
2f250 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
2f260 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
2f270 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
2f280 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
2f290 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
2f2a0 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
2f2b0 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
2f2c0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
2f2d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
2f2e0 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
2f2f0 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
2f300 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
2f310 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
2f320 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
2f330 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
2f340 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
2f350 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
2f360 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
2f370 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
2f380 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
2f390 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
2f3a0 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
2f3b0 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
2f3c0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
2f3d0 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
2f3e0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69   OP_SorterOpen i
2f3f0 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
2f400 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
2f410 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
2f420 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
2f430 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
2f440 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
2f450 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2f460 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
2f470 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2f480 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
2f490 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f   0, sAggInfo.nCo
2f4a0 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64  lumn);.      add
2f4b0 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71  rSortingIdx = sq
2f4c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2f4d0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
2f4e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  , .          sAg
2f4f0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2f500 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74  , sAggInfo.nSort
2f510 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20  ingColumn, .    
2f520 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29        0, (char*)
2f530 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2f540 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  INFO);..      /*
2f550 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
2f560 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
2f570 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
2f580 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
2f590 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
2f5a0 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
2f5b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2f5c0 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
2f5d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2f5e0 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52        regOutputR
2f5f0 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ow = ++pParse->n
2f600 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  Mem;.      addrO
2f610 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
2f620 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2f630 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73  v);.      regRes
2f640 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
2f650 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52  Mem;.      addrR
2f660 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
2f670 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2f680 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
2f690 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2f6a0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2f6b0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2f6c0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
2f6d0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
2f6e0 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
2f6f0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
2f700 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
2f710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f720 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2f730 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
2f740 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
2f750 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
2f760 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
2f770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f780 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2f790 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
2f7a0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2f7b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
2f7c0 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
2f7d0 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
2f7e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f7f0 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
2f800 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b  0, iAMem, iAMem+
2f810 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
2f820 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  1);..      /* Be
2f830 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
2f840 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
2f850 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
2f860 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
2f870 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
2f880 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
2f890 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
2f8a0 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
2f8b0 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
2f8c0 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
2f8d0 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
2f8e0 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
2f8f0 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
2f900 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
2f910 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
2f920 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
2f930 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
2f940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f950 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2f960 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
2f970 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
2f980 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2f990 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
2f9a0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
2f9b0 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  ere, pGroupBy, 0
2f9c0 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  ,.          WHER
2f9d0 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64  E_GROUPBY | (ord
2f9e0 65 72 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f  erByGrp ? WHERE_
2f9f0 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29  SORTBYGROUP : 0)
2fa00 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
2fa10 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
2fa20 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2fa30 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  nd;.      if( sq
2fa40 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
2fa50 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72  red(pWInfo)==pGr
2fa60 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  oupBy->nExpr ){.
2fa70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
2fa80 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
2fa90 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
2faa0 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
2fab0 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
2fac0 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
2fad0 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
2fae0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
2faf0 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
2fb00 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
2fb10 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
2fb20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
2fb30 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
2fb40 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
2fb50 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
2fb60 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
2fb70 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
2fb80 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
2fb90 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
2fba0 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
2fbb0 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
2fbc0 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
2fbd0 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
2fbe0 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
2fbf0 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
2fc00 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
2fc10 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
2fc20 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
2fc30 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
2fc40 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
2fc50 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
2fc60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2fc70 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
2fc80 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
2fc90 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
2fca0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
2fcb0 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
2fcc0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54          explainT
2fcd0 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
2fce0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73   .            (s
2fcf0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2fd00 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26  && (p->selFlags&
2fd10 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29  SF_Distinct)==0)
2fd20 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
2fd30 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54         "DISTINCT
2fd40 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b  " : "GROUP BY");
2fd50 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ..        groupB
2fd60 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
2fd70 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47     nGroupBy = pG
2fd80 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
2fd90 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47         nCol = nG
2fda0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
2fdb0 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  j = nGroupBy;.  
2fdc0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2fdd0 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
2fde0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2fdf0 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e     if( sAggInfo.
2fe00 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43  aCol[i].iSorterC
2fe10 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
2fe20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a          nCol++;.
2fe30 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
2fe40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fe50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2fe60 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
2fe70 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2fe80 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  rse, nCol);.    
2fe90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2fea0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2feb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2fec0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
2fed0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
2fee0 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c  pBy, regBase, 0,
2fef0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d   0);.        j =
2ff00 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
2ff10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
2ff20 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
2ff30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2ff40 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
2ff50 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
2ff60 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
2ff70 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2ff80 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ->iSorterColumn>
2ff90 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
2ffa0 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72    int r1 = j + r
2ffb0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2ffc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2ffd0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  odeGetColumnToRe
2ffe0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
2fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30000 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
30010 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
30020 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
30030 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
30040 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
30050 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30060 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64         regRecord
30070 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
30080 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
30090 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
300a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
300b0 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
300c0 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f  e, nCol, regReco
300d0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
300e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
300f0 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
30100 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
30110 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
30120 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
30130 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
30140 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
30150 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
30160 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
30170 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
30180 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
30190 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
301a0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
301b0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
301c0 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d  sortingIdxPTab =
301d0 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72   sortPTab = pPar
301e0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
301f0 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71      sortOut = sq
30200 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
30210 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
30220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30230 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
30240 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73  udo, sortPTab, s
30250 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20  ortOut, nCol);. 
30260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30270 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
30280 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49  orterSort, sAggI
30290 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
302a0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
302b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
302c0 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74  , "GROUP BY sort
302d0 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ")); VdbeCoverag
302e0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41  e(v);.        sA
302f0 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
30300 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
30310 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
30320 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
30330 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ..      }..     
30340 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
30350 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61   or temporary ta
30360 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ble used by the 
30370 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20  GROUP BY sort.  
30380 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75      ** will natu
30390 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f  rally deliver ro
303a0 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ws in the order 
303b0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
303c0 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a  ORDER BY.      *
303d0 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c  * clause, cancel
303e0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
303f0 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20  able open coded 
30400 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a  earlier..      *
30410 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
30420 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
30430 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74  on - the correct
30440 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72   answer should r
30450 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73  esult regardless
30460 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74  ..      ** Use t
30470 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  he SQLITE_GroupB
30480 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68  yOrder flag with
30490 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
304a0 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20  _OPTIMIZER to . 
304b0 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
304c0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
304d0 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  n for testing pu
304e0 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20  rposes.  */.    
304f0 20 20 69 66 28 20 6f 72 64 65 72 42 79 47 72 70    if( orderByGrp
30500 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
30510 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
30520 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29  TE_GroupByOrder)
30530 20 0a 20 20 20 20 20 20 20 26 26 20 28 67 72 6f   .       && (gro
30540 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69  upBySort || sqli
30550 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
30560 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20  (pWInfo)).      
30570 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
30580 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
30590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
305a0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
305b0 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
305c0 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a  Index);.      }.
305d0 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
305e0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
305f0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
30600 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
30610 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
30620 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
30630 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
30640 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
30650 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
30660 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
30670 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
30680 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
30690 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
306a0 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
306b0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
306c0 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
306d0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
306e0 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
306f0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
30700 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
30710 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
30720 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
30730 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
30740 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
30750 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
30760 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30770 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
30780 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
30790 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
307a0 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
307b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
307c0 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62  ortOut, sortPTab
307d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
307e0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
307f0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
30800 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
30810 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
30820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30830 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
30840 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
30850 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
30860 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30870 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
30880 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
30890 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
308a0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
308b0 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
308c0 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
308d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
308e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
308f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
30900 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
30910 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
30920 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
30930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30940 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
30950 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
30960 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
30970 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72  NFO);.      addr
30980 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
30990 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
309a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
309b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
309c0 70 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c 20 61  p, addr1+1, 0, a
309d0 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76  ddr1+1); VdbeCov
309e0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
309f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
30a00 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
30a10 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
30a20 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
30a30 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74   ** Changes in t
30a40 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20  he GROUP BY are 
30a50 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
30a60 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
30a70 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49      ** block.  I
30a80 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
30a90 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c  changes, this bl
30aa0 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  ock is skipped..
30ab0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
30ac0 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69  * This code copi
30ad0 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70  es current group
30ae0 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c   by terms in b0,
30af0 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20  b1,b2,....      
30b00 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31  ** over to a0,a1
30b10 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61  ,a2.  It then ca
30b20 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73  lls the output s
30b30 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
30b40 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  ** and resets th
30b50 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
30b60 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
30b70 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  s in preparation
30b80 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
30b90 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20  e next GROUP BY 
30ba0 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  batch..      */.
30bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
30bc0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
30bd0 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20  , iBMem, iAMem, 
30be0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29  pGroupBy->nExpr)
30bf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30c00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30c10 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
30c20 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
30c30 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
30c40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
30c50 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
30c60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30c70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
30c80 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
30c90 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f  addrEnd); VdbeCo
30ca0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
30cb0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
30cc0 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
30cd0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
30ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
30cf0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
30d00 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
30d10 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
30d20 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
30d30 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
30d40 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
30d50 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
30d60 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
30d70 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
30d80 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
30d90 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
30da0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
30db0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
30dc0 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
30dd0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
30de0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
30df0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
30e00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
30e10 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
30e20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
30e30 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
30e40 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
30e50 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
30e60 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
30e70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
30e80 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
30e90 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
30ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30eb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
30ec0 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49  orterNext, sAggI
30ed0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
30ee0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a  addrTopOfLoop);.
30ef0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
30f00 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
30f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
30f20 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
30f30 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
30f40 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
30f50 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
30f60 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20  rtingIdx);.     
30f70 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
30f80 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
30f90 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
30fa0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
30fb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30fc0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
30fd0 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
30fe0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
30ff0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
31000 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22  utput final row"
31010 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  ));..      /* Ju
31020 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72  mp over the subr
31030 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f  outines.      */
31040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
31050 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e  beGoto(v, addrEn
31060 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
31070 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
31080 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
31090 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
310a0 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
310b0 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
310c0 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
310d0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
310e0 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
310f0 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
31100 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
31110 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
31120 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
31130 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
31140 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
31150 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
31160 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
31170 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
31180 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
31190 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
311a0 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
311b0 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
311c0 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
311d0 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
311e0 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
311f0 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
31200 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
31210 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
31220 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
31230 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31240 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
31250 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
31260 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
31270 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
31280 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
31290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
312a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
312b0 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
312c0 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
312d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
312e0 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
312f0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
31300 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
31310 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
31320 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
31330 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
31340 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
31350 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
31360 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
31370 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
31380 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
31390 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
313a0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
313b0 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
313c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
313d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
313e0 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
313f0 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
31400 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
31410 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
31420 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
31430 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
31440 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
31450 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
31460 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
31470 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
31480 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
31490 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
314a0 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20  1, &sSort,.     
314b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314c0 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
314d0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
314e0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
314f0 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
31500 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
31510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31520 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
31530 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
31540 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
31550 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
31560 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
31570 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
31580 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
31590 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
315a0 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
315b0 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
315c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
315d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
315e0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
315f0 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
31600 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
31610 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
31620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
31630 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
31640 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
31650 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
31660 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
31670 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
31680 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
31690 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
316a0 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
316b0 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
316c0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
316d0 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
316e0 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
316f0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
31700 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
31710 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
31720 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
31730 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
31740 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
31750 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31760 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
31770 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
31780 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
31790 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
317a0 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
317b0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
317c0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
317d0 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
317e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
317f0 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
31800 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
31810 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
31820 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
31830 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
31840 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
31850 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
31860 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
31870 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
31880 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
31890 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
318a0 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
318b0 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
318c0 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
318d0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
318e0 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
318f0 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
31900 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
31910 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
31920 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
31930 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
31940 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
31950 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
31960 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
31970 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
31980 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
31990 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
319a0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
319b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
319c0 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
319d0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
319e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
319f0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
31a00 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
31a10 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
31a20 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
31a30 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
31a40 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
31a50 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
31a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a70 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
31a80 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
31a90 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
31aa0 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
31ab0 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
31ac0 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
31ad0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
31ae0 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
31af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31b00 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
31b10 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
31b20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
31b30 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
31b40 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
31b50 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
31b60 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
31b70 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
31b80 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
31b90 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
31ba0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31bb0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
31bc0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
31bd0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
31be0 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
31bf0 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
31c00 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
31c10 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f  e lowest scan co
31c20 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st..        **. 
31c30 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d         ** (2011-
31c40 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f  04-15) Do not do
31c50 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20   a full scan of 
31c60 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64  an unordered ind
31c70 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
31c80 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d         ** (2013-
31c90 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f  10-03) Do not co
31ca0 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20  unt the entries 
31cb0 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  in a partial ind
31cc0 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
31cd0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61         ** In pra
31ce0 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66  ctice the KeyInf
31cf0 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c  o structure will
31d00 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74   not be used. It
31d10 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20   is only .      
31d20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b    ** passed to k
31d30 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  eep OP_OpenRead 
31d40 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a  happy..        *
31d50 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48  /.        if( !H
31d60 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
31d70 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pBest = sqlite3P
31d80 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
31d90 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  Tab);.        fo
31da0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
31db0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
31dc0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
31dd0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
31de0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
31df0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
31e00 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  dx->szIdxRow<pTa
31e10 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20  b->szTabRow.    
31e20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
31e30 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
31e40 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
31e50 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e  !pBest || pIdx->
31e60 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e  szIdxRow<pBest->
31e70 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20  szIdxRow).      
31e80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
31e90 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
31ea0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
31ec0 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
31ed0 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42        iRoot = pB
31ee0 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  est->tnum;.     
31ef0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
31f00 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
31f10 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42  Index(pParse, pB
31f20 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
31f30 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
31f40 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
31f50 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
31f60 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
31f70 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
31f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
31f90 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
31fa0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
31fb0 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31  r, iRoot, iDb, 1
31fc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31fd0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
31fe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31ff0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
32000 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
32010 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
32020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32030 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32040 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
32050 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61  iCsr, sAggInfo.a
32060 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20  Func[0].iMem);. 
32070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
32080 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
32090 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20  lose, iCsr);.   
320a0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70       explainSimp
320b0 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20  leCount(pParse, 
320c0 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20  pTab, pBest);.  
320d0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
320e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
320f0 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
32100 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
32110 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75   Check if the qu
32120 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ery is of one of
32130 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
32140 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  orms:.        **
32150 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
32160 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d  LECT min(x) FROM
32170 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20   ....        ** 
32180 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20    SELECT max(x) 
32190 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
321a0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
321b0 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73  f it is, then as
321c0 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68  k the code in wh
321d0 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74  ere.c to attempt
321e0 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73   to sort results
321f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69  .        ** as i
32200 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22  f there was an "
32210 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22  ORDER ON x" or "
32220 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22  ORDER ON x DESC"
32230 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20   clause. .      
32240 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20    ** If where.c 
32250 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75  is able to produ
32260 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65  ce results sorte
32270 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c  d in this order,
32280 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
32290 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74   add vdbe code t
322a0 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
322b0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  he processing lo
322c0 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20  op after the .  
322d0 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69        ** first i
322e0 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20  teration (since 
322f0 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
32300 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
32310 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  is .        ** g
32320 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65  uaranteed to ope
32330 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20  rate on the row 
32340 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d  with the minimum
32350 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20   or maximum .   
32360 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
32370 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77   x, the only row
32380 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20   required)..    
32390 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
323a0 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67  * A special flag
323b0 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
323c0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
323d0 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74  egin() to slight
323e0 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ly.        ** mo
323f0 64 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73  dify behavior as
32400 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
32410 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
32420 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79    + If the query
32430 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69   is a "SELECT mi
32440 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20  n(x)", then the 
32450 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20  loop coded by.  
32460 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65        **     whe
32470 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20  re.c should not 
32480 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79  iterate over any
32490 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e   values with a N
324a0 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ULL value.      
324b0 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a    **     for x..
324c0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
324d0 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70     **   + The op
324e0 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20  timizer code in 
324f0 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69  where.c (the thi
32500 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20  ng that decides 
32510 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
32520 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e       index or in
32530 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68  dices to use) sh
32540 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66  ould place a dif
32550 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20  ferent priority 
32560 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  on .        **  
32570 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68     satisfying th
32580 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61  e 'ORDER BY' cla
32590 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73  use than it does
325a0 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e   in other cases.
325b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
325c0 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e  Refer to code an
325d0 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68  d comments in wh
325e0 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c  ere.c for detail
325f0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
32600 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
32610 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20  pMinMax = 0;.   
32620 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57       u8 flag = W
32630 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
32640 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  MAL;.        .  
32650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
32660 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
32670 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32680 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flag==0 );.     
32690 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e     if( p->pHavin
326a0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
326b0 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51    flag = minMaxQ
326c0 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20  uery(&sAggInfo, 
326d0 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20  &pMinMax);.     
326e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
326f0 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20  ert( flag==0 || 
32700 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70  (pMinMax!=0 && p
32710 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
32720 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ) );..        if
32730 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
32740 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71      pMinMax = sq
32750 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
32760 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29  (db, pMinMax, 0)
32770 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  ;.          pDel
32780 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20   = pMinMax;.    
32790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
327a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
327b0 7c 20 70 4d 69 6e 4d 61 78 21 3d 30 20 29 3b 0a  | pMinMax!=0 );.
327c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 64            if( !d
327d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
327e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
327f0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
32800 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
32810 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
32820 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
32830 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
32840 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
32850 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
32860 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
32870 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
32880 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
32890 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
328a0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
328b0 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
328c0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
328d0 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
328e0 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
328f0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
32900 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
32910 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
32920 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
32930 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
32940 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
32950 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
32960 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
32970 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
32980 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
32990 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20  ax,0,flag,0);.  
329a0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
329b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
329c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
329d0 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
329e0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
329f0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
32a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
32a10 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
32a20 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
32a30 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  fo);.        ass
32a40 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20  ert( pMinMax==0 
32a50 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  || pMinMax->nExp
32a60 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  r==1 );.        
32a70 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
32a80 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
32a90 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>0 ){.         
32aa0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
32ab0 28 76 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65  (v, sqlite3Where
32ac0 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
32ad0 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  o));.          V
32ae0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
32af0 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a  %s() by index",.
32b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b10 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44  (flag==WHERE_ORD
32b20 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22  ERBY_MIN?"min":"
32b30 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20  max")));.       
32b40 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
32b50 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
32b60 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61  o);.        fina
32b70 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
32b80 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
32b90 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  fo);.      }..  
32ba0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
32bb0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  By = 0;.      sq
32bc0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
32bd0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
32be0 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54  , addrEnd, SQLIT
32bf0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
32c00 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
32c10 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
32c20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30  p->pEList, -1, 0
32c30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
32c40 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
32c50 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
32c60 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  End);.      sqli
32c70 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
32c80 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
32c90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
32ca0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
32cb0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
32cc0 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
32cd0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
32ce0 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e 63  ..  if( sDistinc
32cf0 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  t.eTnctType==WHE
32d00 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
32d10 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70  DERED ){.    exp
32d20 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
32d30 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22  arse, "DISTINCT"
32d40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
32d50 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
32d60 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
32d70 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
32d80 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
32d90 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
32da0 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
32db0 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
32dc0 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
32dd0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78  rderBy ){.    ex
32de0 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
32df0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
32e00 20 20 20 20 20 20 20 20 20 20 20 20 73 53 6f 72              sSor
32e10 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49  t.nOBSat>0 ? "RI
32e20 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45  GHT PART OF ORDE
32e30 52 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22  R BY":"ORDER BY"
32e40 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  );.    generateS
32e50 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
32e60 70 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73  p, &sSort, pELis
32e70 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
32e80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
32e90 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
32ea0 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
32eb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
32ec0 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
32ed0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
32ee0 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
32ef0 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  d. If there is a
32f00 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50  n error in the P
32f10 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a  arse structure,.
32f20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74    ** set the ret
32f30 75 72 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f  urn code to 1. O
32f40 74 68 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20  therwise 0. */. 
32f50 20 72 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e   rc = (pParse->n
32f60 45 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f  Err>0);..  /* Co
32f70 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
32f80 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
32f90 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
32fa0 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
32fb0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
32fc0 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
32fd0 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
32fe0 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65  end:.  explainSe
32ff0 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
33000 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
33010 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a  toreSelectId);..
33020 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
33030 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65  lumn names if re
33040 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c  sults of the SEL
33050 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75  ECT are to be ou
33060 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
33070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33080 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  & pDest->eDest==
33090 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
330a0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
330b0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
330c0 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
330d0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44  .  }..  sqlite3D
330e0 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
330f0 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  fo.aCol);.  sqli
33100 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
33110 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23  ggInfo.aFunc);.#
33120 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
33130 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54  NABLED.  SELECTT
33140 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
33150 28 22 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67  ("end processing
33160 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72 73 65 2d  \n"));.  pParse-
33170 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d  >nSelectIndent--
33180 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
33190 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.