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

Artifact 668c6865b16813dab5f9c18d3672fed11a5c34c5:


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 73 71 6c  r, 0);.      sql
1bcd0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1bce0 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
1bcf0 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1bd00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1bd10 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
1bd20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1bd30 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
1bd40 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1bd50 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1bd60 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1bd70 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
1bd80 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1bd90 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1bda0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1bdb0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1bdc0 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1bdd0 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
1bde0 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1bdf0 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20 20  pEList, 1);.    
1be00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62  }else{.      sub
1be10 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1be20 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  Expr->x.pList, i
1be30 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1be40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1be50 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74  rn pExpr;.}.stat
1be60 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
1be70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33  rList(.  sqlite3
1be80 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
1be90 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
1bea0 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
1beb0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
1bec0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
1bed0 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63  scan and in whic
1bee0 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1bef0 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tutes */.  int i
1bf00 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
1bf10 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
1bf20 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
1bf30 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1bf40 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
1bf50 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  te values */.){.
1bf60 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1bf70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1bf80 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1bf90 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1bfa0 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
1bfb0 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
1bfc0 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Expr(db, pList->
1bfd0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
1bfe0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
1bff0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1c000 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71  ubstSelect(.  sq
1c010 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1c020 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
1c030 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
1c040 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1c050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
1c060 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1c070 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
1c080 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a  ubstitutions */.
1c090 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1c0a0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1c0b0 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a  to be replaced *
1c0c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1c0d0 4c 69 73 74 2c 20 20 20 20 2f 2a 20 53 75 62 73  List,    /* Subs
1c0e0 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
1c0f0 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20 20  .  int doPrior  
1c100 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75          /* Do su
1c110 62 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e  bstitutes on p->
1c120 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b  pPrior too */.){
1c130 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1c140 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1c150 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1c160 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
1c170 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f  p ) return;.  do
1c180 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
1c190 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ist(db, p->pELis
1c1a0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1c1b0 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
1c1c0 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
1c1d0 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
1c1e0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
1c1f0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1c200 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c  >pOrderBy, iTabl
1c210 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1c220 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  p->pHaving = sub
1c230 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
1c240 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
1c250 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
1c260 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1c270 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  r(db, p->pWhere,
1c280 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1c290 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e  ;.    pSrc = p->
1c2a0 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  pSrc;.    assert
1c2b0 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ( pSrc!=0 );.   
1c2c0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1c2d0 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
1c2e0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
1c2f0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
1c300 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65  tSelect(db, pIte
1c310 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  m->pSelect, iTab
1c320 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a  le, pEList, 1);.
1c330 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1c340 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
1c350 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78  .        substEx
1c360 70 72 4c 69 73 74 28 64 62 2c 20 70 49 74 65 6d  prList(db, pItem
1c370 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 69  ->u1.pFuncArg, i
1c380 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1c390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c3a0 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72 20  }while( doPrior 
1c3b0 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f  && (p = p->pPrio
1c3c0 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69  r)!=0 );.}.#endi
1c3d0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
1c3e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1c3f0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1c400 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1c410 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
1c420 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1c430 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1c440 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1c450 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
1c460 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
1c470 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
1c480 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65  bqueries as a pe
1c490 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
1c4a0 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  zation..** This 
1c4b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1c4c0 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
1c4d0 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
1c4e0 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63  o flattening occ
1c4f0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
1c500 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
1c510 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
1c520 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
1c530 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
1c540 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
1c550 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
1c560 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1c570 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1c580 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
1c590 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
1c5a0 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
1c5b0 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
1c5c0 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
1c5d0 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
1c5e0 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
1c5f0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
1c600 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
1c610 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
1c620 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
1c630 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
1c640 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
1c650 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
1c660 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
1c670 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
1c680 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
1c690 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
1c6a0 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
1c6b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
1c6c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c6d0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
1c6e0 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
1c6f0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1c700 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
1c710 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
1c720 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
1c730 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
1c740 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
1c750 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1c760 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1c770 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
1c780 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
1c790 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
1c7a0 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69   for this simpli
1c7b0 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
1c7c0 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
1c7d0 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
1c7e0 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
1c7f0 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
1c800 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
1c810 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
1c820 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
1c830 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
1c840 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
1c850 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
1c860 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
1c870 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
1c880 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
1c890 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1c8a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
1c8b0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1c8c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c8d0 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
1c8e0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1c8f0 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
1c900 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1c910 61 67 67 72 65 67 61 74 65 20 6f 72 20 28 32 61  aggregate or (2a
1c920 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1c930 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  y is not a join.
1c940 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 28 32  **        and (2
1c950 62 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  b) the outer que
1c960 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c970 73 75 62 71 75 65 72 69 65 73 20 6f 74 68 65 72  subqueries other
1c980 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a   than the one.**
1c990 20 20 20 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61          FROM-cla
1c9a0 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61  use subquery tha
1c9b0 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  t is a candidate
1c9c0 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e   for flattening.
1c9d0 20 20 28 32 62 20 69 73 0a 2a 2a 20 20 20 20 20    (2b is.**     
1c9e0 20 20 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74     due to ticket
1c9f0 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1ca00 66 38 30 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30  f80] from 2015-0
1ca10 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1ca20 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1ca30 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
1ca40 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
1ca50 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a  eft outer join.*
1ca60 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e  *        (Origin
1ca70 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36  ally ticket #306
1ca80 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20  .  Strengthened 
1ca90 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29  by ticket #3300)
1caa0 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
1cab0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1cac0 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  t DISTINCT..**.*
1cad0 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
1cae0 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
1caf0 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
1cb00 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
1cb10 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
1cb20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
1cb30 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
1cb40 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
1cb50 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
1cb60 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
1cb70 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
1cb80 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
1cb90 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
1cba0 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
1cbb0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
1cbc0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1cbd0 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
1cbe0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
1cbf0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1cc00 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1cc10 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
1cc20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
1cc30 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
1cc40 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62    TODO:  For sub
1cc50 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a  queries without.
1cc60 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d  **        A FROM
1cc70 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65   clause, conside
1cc80 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20  r adding a FROM 
1cc90 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73  close with the s
1cca0 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1ccb0 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1ccc0 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1ccd0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1cce0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1ccf0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1cd00 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1cd10 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1cd20 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1cd30 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1cd40 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1cd50 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1cd60 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1cd70 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1cd80 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1cd90 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1cda0 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
1cdb0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1cdc0 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20  *)  Restriction 
1cdd0 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64  (10) was removed
1cde0 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f   from the code o
1cdf0 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74  n 2005-02-05 but
1ce00 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63   we.**        ac
1ce10 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64  cidently carried
1ce20 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72   the comment for
1ce30 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d  ward until 2014-
1ce40 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c  09-15.  Original
1ce50 0a 2a 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a  .**        text:
1ce60 20 22 54 68 65 20 73 75 62 71 75 65 72 79 20 64   "The subquery d
1ce70 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1ce80 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1ce90 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20  ter query .**   
1cea0 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 75 73       does not us
1ceb0 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20  e LIMIT.".**.** 
1cec0 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
1ced0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1cee0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1cef0 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
1cf00 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
1cf10 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
1cf20 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
1cf30 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1cf40 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
1cf50 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
1cf60 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
1cf70 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
1cf80 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
1cf90 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
1cfa0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1cfb0 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  nd outer query d
1cfc0 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  o not both use L
1cfd0 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
1cfe0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1cff0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
1d000 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
1d010 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1d020 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  y is not part of
1d030 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1d040 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  ct or the.**    
1d050 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65      subquery doe
1d060 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d  s not have a LIM
1d070 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
1d080 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
1d090 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
1d0a0 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
1d0b0 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68  .**.**  (16)  Th
1d0c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1d0d0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1d0e0 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72  e or the subquer
1d0f0 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20  y does.**       
1d100 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
1d110 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
1d120 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
1d130 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
1d140 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
1d150 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
1d160 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
1d170 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
1d180 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75  **  (17)  The su
1d190 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1d1a0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1d1b0 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49  , or it is a UNI
1d1c0 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20  ON ALL .**      
1d1d0 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73    compound claus
1d1e0 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65  e made up entire
1d1f0 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67  ly of non-aggreg
1d200 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64  ate queries, and
1d210 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20   .**        the 
1d220 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a  parent query:.**
1d230 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1d240 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72  s not itself par
1d250 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1d260 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20  select,.**      
1d270 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20      * is not an 
1d280 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53  aggregate or DIS
1d290 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64  TINCT query, and
1d2a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1d2b0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a  s not a join.**.
1d2c0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
1d2d0 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
1d2e0 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
1d2f0 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
1d300 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
1d310 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
1d320 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
1d330 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
1d340 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
1d350 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
1d360 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
1d370 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
1d380 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
1d390 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1d3a0 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
1d3b0 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
1d3c0 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
1d3d0 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
1d3e0 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1d3f0 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
1d400 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
1d410 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
1d420 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
1d430 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
1d440 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
1d450 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1d460 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1d470 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
1d480 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
1d490 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
1d4a0 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
1d4b0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
1d4c0 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
1d4d0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1d4e0 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
1d4f0 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
1d500 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
1d510 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
1d520 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
1d530 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
1d540 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
1d550 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
1d560 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
1d570 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
1d580 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
1d590 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
1d5a0 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
1d5b0 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
1d5c0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1d5d0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1d5e0 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1d5f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
1d600 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74  R by clause of t
1d610 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
1d620 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
1d630 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
1d640 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
1d650 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
1d660 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62  *  (19)  The sub
1d670 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1d680 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1d690 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1d6a0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
1d6b0 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
1d6c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20  se..**.**  (20) 
1d6d0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1d6e0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1d6f0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20  select, then it 
1d700 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  must not use.** 
1d710 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20         an ORDER 
1d720 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b  BY clause.  Tick
1d730 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f  et #3773.  We co
1d740 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63  uld relax this c
1d750 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20  onstraint.**    
1d760 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20      somewhat by 
1d770 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20  saying that the 
1d780 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1d790 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73  ER BY clause mus
1d7a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65  t.**        appe
1d7b0 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64  ar as unmodified
1d7c0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
1d7d0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1d7e0 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20  ry.  But we.**  
1d7f0 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
1d800 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
1d810 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
1d820 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
1d830 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20  *.**  (21)  The 
1d840 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1d850 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1d860 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1d870 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1d880 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
1d890 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
1d8a0 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32  fc])..**.**  (22
1d8b0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1d8c0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
1d8d0 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28  ve CTE..**.**  (
1d8e0 32 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20  23)  The parent 
1d8f0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
1d900 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73  ve CTE, or the s
1d910 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
1d920 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70  a.**        comp
1d930 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73  ound query. This
1d940 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20   restriction is 
1d950 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72  because transfor
1d960 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ming the.**     
1d970 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63     parent to a c
1d980 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f  ompound query co
1d990 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20  nfuses the code 
1d9a0 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20  that handles.** 
1d9b0 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65         recursive
1d9c0 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74   queries in mult
1d9d0 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a  iSelect()..**.**
1d9e0 20 20 28 32 34 29 20 20 54 68 65 20 73 75 62 71    (24)  The subq
1d9f0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1da00 67 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73  ggregate that us
1da10 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  es the built-in 
1da20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20  min() or .**    
1da30 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e      or max() fun
1da40 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75  ctions.  (Withou
1da50 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
1da60 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65  on, a query like
1da70 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c  :.**        "SEL
1da80 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45  ECT x FROM (SELE
1da90 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f  CT max(y), x FRO
1daa0 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74  M t1)" would not
1dab0 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20   necessarily.** 
1dac0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
1dad0 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68  e value X for wh
1dae0 69 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61  ich Y was maxima
1daf0 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20  l.).**.**.** In 
1db00 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
1db10 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
1db20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1db30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1db40 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
1db50 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
1db60 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
1db70 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
1db80 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
1db90 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20   aggregates and 
1dba0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73  subqueryIsAgg is
1dbb0 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62   true if the sub
1dbc0 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
1dbd0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
1dbe0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
1dbf0 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
1dc00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1dc10 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
1dc20 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
1dc30 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
1dc40 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
1dc50 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
1dc60 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
1dc70 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
1dc80 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
1dc90 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
1dca0 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
1dcb0 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
1dcc0 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
1dcd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
1dce0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
1dcf0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1dd00 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1dd10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1dd20 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1dd30 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
1dd40 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
1dd50 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
1dd60 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
1dd70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1dd80 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
1dd90 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
1dda0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
1ddb0 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
1ddc0 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
1ddd0 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
1dde0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
1ddf0 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
1de00 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
1de10 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
1de20 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
1de30 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
1de40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1de50 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
1de60 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
1de70 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
1de80 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a   *pParent;    /*
1de90 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41   Current UNION A
1dea0 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f  LL term of the o
1deb0 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  ther query */.  
1dec0 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
1ded0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
1dee0 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
1def0 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
1df00 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
1df10 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
1df20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
1df30 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
1df40 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1df50 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
1df60 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1df70 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1df80 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
1df90 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
1dfa0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1dfb0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
1dfc0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
1dfd0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
1dfe0 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
1dff0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
1e000 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
1e010 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
1e020 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
1e030 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
1e040 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
1e050 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1e060 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1e070 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1e080 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
1e090 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1e0a0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1e0b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e0c0 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
1e0d0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
1e0e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1e0f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1e100 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
1e110 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
1e120 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
1e130 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
1e140 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1e150 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
1e160 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
1e170 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  ;  /* Unable to 
1e180 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64  flatten compound
1e190 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66   queries */.  if
1e1a0 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
1e1b0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
1e1c0 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
1e1d0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1e1e0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1e1f0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
1e200 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
1e210 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
1e220 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
1e230 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
1e240 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
1e250 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
1e260 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
1e270 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
1e280 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
1e290 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
1e2a0 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 69  Agg ){.    if( i
1e2b0 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2e0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1e2f0 31 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  1)   */.    if( 
1e300 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
1e310 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e330 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e340 28 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66 28  (2a)  */.    if(
1e350 20 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20 45   (p->pWhere && E
1e360 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e370 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62 71  ->pWhere,EP_Subq
1e380 75 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20 28  uery)).     || (
1e390 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
1e3a0 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29 20  lags(p->pEList) 
1e3b0 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d  & EP_Subquery)!=
1e3c0 30 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74  0.     || (sqlit
1e3d0 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
1e3e0 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20 45  p->pOrderBy) & E
1e3f0 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20  P_Subquery)!=0. 
1e400 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1e410 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e440 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1e450 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  b)  */.    }.  }
1e460 0a 20 20 20 20 0a 20 20 70 53 75 62 53 72 63 20  .    .  pSubSrc 
1e470 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
1e480 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
1e490 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
1e4a0 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
1e4b0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1e4c0 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
1e4d0 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
1e4e0 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
1e4f0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
1e500 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d  , we allowed som
1e510 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c  e combining of L
1e520 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
1e530 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
1e540 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75  y could be compu
1e550 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
1e560 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c  ime.  But when L
1e570 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
1e580 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69    ** became arbi
1e590 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1e5a0 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  s, we were force
1e5b0 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63  d to add restric
1e5c0 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20  tions (13).  ** 
1e5d0 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69  and (14). */.  i
1e5e0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1e5f0 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  && p->pLimit ) r
1e600 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e610 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e620 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69  tion (13) */.  i
1e630 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  f( pSub->pOffset
1e640 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e670 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69  tion (14) */.  i
1e680 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1e690 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d  & SF_Compound)!=
1e6a0 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  0 && pSub->pLimi
1e6b0 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
1e6c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e6f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
1e700 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
1e710 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
1e720 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e750 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (7)  */.  if( p
1e760 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1e770 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  SF_Distinct ) re
1e780 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1e790 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e7a0 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (5)  */.  if( p
1e7b0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1e7c0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
1e7d0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
1e7e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e7f0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1e800 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20   (8)(9) */.  }. 
1e810 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1e820 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1e830 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49  !=0 && subqueryI
1e840 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74  sAgg ){.     ret
1e850 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
1e860 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36  * Restriction (6
1e870 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  )  */.  }.  if( 
1e880 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
1e890 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1e8a0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1e8e0 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
1e8f0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
1e900 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1e910 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e930 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
1e940 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1e950 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
1e960 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e980 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
1e990 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1e9a0 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
1e9b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1e9c0 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
1e9d0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1e9e0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e9f0 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
1ea00 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d   testcase( pSub-
1ea10 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1ea20 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20 74 65  ecursive );.  te
1ea30 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65  stcase( pSub->se
1ea40 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d  lFlags & SF_MinM
1ea50 61 78 41 67 67 20 29 3b 0a 20 20 69 66 28 20 70  axAgg );.  if( p
1ea60 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1ea70 28 53 46 5f 52 65 63 75 72 73 69 76 65 7c 53 46  (SF_Recursive|SF
1ea80 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20  _MinMaxAgg) ){. 
1ea90 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
1eaa0 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32  Restrictions (22
1eab0 29 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20  ) and (24) */.  
1eac0 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
1ead0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
1eae0 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50  ive) && pSub->pP
1eaf0 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
1eb00 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
1eb10 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d  tion (23) */.  }
1eb20 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20  ..  /* OBSOLETE 
1eb30 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20  COMMENT 1:.  ** 
1eb40 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
1eb50 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1eb60 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
1eb70 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1eb80 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
1eb90 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
1eba0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
1ebb0 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
1ebc0 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
1ebd0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
1ebe0 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
1ebf0 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
1ec00 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
1ec10 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
1ec20 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
1ec30 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
1ec40 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
1ec50 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
1ec60 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
1ec70 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
1ec80 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
1ec90 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
1eca0 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
1ecb0 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
1ecc0 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 2:.  ** Restr
1ecd0 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
1ece0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
1ecf0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1ed00 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1ed10 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
1ed20 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
1ed30 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
1ed40 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
1ed50 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
1ed60 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
1ed70 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
1ed80 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
1ed90 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
1eda0 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
1edb0 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
1edc0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1edd0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1ede0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1edf0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1ee00 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1ee10 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
1ee20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
1ee30 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
1ee40 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
1ee50 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
1ee60 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
1ee70 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
1ee80 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
1ee90 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
1eea0 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  R JOIN..  **.  *
1eeb0 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53  * THIS OVERRIDES
1eec0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1eed0 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45  TS 1 AND 2 ABOVE
1eee0 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33  :.  ** Ticket #3
1eef0 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66  300 shows that f
1ef00 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69  lattening the ri
1ef10 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
1ef20 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20  FT JOIN.  ** is 
1ef30 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e  fraught with dan
1ef40 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76  ger.  Best to av
1ef50 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68  oid the whole th
1ef60 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  ing.  If the.  *
1ef70 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  * subquery is th
1ef80 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1ef90 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
1efa0 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
1efb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
1efc0 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  ubitem->fg.joint
1efd0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
1efe0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1eff0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
1f000 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
1f010 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1f020 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
1f030 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
1f040 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
1f050 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
1f060 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
1f070 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
1f080 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
1f090 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
1f0a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
1f0b0 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
1f0c0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
1f0d0 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
1f0e0 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
1f0f0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
1f100 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
1f110 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
1f120 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f130 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
1f140 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
1f150 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
1f160 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1f170 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
1f180 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
1f190 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1f1a0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
1f1b0 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
1f1c0 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
1f1d0 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
1f1e0 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1f1f0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1f200 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1f210 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
1f220 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
1f230 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1f240 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1f250 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1f260 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
1f270 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1f280 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30  t( pSub->pSrc!=0
1f290 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f2a0 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  ( pSub->pEList->
1f2b0 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45  nExpr==pSub1->pE
1f2c0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1f2d0 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d       if( (pSub1-
1f2e0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1f2f0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1f300 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20  egate))!=0.     
1f310 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72    || (pSub1->pPr
1f320 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70  ior && pSub1->op
1f330 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20  !=TK_ALL) .     
1f340 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
1f350 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 29  ->nSrc<1.      )
1f360 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1f370 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1f380 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1f390 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  1->pSrc->nSrc>1 
1f3a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1f3b0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
1f3c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
1f3d0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1f3e0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
1f3f0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
1f400 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
1f410 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
1f420 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
1f430 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  a[ii].u.x.iOrder
1f440 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
1f450 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1f460 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a   }.  }..  /*****
1f470 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1f480 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e  s point, flatten
1f490 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1f4a0 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43  . *****/.  SELEC
1f4b0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
1f4c0 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25  p,("flatten %s.%
1f4d0 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e  p from term %d\n
1f4e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f4f0 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c        pSub->zSel
1f500 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f  Name, pSub, iFro
1f510 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  m));..  /* Autho
1f520 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
1f530 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
1f540 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
1f550 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
1f560 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
1f570 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1f580 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
1f590 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
1f5a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
1f5b0 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
1f5c0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1f5d0 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
1f5e0 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
1f5f0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1f600 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1f610 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1f620 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
1f630 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
1f640 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
1f650 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
1f660 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
1f670 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
1f680 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
1f690 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
1f6a0 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
1f6b0 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
1f6c0 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
1f6d0 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
1f6e0 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
1f6f0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1f700 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
1f710 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
1f720 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
1f730 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
1f740 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1f750 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
1f760 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
1f770 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
1f780 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
1f790 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
1f7a0 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
1f7b0 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
1f7c0 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
1f7d0 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
1f7e0 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
1f7f0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
1f800 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
1f810 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
1f820 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
1f830 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
1f840 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
1f850 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
1f860 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
1f870 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1f880 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1f890 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1f8a0 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
1f8b0 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1f8c0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1f8d0 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1f8e0 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
1f8f0 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
1f900 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
1f910 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
1f920 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
1f930 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1f940 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
1f950 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
1f960 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
1f970 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
1f980 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
1f990 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
1f9a0 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1f9b0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1f9c0 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
1f9d0 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
1f9e0 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
1f9f0 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
1fa00 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
1fa10 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
1fa20 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1fa30 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
1fa40 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
1fa50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
1fa60 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1fa70 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
1fa80 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1fa90 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1faa0 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
1fab0 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
1fac0 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  imit;.    Expr *
1fad0 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
1fae0 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  fset;.    Select
1faf0 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
1fb00 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
1fb10 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
1fb20 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
1fb30 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1fb40 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
1fb50 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74  ;.    p->pOffset
1fb60 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
1fb70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
1fb80 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
1fb90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
1fba0 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62  tName(pNew, pSub
1fbb0 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20  ->zSelName);.   
1fbc0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
1fbd0 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c  ffset;.    p->pL
1fbe0 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
1fbf0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1fc00 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
1fc10 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
1fc20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c     p->op = TK_AL
1fc30 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  L;.    if( pNew=
1fc40 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 ){.      p->p
1fc50 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1fc60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fc70 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
1fc80 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
1fc90 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
1fca0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
1fcb0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65  .      pNew->pNe
1fcc0 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d  xt = p;.      p-
1fcd0 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a  >pPrior = pNew;.
1fce0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
1fcf0 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  E(2,pParse,p,.  
1fd00 20 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e         ("compoun
1fd10 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1fd20 65 6e 65 72 20 63 72 65 61 74 65 73 20 25 73 2e  ener creates %s.
1fd30 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20  %p as peer\n",. 
1fd40 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53          pNew->zS
1fd50 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a  elName, pNew));.
1fd60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
1fd70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1fd80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1fd90 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74    /* Begin flatt
1fda0 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d  ening the iFrom-
1fdb0 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
1fdc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a  FROM clause .  *
1fdd0 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  * in the outer q
1fde0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75  uery..  */.  pSu
1fdf0 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62  b = pSub1 = pSub
1fe00 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  item->pSelect;..
1fe10 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
1fe20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
1fe30 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
1fe40 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1fe50 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f  ** subquery.  */
1fe60 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1fe70 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1fe80 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c  Database);.  sql
1fe90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1fea0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
1feb0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1fec0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1fed0 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74  Alias);.  pSubit
1fee0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1fef0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
1ff00 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  Name = 0;.  pSub
1ff10 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30  item->zAlias = 0
1ff20 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  ;.  pSubitem->pS
1ff30 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  elect = 0;..  /*
1ff40 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20   Defer deleting 
1ff50 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
1ff60 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ff70 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1ff80 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ry until code ge
1ff90 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  neration is.  **
1ffa0 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65   complete, since
1ffb0 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c   there may still
1ffc0 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62   exist Expr.pTab
1ffd0 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20   entries that.  
1ffe0 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ** refer to the 
1fff0 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66  subquery even af
20000 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  ter flattening. 
20010 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20   Ticket #3346.. 
20020 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65   **.  ** pSubite
20030 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79  m->pTab is alway
20040 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65  s non-NULL by te
20050 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  st restrictions 
20060 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e  and tests above.
20070 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  .  */.  if( ALWA
20080 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  YS(pSubitem->pTa
20090 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62  b!=0) ){.    Tab
200a0 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20  le *pTabToDel = 
200b0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
200c0 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65      if( pTabToDe
200d0 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20  l->nRef==1 ){.  
200e0 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c      Parse *pTopl
200f0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
20100 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
20110 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54  se);.      pTabT
20120 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69  oDel->pNextZombi
20130 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70  e = pToplevel->p
20140 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20  ZombieTab;.     
20150 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
20160 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44  bieTab = pTabToD
20170 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  el;.    }else{. 
20180 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
20190 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nRef--;.    }.  
201a0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
201b0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
201c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
201d0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
201e0 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
201f0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
20200 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
20210 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
20220 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
20230 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
20240 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
20250 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
20260 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
20270 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
20280 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
20290 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
202a0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
202b0 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
202c0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
202d0 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
202e0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
202f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
20300 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
20310 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20320 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
20330 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
20340 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
20350 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
20360 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
20370 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
20380 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
20390 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
203a0 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
203b0 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
203c0 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
203d0 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
203e0 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
203f0 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
20400 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
20410 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
20420 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
20430 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
20440 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
20450 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
20460 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
20470 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
20480 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
20490 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
204a0 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
204b0 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
204c0 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
204d0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
204e0 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
204f0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
20500 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
20510 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
20520 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
20530 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
20540 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
20550 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
20560 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
20570 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
20580 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
20590 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
205a0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
205b0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
205c0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
205d0 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
205e0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
205f0 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
20600 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
20610 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
20620 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
20630 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
20640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20650 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
20660 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
20670 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
20680 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
20690 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
206a0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
206b0 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
206c0 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
206d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
206e0 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
206f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
20700 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20710 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
20720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20730 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
20740 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
20750 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
20760 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
20770 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
20780 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
20790 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
207a0 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
207b0 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
207c0 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
207d0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
207e0 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
207f0 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
20800 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
20810 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
20820 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
20830 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
20840 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
20850 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
20860 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
20870 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
20880 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
20890 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
208a0 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
208b0 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
208c0 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
208d0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
208e0 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
208f0 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
20900 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
20910 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
20920 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
20930 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
20940 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20950 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34  FROM clause to 4
20960 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
20970 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69  he middle slot i
20980 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
20990 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
209a0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20   to make space. 
209b0 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77     ** for the tw
209c0 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
209d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
209e0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
209f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
20a00 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
20a10 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
20a20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
20a30 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
20a40 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
20a50 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
20a60 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
20a70 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
20a80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20a90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
20aa0 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
20ab0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
20ac0 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
20ad0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
20ae0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
20af0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
20b00 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
20b10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
20b20 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
20b30 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
20b40 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
20b50 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
20b60 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61  i+iFrom].fg.isTa
20b70 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
20b80 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
20b90 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
20ba0 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
20bb0 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
20bc0 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
20bd0 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
20be0 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
20bf0 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  rom].fg.jointype
20c00 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a   = jointype;.  .
20c10 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e      /* Now begin
20c20 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
20c30 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
20c40 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
20c50 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  r .    ** refere
20c60 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
20c70 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
20c80 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a   query..    ** .
20c90 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
20ca0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
20cb0 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
20cc0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
20cd0 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
20ce0 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
20cf0 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c   a>b;.    **   \
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
20d20 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
20d30 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
20d40 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f    /.    **    \_
20d50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20d60 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
20d70 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
20d80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
20d90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
20da0 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
20db0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
20dc0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
20dd0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
20de0 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20   see.    ** "a" 
20df0 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
20e00 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
20e10 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
20e20 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
20e30 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  10"..    */.    
20e40 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d  pList = pParent-
20e50 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
20e60 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
20e70 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
20e80 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
20e90 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ].zName==0 ){.  
20ea0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
20eb0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
20ec0 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
20ed0 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
20ee0 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
20ef0 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  te(zName);.     
20f00 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
20f10 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
20f20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20f30 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
20f40 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  By ){.      /* A
20f50 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e  t this point, an
20f60 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65  y non-zero iOrde
20f70 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e  rByCol values in
20f80 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a  dicate that the.
20f90 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
20fa0 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  Y column express
20fb0 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c  ion is identical
20fc0 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79   to the iOrderBy
20fd0 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20  Col'th.      ** 
20fe0 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72  expression retur
20ff0 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74  ned by SELECT st
21000 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69  atement pSub. Si
21010 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  nce these values
21020 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  .      ** do not
21030 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72   necessarily cor
21040 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d  respond to colum
21050 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61  ns in SELECT sta
21060 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a  tement pParent,.
21070 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68        ** zero th
21080 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66  em before transf
21090 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  ering the ORDER 
210a0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
210b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
210c0 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20   doing this may 
210d0 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69  cause an error i
210e0 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63  f a subsequent c
210f0 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
21100 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74    ** function at
21110 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
21120 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  n a compound sub
21130 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72  -query into pPar
21140 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68  ent.      ** (th
21150 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20  e only way this 
21160 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66  can happen is if
21170 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
21180 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20  b-query is.     
21190 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61   ** currently pa
211a0 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63  rt of pSub->pSrc
211b0 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64  ). See ticket [d
211c0 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a  11a6e908f].  */.
211d0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
211e0 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
211f0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
21200 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
21210 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
21220 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  ){.        pOrde
21230 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  rBy->a[i].u.x.iO
21240 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20  rderByCol = 0;. 
21250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
21260 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
21270 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
21280 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
21290 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
212a0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
212b0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
212c0 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f  ;.      pSub->pO
212d0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
212e0 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73  }.    pWhere = s
212f0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
21300 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20  , pSub->pWhere, 
21310 30 29 3b 0a 20 20 20 20 69 66 28 20 73 75 62 71  0);.    if( subq
21320 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
21330 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21340 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29  nt->pHaving==0 )
21350 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21360 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65  >pHaving = pPare
21370 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  nt->pWhere;.    
21380 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
21390 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
213a0 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
213b0 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
213c0 41 6e 64 28 64 62 2c 20 0a 20 20 20 20 20 20 20  And(db, .       
213d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
213e0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
213f0 69 6e 67 2c 20 30 29 2c 20 70 50 61 72 65 6e 74  ing, 0), pParent
21400 2d 3e 70 48 61 76 69 6e 67 0a 20 20 20 20 20 20  ->pHaving.      
21410 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21420 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
21430 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
21440 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
21450 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
21460 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  stDup(db, pSub->
21470 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20  pGroupBy, 0);.  
21480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21490 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
214a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
214b0 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72  db, pWhere, pPar
214c0 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  ent->pWhere);.  
214d0 20 20 7d 0a 20 20 20 20 73 75 62 73 74 53 65 6c    }.    substSel
214e0 65 63 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2c  ect(db, pParent,
214f0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
21500 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 0a 20  pEList, 0);.  . 
21510 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
21520 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
21530 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
21540 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
21550 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
21560 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
21570 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
21580 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
21590 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
215a0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
215b0 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
215c0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
215d0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
215e0 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
215f0 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
21600 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
21610 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
21620 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
21630 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
21640 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
21650 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
21660 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
21670 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
21680 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
21690 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
216a0 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
216b0 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
216c0 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
216d0 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
216e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
216f0 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
21700 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
21710 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
21720 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
21730 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
21740 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
21750 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
21760 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
21770 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
21780 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
21790 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
217a0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
217b0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
217c0 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  After flattening
217d0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
217e0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
217f0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
21800 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
21810 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
21820 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21830 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
21840 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
21850 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
21860 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
21870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21880 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
21890 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
218a0 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63  EW)./*.** Make c
218b0 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e  opies of relevan
218c0 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  t WHERE clause t
218d0 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65  erms of the oute
218e0 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20  r query into.** 
218f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
21900 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45   of subquery.  E
21910 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
21920 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
21930 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
21940 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29  -d AS y FROM t1)
21950 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
21960 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  =10;.**.** Trans
21970 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a  formed into:.**.
21980 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
21990 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
219a0 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
219b0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41  M t1 WHERE a=5 A
219c0 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20  ND c-d=10).**   
219d0 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20    WHERE x=5 AND 
219e0 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  y=10;.**.** The 
219f0 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65  hope is that the
21a00 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20   terms added to 
21a10 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
21a20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72  will make it mor
21a30 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a  e.** efficient..
21a40 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  **.** Do not att
21a50 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69  empt this optimi
21a60 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  zation if:.**.**
21a70 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e 65 72     (1) The inner
21a80 20 71 75 65 72 79 20 69 73 20 61 6e 20 61 67 67   query is an agg
21a90 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74 68 61  regate.  (In tha
21aa0 74 20 63 61 73 65 2c 20 77 65 27 64 20 72 65 61  t case, we'd rea
21ab0 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20  lly want.**     
21ac0 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 75    to copy the ou
21ad0 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
21ae0 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
21af0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66  HAVING clause of
21b00 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
21b10 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ner query.  But 
21b20 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20 77 6f  they probably wo
21b30 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65 20 73  n't help there s
21b40 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e  o do not bother.
21b50 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68  ).**.**   (2) Th
21b60 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
21b70 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
21b80 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20  art of a common 
21b90 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
21ba0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68  ..**.**   (3) Th
21bb0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61  e inner query ha
21bc0 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
21bd0 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e   (since the chan
21be0 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  ges to the WHERE
21bf0 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20  .**       close 
21c00 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
21c10 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
21c20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
21c30 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
21c40 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21c50 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21c60 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63  FT JOIN.  (The c
21c70 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65  aller.**       e
21c80 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72 65 73  nforces this res
21c90 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74  triction since t
21ca0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
21cb0 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68   not have enough
21cc0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d  .**       inform
21cd0 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a  ation to know.).
21ce0 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
21cf0 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
21d00 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
21d10 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
21d20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
21d30 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
21d40 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  JOIN..**.** Retu
21d50 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67  rn 0 if no chang
21d60 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20  es are made and 
21d70 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20  non-zero if one 
21d80 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c  or more WHERE cl
21d90 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72  ause.** terms ar
21da0 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74  e duplicated int
21db0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  o the subquery..
21dc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75  */.static int pu
21dd0 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
21de0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
21df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21e00 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
21e10 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f 63  tion (for malloc
21e20 28 29 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ()) */.  Select 
21e30 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f  *pSubq,        /
21e40 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77  * The subquery w
21e50 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73  hose WHERE claus
21e60 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65  e is to be augme
21e70 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nted */.  Expr *
21e80 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
21e90 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
21ea0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
21eb0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
21ec0 69 43 75 72 73 6f 72 20 20 20 20 20 20 20 20 20  iCursor         
21ed0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
21ee0 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  er of the subque
21ef0 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  ry */.){.  Expr 
21f00 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68  *pNew;.  int nCh
21f10 6e 67 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74  ng = 0;.  Select
21f20 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
21f30 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
21f40 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ver compound SEL
21f50 45 43 54 73 20 69 6e 20 70 53 75 62 71 20 2a 2f  ECTs in pSubq */
21f60 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30  .  if( pWhere==0
21f70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
21f80 6f 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b  or(pX=pSubq; pX;
21f90 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
21fa0 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e 73 65  .    if( (pX->se
21fb0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 41 67 67  lFlags & (SF_Agg
21fc0 72 65 67 61 74 65 7c 53 46 5f 52 65 63 75 72 73  regate|SF_Recurs
21fd0 69 76 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ive))!=0 ){.    
21fe0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
21ff0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
22000 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
22010 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 73   testcase( pX->s
22020 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
22030 75 72 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20  ursive );.      
22040 74 65 73 74 63 61 73 65 28 20 70 58 21 3d 70 53  testcase( pX!=pS
22050 75 62 71 20 29 3b 0a 20 20 20 20 20 20 72 65 74  ubq );.      ret
22060 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
22070 63 74 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28  ctions (1) and (
22080 32 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  2) */.    }.  }.
22090 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69    if( pSubq->pLi
220a0 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  mit!=0 ){.    re
220b0 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72  turn 0; /* restr
220c0 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20  iction (3) */.  
220d0 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  }.  while( pWher
220e0 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
220f0 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75  .    nChng += pu
22100 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
22110 28 64 62 2c 20 70 53 75 62 71 2c 20 70 57 68 65  (db, pSubq, pWhe
22120 72 65 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72  re->pRight, iCur
22130 73 6f 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65  sor);.    pWhere
22140 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74   = pWhere->pLeft
22150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72  ;.  }.  if( Expr
22160 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65  HasProperty(pWhe
22170 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  re,EP_FromJoin) 
22180 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72  ) return 0; /* r
22190 65 73 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a  estriction 5 */.
221a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
221b0 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
221c0 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72  (pWhere, iCursor
221d0 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b  ) ){.    nChng++
221e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75  ;.    while( pSu
221f0 62 71 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  bq ){.      pNew
22200 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
22210 70 28 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29  p(db, pWhere, 0)
22220 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
22230 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4e 65  ubstExpr(db, pNe
22240 77 2c 20 69 43 75 72 73 6f 72 2c 20 70 53 75 62  w, iCursor, pSub
22250 71 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  q->pEList);.    
22260 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20    pSubq->pWhere 
22270 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
22280 28 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65  (db, pSubq->pWhe
22290 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  re, pNew);.     
222a0 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e   pSubq = pSubq->
222b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  pPrior;.    }.  
222c0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67  }.  return nChng
222d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
222e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
222f0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
22300 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
22310 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f  OMIT_VIEW) */../
22320 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68  *.** Based on th
22330 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22340 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
22350 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
22360 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
22370 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e  gument, this fun
22380 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
22390 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
223a0 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
223b0 20 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e   * the query con
223c0 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e  tains just a sin
223d0 67 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75  gle aggregate fu
223e0 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20  nction,.**    * 
223f0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
22400 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72  nction is either
22410 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c   min() or max(),
22420 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65   and.**    * the
22430 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
22440 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
22450 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
22460 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  value..**.** If 
22470 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
22480 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20   are true, then 
22490 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
224a0 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
224b0 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74  BY_MAX.** is ret
224c0 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72  urned as appropr
224d0 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d  iate. Also, *ppM
224e0 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  inMax is set to 
224f0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a  point to the .**
22500 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e   list of argumen
22510 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
22520 20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f 72   aggregate befor
22530 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
22540 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f  ** Or, if the co
22550 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61  nditions above a
22560 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d  re not met, *ppM
22570 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  inMax is set to 
22580 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f  0 and.** WHERE_O
22590 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73  RDERBY_NORMAL is
225a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
225b0 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75  atic u8 minMaxQu
225c0 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67  ery(AggInfo *pAg
225d0 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20  gInfo, ExprList 
225e0 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69  **ppMinMax){.  i
225f0 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f  nt eRet = WHERE_
22600 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20  ORDERBY_NORMAL; 
22610 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22620 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a  rn value */..  *
22630 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20  ppMinMax = 0;.  
22640 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
22650 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78  unc==1 ){.    Ex
22660 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67  pr *pExpr = pAgg
22670 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
22680 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61  Expr; /* Aggrega
22690 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  te function */. 
226a0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
226b0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
226c0 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72  List;      /* Ar
226d0 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66  guments to agg f
226e0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  unction */..    
226f0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
22700 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
22710 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  ON );.    if( pE
22720 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
22730 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69  nExpr==1 && pELi
22740 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
22750 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
22760 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  N ){.      const
22770 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70   char *zFunc = p
22780 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
22790 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
227a0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
227b0 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "min")==0 ){.   
227c0 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52       eRet = WHER
227d0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
227e0 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78         *ppMinMax
227f0 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20   = pEList;.     
22800 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
22810 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
22820 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20   "max")==0 ){.  
22830 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45        eRet = WHE
22840 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
22850 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61          *ppMinMa
22860 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  x = pEList;.    
22870 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
22880 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d   assert( *ppMinM
22890 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e  ax==0 || (*ppMin
228a0 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  Max)->nExpr==1 )
228b0 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b  ;.  return eRet;
228c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
228d0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
228e0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
228f0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
22900 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
22910 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
22920 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
22930 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
22940 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
22950 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
22960 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
22970 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
22980 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
22990 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
229a0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
229b0 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
229c0 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
229d0 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
229e0 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
229f0 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
22a00 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
22a10 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
22a20 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
22a30 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
22a40 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
22a50 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
22a60 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
22a70 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
22a80 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
22a90 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
22aa0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
22ab0 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
22ac0 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
22ad0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
22ae0 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
22af0 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
22b00 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
22b10 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
22b20 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
22b30 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
22b40 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
22b50 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
22b60 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
22b70 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
22b80 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
22b90 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
22ba0 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
22bb0 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
22bc0 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
22bd0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
22be0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22bf0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
22c00 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
22c10 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
22c20 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  VER(pAggInfo->nF
22c30 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  unc==0) ) return
22c40 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
22c50 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
22c60 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53  unc->funcFlags&S
22c70 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
22c80 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
22c90 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
22ca0 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20  ags&EP_Distinct 
22cb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
22cc0 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
22cd0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72  *.** If the sour
22ce0 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73  ce-list item pas
22cf0 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
22d00 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64  nt was augmented
22d10 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45   with an.** INDE
22d20 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
22d30 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74  hen try to locat
22d40 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
22d50 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a  index. If there.
22d60 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c  ** was such a cl
22d70 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d  ause and the nam
22d80 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  ed index cannot 
22d90 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
22da0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
22db0 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  R and leave an e
22dc0 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20  rror in pParse. 
22dd0 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c  Otherwise, popul
22de0 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70  ate .** pFrom->p
22df0 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e  Index and return
22e00 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
22e10 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  nt sqlite3Indexe
22e20 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20  dByLookup(Parse 
22e30 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
22e40 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
22e50 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
22e60 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d  m->pTab && pFrom
22e70 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
22e80 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
22e90 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
22ea0 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
22eb0 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d  dexedBy = pFrom-
22ec0 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a  >u1.zIndexedBy;.
22ed0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
22ee0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
22ef0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20  ab->pIndex; .   
22f00 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c       pIdx && sql
22f10 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78  ite3StrICmp(pIdx
22f20 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65  ->zName, zIndexe
22f30 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dBy); .        p
22f40 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
22f50 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
22f60 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
22f70 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22f80 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
22f90 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
22fa0 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20  xedBy, 0);.     
22fb0 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
22fc0 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
22fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
22fe0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
22ff0 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  From->pIBIndex =
23000 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
23010 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23020 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
23030 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
23040 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
23050 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
23060 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
23070 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
23080 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
23090 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
230a0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
230b0 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
230c0 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
230d0 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
230e0 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
230f0 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
23100 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
23110 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
23120 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
23130 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
23140 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
23150 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
23160 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
23170 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
23180 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
23190 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
231a0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
231b0 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
231c0 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
231d0 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
231e0 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
231f0 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
23200 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
23210 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
23220 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
23230 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
23240 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23250 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
23260 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
23270 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
23280 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
23290 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
232a0 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
232b0 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
232c0 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
232d0 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
232e0 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
232f0 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
23300 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
23310 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
23320 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
23330 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
23340 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
23350 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
23360 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
23370 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
23380 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
23390 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
233a0 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
233b0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
233c0 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
233d0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
233e0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
233f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
23400 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23410 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
23420 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
23430 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
23440 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
23450 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
23460 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
23470 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
23480 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
23490 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
234a0 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
234b0 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
234c0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
234d0 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
234e0 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
234f0 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
23500 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23510 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
23520 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
23530 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
23540 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
23550 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
23560 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
23570 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
23580 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
23590 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
235a0 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
235b0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
235c0 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
235d0 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
235e0 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
235f0 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
23600 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
23610 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
23620 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
23630 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
23640 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
23650 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
23660 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23670 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
23680 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
23690 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
236a0 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
236b0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
236c0 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
236d0 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
236e0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
236f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23700 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
23710 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
23720 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
23730 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
23740 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
23750 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
23760 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54  3Expr(db, TK_AST
23770 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d  ERISK, 0));.  p-
23780 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
23790 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30  .  p->pWhere = 0
237a0 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
237b0 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
237c0 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70  pHaving = 0;.  p
237d0 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
237e0 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  0;.  p->pPrior =
237f0 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   0;.  p->pNext =
23800 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d   0;.  p->pWith =
23810 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   0;.  p->selFlag
23820 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e  s &= ~SF_Compoun
23830 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  d;.  assert( (p-
23840 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
23850 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a  onverted)==0 );.
23860 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
23870 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20   SF_Converted;. 
23880 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
23890 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e  Prior!=0 );.  pN
238a0 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ew->pPrior->pNex
238b0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77  t = pNew;.  pNew
238c0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
238d0 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
238e0 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
238f0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
23900 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
23910 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  if the FROM clau
23920 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61  se term pFrom ha
23930 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  s table-valued f
23940 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d  unction.** argum
23950 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65  ents.  If it doe
23960 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
23970 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
23980 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  rse and return.*
23990 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63  * non-zero, sinc
239a0 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61  e pFrom is not a
239b0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74  llowed to be a t
239c0 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
239d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
239e0 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  int cannotBeFunc
239f0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
23a00 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
23a10 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
23a20 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67  .  if( pFrom->fg
23a30 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
23a40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23a50 67 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20  g(pParse, "'%s' 
23a60 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f  is not a functio
23a70 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  n", pFrom->zName
23a80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
23a90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
23aa0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
23ab0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
23ac0 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68  * Argument pWith
23ad0 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e   (which may be N
23ae0 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61  ULL) points to a
23af0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
23b00 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20  nested .** WITH 
23b10 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69  contexts, from i
23b20 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73  nner to outermos
23b30 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  t. If the table 
23b40 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a  identified by .*
23b50 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
23b60 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72  ement pItem is r
23b70 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74  eally a common-t
23b80 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20  able-expression 
23b90 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72  (CTE) .** then r
23ba0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
23bb0 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e  to the CTE defin
23bc0 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74  ition for that t
23bd0 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  able. Otherwise.
23be0 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  ** return NULL..
23bf0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e  **.** If a non-N
23c00 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74  ULL value is ret
23c10 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f  urned, set *ppCo
23c20 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74  ntext to point t
23c30 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62  o the With.** ob
23c40 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65  ject that the re
23c50 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e  turned CTE belon
23c60 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  gs to..*/.static
23c70 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61   struct Cte *sea
23c80 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20  rchWith(.  With 
23c90 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
23ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
23cb0 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20  rrent innermost 
23cc0 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WITH clause */. 
23cd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
23ce0 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20  item *pItem,    
23cf0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
23d00 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c  element to resol
23d10 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70  ve */.  With **p
23d20 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  pContext        
23d30 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
23d40 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75  WITH clause retu
23d50 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73  rn value belongs
23d60 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73   to */.){.  cons
23d70 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
23d80 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
23d90 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61  abase==0 && (zNa
23da0 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  me = pItem->zNam
23db0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  e)!=0 ){.    Wit
23dc0 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  h *p;.    for(p=
23dd0 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70  pWith; p; p=p->p
23de0 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e  Outer){.      in
23df0 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
23e00 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
23e10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
23e20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
23e30 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  zName, p->a[i].z
23e40 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
23e50 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74        *ppContext
23e60 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
23e70 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b  return &p->a[i];
23e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23e90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
23ea0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54  eturn 0;.}../* T
23eb0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
23ec0 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74  r maintains a st
23ed0 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49  ack of active WI
23ee0 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69  TH clauses.** wi
23ef0 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  th the inner-mos
23f00 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65  t WITH clause be
23f10 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ing at the top o
23f20 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
23f30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23f40 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20  pushes the WITH 
23f50 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73  clause passed as
23f60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
23f70 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  ment.** onto the
23f80 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
23f90 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  k. If argument b
23fa0 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68  Free is true, th
23fb0 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20  en this.** WITH 
23fc0 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65  clause will neve
23fd0 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d  r be popped from
23fe0 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74   the stack. In t
23ff0 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73  his case it.** s
24000 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61  hould be freed a
24010 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61  long with the Pa
24020 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f  rse object. In o
24030 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e  ther cases, when
24040 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68  .** bFree==0, th
24050 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69  e With object wi
24060 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ll be freed alon
24070 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43  g with the SELEC
24080 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  T .** statement 
24090 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73  with which it is
240a0 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a   associated..*/.
240b0 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
240c0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
240d0 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c  se, With *pWith,
240e0 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73   u8 bFree){.  as
240f0 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c  sert( bFree==0 |
24100 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  | (pParse->pWith
24110 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70  ==0 && pParse->p
24120 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29  WithToFree==0) )
24130 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ;.  if( pWith ){
24140 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24150 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74  rse->pWith!=pWit
24160 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e  h );.    pWith->
24170 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d  pOuter = pParse-
24180 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
24190 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
241a0 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  h;.    if( bFree
241b0 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   ) pParse->pWith
241c0 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a  ToFree = pWith;.
241d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
241e0 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
241f0 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46  s if argument pF
24200 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20  rom refers to a 
24210 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20  CTE declared by 
24220 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73  .** a WITH claus
24230 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63  e on the stack c
24240 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69  urrently maintai
24250 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ned by the parse
24260 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75  r. And,.** if cu
24270 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
24280 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73  ng a CTE express
24290 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20  ion, if it is a 
242a0 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66  recursive.** ref
242b0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75  erence to the cu
242c0 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rrent CTE..**.**
242d0 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20   If pFrom falls 
242e0 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74  into either of t
242f0 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65  he two categorie
24300 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e  s above, pFrom->
24310 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  pTab.** and othe
24320 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70  r fields are pop
24330 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  ulated according
24340 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73  ly. The caller s
24350 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28  hould check.** (
24360 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20  pFrom->pTab!=0) 
24370 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
24380 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75  ther or not a su
24390 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a  ccessful match.*
243a0 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  * was found..**.
243b0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
243c0 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75  t a match is fou
243d0 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  nd, SQLITE_OK is
243e0 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
243f0 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
24400 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   If an error doe
24410 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f  s occur, an erro
24420 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f  r message is sto
24430 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  red in the.** pa
24440 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72  rser and some er
24450 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74  ror code other t
24460 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  han SQLITE_OK re
24470 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
24480 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64  c int withExpand
24490 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c  (.  Walker *pWal
244a0 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53  ker, .  struct S
244b0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
244c0 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  om.){.  Parse *p
244d0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
244e0 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74  >pParse;.  sqlit
244f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
24500 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74  >db;.  struct Ct
24510 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20  e *pCte;        
24520 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65         /* Matche
24530 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69  d CTE (or NULL i
24540 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20  f no match) */. 
24550 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20   With *pWith;   
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20   /* WITH clause 
24580 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67  that pCte belong
24590 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
245a0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
245b0 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73  0 );..  pCte = s
245c0 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65  earchWith(pParse
245d0 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20  ->pWith, pFrom, 
245e0 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70  &pWith);.  if( p
245f0 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  Cte ){.    Table
24600 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72   *pTab;.    Expr
24610 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
24620 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
24630 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66      Select *pLef
24640 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
24650 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53    /* Left-most S
24660 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
24670 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52  */.    int bMayR
24680 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20  ecursive;       
24690 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
246a0 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20  compound joined 
246b0 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a  by UNION [ALL] *
246c0 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76  /.    With *pSav
246d0 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20  edWith;         
246e0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
246f0 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e  alue of pParse->
24700 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pWith */..    /*
24710 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72   If pCte->zCteEr
24720 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74  r is non-NULL at
24730 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
24740 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c  n this is an ill
24750 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75  egal.    ** recu
24760 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
24770 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61  to CTE pCte. Lea
24780 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
24790 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
247a0 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49  .    ** early. I
247b0 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  f pCte->zCteErr 
247c0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
247d0 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  is is not a recu
247e0 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e  rsive reference.
247f0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
24800 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20  case, proceed.  
24810 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  */.    if( pCte-
24820 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20  >zCteErr ){.    
24830 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24840 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e  g(pParse, pCte->
24850 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a  zCteErr, pCte->z
24860 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
24870 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
24880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24890 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
248a0 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
248b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
248c0 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65  ERROR;..    asse
248d0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
248e0 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 );.    pFrom-
248f0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
24900 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
24910 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
24920 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
24930 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
24940 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70  WRC_Abort;.    p
24950 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
24960 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
24970 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
24980 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
24990 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
249a0 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
249b0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
249c0 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
249d0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
249e0 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
249f0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
24a00 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c  = TF_Ephemeral |
24a10 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
24a20 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  id;.    pFrom->p
24a30 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
24a40 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
24a50 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
24a60 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
24a70 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
24a80 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
24a90 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
24aa0 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
24ab0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
24ac0 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
24ad0 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
24ae0 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
24af0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
24b00 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
24b10 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
24b20 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
24b30 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
24b40 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
24b50 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
24b60 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
24b70 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
24b80 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
24b90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
24ba0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
24bb0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
24bc0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
24bd0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
24be0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
24bf0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
24c00 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
24c10 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
24c20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
24c30 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
24c40 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
24c50 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
24c60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
24c70 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
24c80 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
24c90 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  Item->fg.isRecur
24ca0 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
24cb0 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
24cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c  ;.          pSel
24cd0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
24ce0 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  _Recursive;.    
24cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24d00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
24d10 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72   one recursive r
24d20 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d  eference is perm
24d30 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69  itted. */ .    i
24d40 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20  f( pTab->nRef>2 
24d50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24d60 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
24d70 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
24d80 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
24d90 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
24da0 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
24db0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
24dc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24dd0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
24de0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
24df0 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70  ->nRef==1 || ((p
24e00 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
24e10 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
24e20 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b  Tab->nRef==2 ));
24e30 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  ..    pCte->zCte
24e40 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20  Err = "circular 
24e50 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a  reference: %s";.
24e60 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d      pSavedWith =
24e70 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
24e80 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
24e90 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73  h = pWith;.    s
24ea0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
24eb0 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65  (pWalker, bMayRe
24ec0 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e  cursive ? pSel->
24ed0 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a  pPrior : pSel);.
24ee0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
24ef0 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20  h = pWith;..    
24f00 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20  for(pLeft=pSel; 
24f10 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70  pLeft->pPrior; p
24f20 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69  Left=pLeft->pPri
24f30 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  or);.    pEList 
24f40 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b  = pLeft->pEList;
24f50 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70  .    if( pCte->p
24f60 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66  Cols ){.      if
24f70 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
24f80 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d  st->nExpr!=pCte-
24f90 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b  >pCols->nExpr ){
24fa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24fb0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
24fc0 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25   "table %s has %
24fd0 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20  d values for %d 
24fe0 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20  columns",.      
24ff0 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d        pCte->zNam
25000 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  e, pEList->nExpr
25010 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  , pCte->pCols->n
25020 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  Expr.        );.
25030 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
25040 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
25050 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  th;.        retu
25060 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
25070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
25080 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43  EList = pCte->pC
25090 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ols;.    }..    
250a0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
250b0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
250c0 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62  e, pEList, &pTab
250d0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
250e0 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  Col);.    if( bM
250f0 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
25100 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73       if( pSel->s
25110 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
25120 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
25130 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
25140 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75  = "multiple recu
25150 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 73  rsive references
25160 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c  : %s";.      }el
25170 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65  se{.        pCte
25180 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63  ->zCteErr = "rec
25190 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
251a0 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20   in a subquery: 
251b0 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
251c0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
251d0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
251e0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  el);.    }.    p
251f0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30  Cte->zCteErr = 0
25200 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
25210 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
25220 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
25230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
25240 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
25250 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
25260 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
25270 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
25280 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68  econd argument h
25290 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64  as an associated
252a0 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65   WITH .** clause
252b0 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68  , pop it from th
252c0 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61  e stack stored a
252d0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61  s part of the Pa
252e0 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  rse object..**.*
252f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25300 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78  is used as the x
25310 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28  SelectCallback2(
25320 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a  ) callback by.**
25330 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
25340 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b  pand() when walk
25350 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65  ing a SELECT tre
25360 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62  e to resolve tab
25370 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20  le.** names and 
25380 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
25390 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a  e elements. .*/.
253a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
253b0 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72  ctPopWith(Walker
253c0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
253d0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
253e0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
253f0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68  ->pParse;.  With
25400 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69   *pWith = findRi
25410 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
25420 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d  h;.  if( pWith!=
25430 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
25440 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d   pParse->pWith==
25450 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61  pWith );.    pPa
25460 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
25470 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a  th->pOuter;.  }.
25480 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
25490 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a  selectPopWith 0.
254a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
254b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
254c0 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
254d0 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
254e0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
254f0 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
25500 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
25510 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
25520 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
25530 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
25540 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
25550 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
25560 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
25570 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
25580 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
25590 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
255a0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
255b0 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
255c0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
255d0 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
255e0 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
255f0 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
25600 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
25610 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
25620 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
25630 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
25640 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
25650 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
25660 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
25670 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
25680 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
25690 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
256a0 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
256b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
256c0 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
256d0 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
256e0 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
256f0 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
25700 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
25710 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
25720 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72  ssing up the per
25730 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
25740 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
25750 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
25760 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
25770 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
25780 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
25790 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  commodate the NA
257a0 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
257b0 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
257c0 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
257d0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
257e0 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
257f0 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
25800 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
25810 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
25820 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
25830 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
25840 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
25850 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
25860 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
25870 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
25880 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
25890 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
258a0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
258b0 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
258c0 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
258d0 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
258e0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
258f0 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
25900 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
25910 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
25920 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
25930 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
25940 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
25950 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
25960 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
25970 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
25980 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
25990 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
259a0 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
259b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
259c0 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c  >db;.  Expr *pE,
259d0 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72   *pRight, *pExpr
259e0 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73  ;.  u16 selFlags
259f0 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a   = p->selFlags;.
25a00 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
25a10 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
25a20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25a30 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
25a40 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25a50 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28    }.  if( NEVER(
25a60 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28  p->pSrc==0) || (
25a70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78  selFlags & SF_Ex
25a80 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20  panded)!=0 ){.  
25a90 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
25aa0 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69  ne;.  }.  pTabLi
25ab0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
25ac0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
25ad0 73 74 3b 0a 20 20 69 66 28 20 70 57 61 6c 6b 65  st;.  if( pWalke
25ae0 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  r->xSelectCallba
25af0 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f 70 57 69  ck2==selectPopWi
25b00 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  th ){.    sqlite
25b10 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65  3WithPush(pParse
25b20 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28  , findRightmost(
25b30 70 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20  p)->pWith, 0);. 
25b40 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
25b50 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
25b60 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
25b70 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
25b80 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
25b90 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
25ba0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
25bb0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
25bc0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
25bd0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
25be0 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
25bf0 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
25c00 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
25c10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
25c20 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
25c30 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
25c40 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
25c50 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
25c60 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
25c70 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
25c80 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
25c90 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
25ca0 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
25cb0 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
25cc0 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
25cd0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
25ce0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
25cf0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
25d00 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
25d10 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65   *pTab;.    asse
25d20 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  rt( pFrom->fg.is
25d30 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
25d40 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
25d50 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
25d60 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
25d70 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25d80 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
25d90 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  Tab==0 );.#ifnde
25da0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
25db0 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78  E.    if( withEx
25dc0 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46  pand(pWalker, pF
25dd0 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
25de0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28  C_Abort;.    if(
25df0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b   pFrom->pTab ) {
25e00 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
25e10 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
25e20 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
25e30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
25e40 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
25e50 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
25e60 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
25e70 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
25e80 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
25e90 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
25ea0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
25eb0 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
25ec0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
25ed0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
25ee0 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b   if( sqlite3Walk
25ef0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
25f00 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57  pSel) ) return W
25f10 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
25f20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
25f30 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
25f40 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
25f50 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
25f60 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
25f70 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25f80 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  t;.      pTab->n
25f90 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
25fa0 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
25fb0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
25fc0 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20  "sqlite_sq_%p", 
25fd0 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
25fe0 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
25ff0 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
26000 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
26010 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  }.      sqlite3C
26020 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
26030 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
26040 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
26050 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
26060 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
26070 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
26080 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
26090 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
260a0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
260b0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
260c0 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
260d0 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
260e0 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
260f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
26100 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
26110 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
26120 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
26130 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
26140 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
26150 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
26160 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
26170 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
26180 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
26190 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
261a0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
261b0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
261c0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
261d0 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a  nRef==0xffff ){.
261e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
261f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
26200 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65  "too many refere
26210 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20  nces to \"%s\": 
26220 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20  max 65535",.    
26230 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
26240 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  me);.        pFr
26250 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  om->pTab = 0;.  
26260 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
26270 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
26280 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
26290 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49  ++;.      if( !I
262a0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26  sVirtual(pTab) &
262b0 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  & cannotBeFuncti
262c0 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  on(pParse, pFrom
262d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
262e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
262f0 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
26300 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
26310 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
26320 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
26330 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
26340 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
26350 28 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e  (pTab) || pTab->
26360 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
26370 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20     i16 nCol;.   
26380 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26390 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
263a0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
263b0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
263c0 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ort;.        ass
263d0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
263e0 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
263f0 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
26400 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
26410 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
26420 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
26430 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
26440 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70  SetName(pFrom->p
26450 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e  Select, pTab->zN
26460 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  ame);.        nC
26470 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ol = pTab->nCol;
26480 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  .        pTab->n
26490 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Col = -1;.      
264a0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
264b0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  ect(pWalker, pFr
264c0 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
264d0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
264e0 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = nCol;.      }
264f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
26500 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
26510 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
26520 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
26530 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
26540 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
26550 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
26560 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
26570 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
26580 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
26590 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
265a0 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
265b0 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
265c0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
265d0 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
265e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
265f0 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
26600 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
26610 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
26620 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
26630 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
26640 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
26650 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
26660 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
26670 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
26680 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
26690 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
266a0 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
266b0 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
266c0 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
266d0 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
266e0 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
266f0 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
26700 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
26710 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49  th the TK_ASTERI
26720 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  SK operator for 
26730 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
26740 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
26750 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20  lumn.  ** list. 
26760 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
26770 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
26780 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53  locate the TK_AS
26790 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72  TERISK.  ** expr
267a0 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
267b0 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  nd each one to t
267c0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
267d0 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61  olumns in.  ** a
267e0 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
267f0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
26800 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
26810 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
26820 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
26830 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
26840 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
26850 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
26860 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
26870 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20   k++){.    pE = 
26880 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
26890 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
268a0 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
268b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
268c0 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
268d0 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
268e0 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
268f0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
26900 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74  OT || (pE->pLeft
26910 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  !=0 && pE->pLeft
26920 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a  ->op==TK_ID) );.
26930 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
26940 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
26950 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ight->op==TK_AST
26960 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
26970 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
26980 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
26990 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
269a0 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
269b0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
269c0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
269d0 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
269e0 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
269f0 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
26a00 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
26a10 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
26a20 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
26a30 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
26a40 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
26a50 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
26a60 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
26a70 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
26a80 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
26a90 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
26aa0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
26ab0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
26ac0 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
26ad0 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
26ae0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
26af0 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
26b10 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
26b20 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
26b30 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
26b40 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
26b50 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; k++){.      p
26b60 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
26b70 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
26b80 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  E->pRight;.     
26b90 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
26ba0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
26bb0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
26bc0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54  ( pE->op!=TK_AST
26bd0 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20  ERISK.       && 
26be0 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
26bf0 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  || pRight->op!=T
26c00 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20  K_ASTERISK).    
26c10 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
26c20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
26c30 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
26c40 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
26c50 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
26c60 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
26c70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
26c80 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
26c90 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
26ca0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
26cb0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
26cc0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
26cd0 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
26ce0 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
26cf0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
26d00 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53  New->nExpr-1].zS
26d10 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e  pan = a[k].zSpan
26d20 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
26d30 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
26d40 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e        a[k].zSpan
26d50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
26d60 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
26d70 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  pr = 0;.      }e
26d80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
26d90 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
26da0 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
26db0 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
26dc0 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
26dd0 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
26de0 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
26df0 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
26e00 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
26e10 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
26e20 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
26e30 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  zTName = 0;     
26e40 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
26e50 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
26e60 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
26e70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
26e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
26e90 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ->pLeft!=0 );.  
26ea0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26eb0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
26ec0 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49  (pE->pLeft, EP_I
26ed0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
26ee0 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70        zTName = p
26ef0 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  E->pLeft->u.zTok
26f00 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
26f10 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
26f20 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
26f30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
26f40 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
26f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
26f60 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
26f70 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
26f80 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
26f90 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
26fa0 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
26fb0 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
26fc0 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
26fd0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
26fe0 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30  *zSchemaName = 0
26ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
27000 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
27010 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29  f( zTabName==0 )
27020 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
27030 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
27040 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
27050 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
27060 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27070 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
27080 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
27090 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  || (pSub->selFla
270a0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
270b0 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)==0 ){.      
270c0 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a        pSub = 0;.
270d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
270e0 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65  zTName && sqlite
270f0 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
27100 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b   zTabName)!=0 ){
27110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
27120 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
27130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27140 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
27150 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
27160 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
27170 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  ;.            zS
27180 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e  chemaName = iDb>
27190 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62  =0 ? db->aDb[iDb
271a0 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22  ].zDbSName : "*"
271b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
271c0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
271d0 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
271e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
271f0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
27200 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
27210 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
27220 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20  char *zColname; 
27230 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64   /* The computed
27240 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
27250 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
27260 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20   *zToFree;   /* 
27270 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20  Malloced string 
27280 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
27290 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20   freed */.      
272a0 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c        Token sCol
272b0 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74  name;  /* Comput
272c0 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  ed column name a
272d0 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20  s a token */..  
272e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
272f0 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20  ( zName );.     
27300 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
27310 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20  e && pSub.      
27320 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
27330 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70  3MatchSpanName(p
27340 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
27350 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61  ].zSpan, 0, zTNa
27360 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  me, 0)==0.      
27370 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27380 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
27390 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
273a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
273b0 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
273c0 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
273d0 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74  , omit it from t
273e0 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
273f0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
27400 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73  t-set list unles
27410 73 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  s the SELECT has
27420 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48   the SF_IncludeH
27430 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20  idden.          
27440 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20    ** bit set..  
27450 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
27460 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d           if( (p-
27470 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49  >selFlags & SF_I
27480 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30  ncludeHidden)==0
27490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
274a0 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
274b0 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20  &pTab->aCol[j]) 
274c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
274e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
274f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27500 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
27510 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
27520 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d  ( i>0 && zTName=
27530 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27540 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e      if( (pFrom->
27550 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
27560 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20  _NATURAL)!=0.   
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
27580 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
27590 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c  dex(pTabList, i,
275a0 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20   zName, 0, 0).  
275b0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
275d0 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
275e0 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
275f0 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
27600 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
27610 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f       ** table to
27620 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
27630 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20  e join */.      
27640 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
27650 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
27660 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27670 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
27680 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e  istIndex(pFrom->
27690 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
276a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
276b0 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
276c0 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
276d0 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
276e0 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
276f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
27700 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
27710 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
27720 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
27730 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
27740 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
27750 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27760 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
27770 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
27780 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
27790 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
277a0 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e     zColname = zN
277b0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
277c0 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20   zToFree = 0;.  
277d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
277e0 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
277f0 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
27800 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
27810 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r *pLeft;.      
27820 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
27830 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
27840 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29  TK_ID, zTabName)
27850 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27860 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
27870 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
27880 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
27890 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
278a0 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
278b0 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
278c0 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
278d0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
278e0 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
278f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
27900 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
27910 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
27920 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
27930 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
27940 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27950 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
27960 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
27970 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
27980 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
27990 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
279a0 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
279b0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
279c0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
279d0 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
279e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
279f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27a00 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
27a10 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
27a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27a30 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
27a40 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
27a50 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
27a60 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
27a70 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
27a80 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
27a90 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
27aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27ab0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
27ac0 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
27ad0 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
27ae0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
27af0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
27b00 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
27b10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27b20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
27b30 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
27b40 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
27b50 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
27b60 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
27b70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27b80 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
27b90 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
27ba0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
27bb0 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
27bd0 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
27be0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
27bf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27c00 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
27c10 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
27c20 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
27c30 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
27c70 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
27c80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27c90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
27ca0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
27cd0 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27cf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27d00 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
27d10 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
27d20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
27d30 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
27d40 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
27d50 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
27d60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27d70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27d80 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
27d90 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
27da0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
27dc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
27dd0 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
27de0 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
27df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27e00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
27e10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27e20 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
27e30 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
27e40 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
27e50 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
27e60 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
27e70 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
27e80 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
27e90 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
27ea0 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
27eb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27ec0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
27ed0 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
27ee0 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
27ef0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
27f00 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rt;.  }.#endif. 
27f10 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
27f20 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
27f30 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
27f40 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
27f50 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
27f60 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
27f70 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
27f80 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
27f90 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
27fa0 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
27fb0 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
27fc0 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
27fd0 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
27fe0 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
27ff0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
28000 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
28010 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
28020 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
28030 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
28040 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
28050 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
28060 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
28070 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
28080 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
28090 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
280a0 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
280b0 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
280c0 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
280d0 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
280e0 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
280f0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28100 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
28110 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
28120 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
28130 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
28140 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
28150 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
28160 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
28170 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
28180 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
28190 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
281a0 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
281b0 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
281c0 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
281d0 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
281e0 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
281f0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
28200 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
28210 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
28220 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
28230 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
28240 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28250 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
28260 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
28270 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
28280 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
28290 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
282a0 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
282b0 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
282c0 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
282d0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
282e0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
282f0 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
28300 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
28310 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
28320 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
28330 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
28340 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
28350 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
28360 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
28370 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
28380 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
28390 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
283a0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
283b0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
283c0 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
283d0 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
283e0 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70   pParse;.  if( p
283f0 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
28400 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  nd ){.    w.xSel
28410 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
28420 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
28430 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
28440 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
28450 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
28460 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
28470 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
28480 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 69  ectExpander;.  i
28490 66 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  f( (pSelect->sel
284a0 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69  Flags & SF_Multi
284b0 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
284c0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
284d0 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57  ck2 = selectPopW
284e0 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ith;.  }.  sqlit
284f0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
28500 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
28510 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28520 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
28530 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
28540 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
28550 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
28560 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
28570 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
28580 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
28590 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
285a0 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
285b0 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
285c0 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
285d0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
285e0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
285f0 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
28600 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
28610 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
28620 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
28630 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
28640 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
28650 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
28660 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
28670 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
28680 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
28690 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
286a0 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
286b0 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
286c0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
286d0 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
286e0 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
286f0 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
28700 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
28710 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
28720 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
28730 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
28740 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75  void selectAddSu
28750 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
28760 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
28770 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
28780 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
28790 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
287a0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
287b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
287c0 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
287d0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
287e0 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
287f0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
28800 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
28810 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a  TypeInfo)==0 );.
28820 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
28830 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
28840 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
28850 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70  ker->pParse;.  p
28860 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
28870 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  c;.  for(i=0, pF
28880 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
28890 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
288a0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
288b0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
288c0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
288d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
288e0 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
288f0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
28900 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
28910 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
28920 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
28930 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
28940 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
28950 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
28960 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
28970 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
28980 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
28990 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
289a0 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  ) pSel = pSel->p
289b0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73  Prior;.        s
289c0 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43  qlite3SelectAddC
289d0 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
289e0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
289f0 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  ab, pSel);.     
28a00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23   }.    }.  }.}.#
28a10 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
28a20 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
28a30 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
28a40 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
28a50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
28a60 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
28a70 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
28a80 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
28a90 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
28aa0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
28ab0 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
28ac0 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
28ad0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
28ae0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
28af0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
28b00 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
28b10 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
28b20 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
28b30 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
28b40 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
28b50 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
28b60 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
28b70 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
28b80 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
28b90 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
28ba0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
28bb0 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
28bc0 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
28bd0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
28be0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
28bf0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e  w, pSelect);.#en
28c00 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.}.../*.** Th
28c10 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
28c20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  up a SELECT stat
28c30 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
28c40 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f  sing.  The.** fo
28c50 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d  llowing is accom
28c60 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  plished:.**.**  
28c70 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f     *  VDBE Curso
28c80 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73  r numbers are as
28c90 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52  signed to all FR
28ca0 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  OM-clause terms.
28cb0 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d  .**     *  Ephem
28cc0 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
28cd0 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ts are created f
28ce0 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  or all FROM-clau
28cf0 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  se subqueries..*
28d00 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20  *     *  ON and 
28d10 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72  USING clauses ar
28d20 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57  e shifted into W
28d30 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a  HERE statements.
28d40 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61  **     *  Wildca
28d50 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42  rds "*" and "TAB
28d60 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20  LE.*" in result 
28d70 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65  sets are expande
28d80 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65  d..**     *  Ide
28d90 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72  ntifiers in expr
28da0 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68  ession are match
28db0 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a  ed to tables..**
28dc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28dd0 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c   acts recursivel
28de0 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  y on all subquer
28df0 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53  ies within the S
28e00 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
28e10 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
28e20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
28e30 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
28e40 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
28e50 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
28e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28e70 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
28e80 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
28e90 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
28ea0 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
28eb0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
28ec0 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29  r container */.)
28ed0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
28ee0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
28ef0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
28f00 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
28f10 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
28f20 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
28f30 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
28f40 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
28f50 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
28f60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
28f70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  and(pParse, p);.
28f80 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
28f90 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
28fa0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
28fb0 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
28fc0 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61  eSelectNames(pPa
28fd0 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
28fe0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
28ff0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
29000 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
29010 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
29020 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70  ectAddTypeInfo(p
29030 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  Parse, p);.}../*
29040 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
29050 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
29060 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
29070 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
29080 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
29090 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
290a0 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
290b0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
290c0 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
290d0 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
290e0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
290f0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
29100 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c  that stores NULL
29110 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
29120 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c  e memory.** cell
29130 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
29140 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
29150 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
29160 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
29170 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
29180 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
29190 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
291a0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
291b0 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52  *pFunc;.  int nR
291c0 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  eg = pAggInfo->n
291d0 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d  Func + pAggInfo-
291e0 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20  >nColumn;.  if( 
291f0 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nReg==0 ) return
29200 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
29210 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
29220 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e  y that all AggIn
29230 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65  fo registers are
29240 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67   within the rang
29250 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20  e specified by. 
29260 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65   ** AggInfo.mnRe
29270 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67  g..AggInfo.mxReg
29280 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52   */.  assert( nR
29290 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg==pAggInfo->mx
292a0 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  Reg-pAggInfo->mn
292b0 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69  Reg+1 );.  for(i
292c0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
292d0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
292e0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
292f0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
29300 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
29310 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
29320 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
29330 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
29340 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20  >mxReg );.  }.  
29350 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
29360 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29  nfo->nFunc; i++)
29370 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
29380 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
29390 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
293a0 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
293b0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  && pAggInfo->aFu
293c0 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  nc[i].iMem<=pAgg
293d0 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
293e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
293f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
29400 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
29410 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41  gInfo->mnReg, pA
29420 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a  ggInfo->mxReg);.
29430 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
29440 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
29450 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
29460 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
29470 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  +){.    if( pFun
29480 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
29490 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
294a0 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
294b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
294c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
294d0 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pE, EP_xIsSelec
294e0 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
294f0 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c  pE->x.pList==0 |
29500 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pE->x.pList->n
29510 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
29520 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
29530 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
29540 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20  INCT aggregates 
29550 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
29560 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20  y one ".        
29570 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a     "argument");.
29580 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
29590 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
295a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
295b0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
295c0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
295d0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
295e0 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c  se, pE->x.pList,
295f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
29600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29610 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
29620 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
29630 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
29640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29650 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
29660 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
29670 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
29680 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
29690 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
296a0 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
296b0 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
296c0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
296d0 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
296e0 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
296f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
29700 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
29710 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29720 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
29730 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
29740 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
29750 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
29760 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
29770 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
29780 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
29790 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
297a0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
297b0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
297c0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
297d0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
297e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
297f0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
29800 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
29810 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
29820 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
29830 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
29840 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
29850 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c  t->nExpr : 0, 0,
29860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29870 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
29880 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
29890 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
298a0 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
298b0 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
298c0 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
298d0 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
298e0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
298f0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
29900 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29910 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
29920 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
29930 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
29940 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
29950 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
29960 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
29970 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  egHit = 0;.  int
29980 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30   addrHitTest = 0
29990 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
299a0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
299b0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
299c0 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
299d0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
299e0 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
299f0 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
29a00 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
29a10 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
29a20 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
29a30 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
29a40 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
29a50 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
29a60 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
29a70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
29a80 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
29a90 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
29aa0 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
29ab0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
29ac0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
29ad0 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
29ae0 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
29af0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
29b00 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
29b10 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
29b20 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
29b30 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
29b40 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53  st, regAgg, 0, S
29b50 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b  QLITE_ECEL_DUP);
29b60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29b70 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
29b80 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
29b90 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
29ba0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
29bb0 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
29bc0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
29bd0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
29be0 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d  testcase( nArg==
29bf0 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63  0 );  /* Error c
29c00 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ondition */.    
29c10 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
29c20 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20  >1 );   /* Also 
29c30 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
29c40 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
29c50 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
29c60 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
29c70 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
29c80 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
29c90 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
29ca0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
29cb0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
29cc0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
29cd0 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
29ce0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
29cf0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
29d00 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
29d10 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
29d20 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
29d30 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
29d40 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
29d50 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
29d60 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
29d70 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
29d80 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
29d90 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
29da0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
29db0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
29dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29dd0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
29de0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
29df0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
29e00 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
29e10 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
29e20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
29e30 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
29e40 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
29e50 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
29e60 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
29e70 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
29e80 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
29e90 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
29ea0 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
29eb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29ec0 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30  4(v, OP_AggStep0
29ed0 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d  , 0, regAgg, pF-
29ee0 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20  >iMem,.         
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
29f00 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
29f10 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
29f20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
29f30 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
29f40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
29f50 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
29f60 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
29f70 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
29f80 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
29f90 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
29fa0 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
29fb0 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
29fc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29fd0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
29fe0 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
29ff0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2a000 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2a010 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
2a020 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c   /* Before popul
2a030 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  ating the accumu
2a040 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c  lator registers,
2a050 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   clear the colum
2a060 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74  n cache..  ** Ot
2a070 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20  herwise, if any 
2a080 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  of the required 
2a090 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72  column values ar
2a0a0 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  e already presen
2a0b0 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73  t .  ** in regis
2a0c0 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70  ters, sqlite3Exp
2a0d0 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20  rCode() may use 
2a0e0 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79  OP_SCopy to copy
2a0f0 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20   the value.  ** 
2a100 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74  to pC->iMem. But
2a110 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
2a120 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20   value is used, 
2a130 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67  the original reg
2a140 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68  ister.  ** may h
2a150 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69  ave been used, i
2a160 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20  nvalidating the 
2a170 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65  underlying buffe
2a180 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  r holding the.  
2a190 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20  ** text or blob 
2a1a0 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65  value. See ticke
2a1b0 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a  t [883034dcb5]..
2a1c0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65    **.  ** Anothe
2a1d0 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64  r solution would
2a1e0 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68   be to change th
2a1f0 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20  e OP_SCopy used 
2a200 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20  to copy cached. 
2a210 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e   ** values to an
2a220 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20   OP_Copy..  */. 
2a230 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20   if( regHit ){. 
2a240 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d     addrHitTest =
2a250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a260 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
2a270 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Hit); VdbeCovera
2a280 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
2a290 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2a2a0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
2a2b0 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
2a2c0 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
2a2d0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2a2e0 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
2a2f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2a300 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
2a310 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
2a320 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
2a330 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
2a340 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
2a350 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2a360 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
2a370 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
2a380 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2a390 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
2a3a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
2a3b0 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
2a3c0 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
2a3d0 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
2a3e0 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
2a3f0 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
2a400 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
2a410 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
2a420 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
2a430 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2a440 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
2a450 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2a460 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2a470 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2a480 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
2a490 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
2a4a0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
2a4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
2a4c0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
2a4d0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
2a4e0 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
2a4f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
2a500 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
2a510 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
2a520 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
2a530 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
2a540 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d      int bCover =
2a550 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61   (pIdx!=0 && (Ha
2a560 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
2a570 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
2a580 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20  ex(pIdx)));.    
2a590 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c  char *zEqp = sql
2a5a0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
2a5b0 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41  se->db, "SCAN TA
2a5c0 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20  BLE %s%s%s",.   
2a5d0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
2a5e0 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
2a5f0 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52   ? " USING COVER
2a600 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22  ING INDEX " : ""
2a610 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
2a620 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a   ? pIdx->zName :
2a630 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73   "".    );.    s
2a640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2a650 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
2a660 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c  ->pVdbe, OP_Expl
2a670 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
2a680 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45  lectId, 0, 0, zE
2a690 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20  qp, P4_DYNAMIC. 
2a6a0 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
2a6b0 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
2a6c0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
2a6d0 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
2a6e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
2a6f0 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
2a700 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
2a710 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e  in the p argumen
2a720 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  t.  .**.** The r
2a730 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72  esults are retur
2a740 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ned according to
2a750 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20   the SelectDest 
2a760 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65  structure..** Se
2a770 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71  e comments in sq
2a780 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75  liteInt.h for fu
2a790 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f  rther informatio
2a7a0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
2a7b0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2a7c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2a7d0 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
2a7e0 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
2a7f0 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
2a800 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
2a810 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
2a820 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
2a830 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2a840 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2a850 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
2a860 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
2a870 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
2a880 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2a890 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
2a8a0 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
2a8b0 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
2a8c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2a8d0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
2a8e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
2a8f0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
2a900 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
2a910 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
2a920 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
2a930 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
2a940 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
2a950 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
2a960 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
2a970 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
2a980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2a990 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2a9a0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2a9b0 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
2a9c0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
2a9d0 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
2a9e0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
2a9f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
2aa00 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
2aa10 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
2aa20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2aa40 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
2aa50 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
2aa60 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
2aa70 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20  st *pEList = 0; 
2aa80 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
2aa90 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
2aaa0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
2aab0 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
2aac0 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
2aad0 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
2aae0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
2aaf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ab00 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
2ab10 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
2ab20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
2ab30 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
2ab40 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
2ab50 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2ab60 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
2ab70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
2ab80 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
2ab90 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
2aba0 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
2abb0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2abc0 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
2abd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
2abe0 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
2abf0 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
2ac00 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
2ac10 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
2ac20 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74  word */.  SortCt
2ac30 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20  x sSort;        
2ac40 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
2ac50 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45  to code the ORDE
2ac60 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2ac70 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
2ac80 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
2ac90 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
2aca0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
2acb0 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2acd0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
2ace0 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
2acf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2ad00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2ad10 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
2ad20 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64  ection */..#ifnd
2ad30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2ad40 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65  XPLAIN.  int iRe
2ad50 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20  storeSelectId = 
2ad60 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2ad70 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65  d;.  pParse->iSe
2ad80 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
2ad90 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b  >iNextSelectId++
2ada0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d  ;.#endif..  db =
2adb0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
2adc0 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
2add0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
2ade0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
2adf0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2ae00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
2ae10 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
2ae20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
2ae30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
2ae40 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
2ae50 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
2ae60 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69  f(sAggInfo));.#i
2ae70 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2ae80 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e  ABLED.  pParse->
2ae90 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b  nSelectIndent++;
2aea0 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
2aeb0 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67  ,pParse,p, ("beg
2aec0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e  in processing:\n
2aed0 22 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  "));.  if( sqlit
2aee0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2aef0 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c  0x100 ){.    sql
2af00 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2af10 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2af20 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
2af30 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
2af40 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
2af50 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t!=SRT_DistFifo 
2af60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2af70 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2af80 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2af90 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72  _Fifo );.  asser
2afa0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
2afb0 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
2afc0 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t!=SRT_DistQueue
2afd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2afe0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2aff0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2b000 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28  T_Queue );.  if(
2b010 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
2b020 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
2b030 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44  assert(pDest->eD
2b040 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20  est==SRT_Exists 
2b050 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2b060 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20  =SRT_Union || . 
2b070 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2b080 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65  >eDest==SRT_Exce
2b090 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  pt || pDest->eDe
2b0a0 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
2b0b0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
2b0c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2b0d0 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d  Queue  || pDest-
2b0e0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
2b0f0 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20  Fifo ||.        
2b100 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
2b110 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c  =SRT_DistQueue |
2b120 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2b130 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f  SRT_Fifo);.    /
2b140 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61  * If ORDER BY ma
2b150 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63  kes no differenc
2b160 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  e in the output 
2b170 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65  then neither doe
2b180 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43  s.    ** DISTINC
2b190 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72  T so it can be r
2b1a0 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20  emoved too. */. 
2b1b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2b1c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
2b1d0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
2b1e0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
2b1f0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2b200 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
2b210 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
2b220 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
2b230 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74   p, 0);.  memset
2b240 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65  (&sSort, 0, size
2b250 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53  of(sSort));.  sS
2b260 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
2b270 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54  ->pOrderBy;.  pT
2b280 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2b290 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2b2a0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
2b2b0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2b2c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2b2d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2b2e0 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ->pEList!=0 );. 
2b2f0 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
2b300 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
2b310 67 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45  gate)!=0;.#if SE
2b320 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2b330 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
2b340 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2b350 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
2b360 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
2b370 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61  se,p, ("after na
2b380 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e  me resolution:\n
2b390 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
2b3a0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2b3b0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2b3c0 64 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f  dif..  /* Try to
2b3d0 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
2b3e0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2b3f0 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74  clause up into t
2b400 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20  he main query.  
2b410 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2b420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2b430 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
2b440 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2b450 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
2b460 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
2b470 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2b480 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2b490 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2b4a0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2b4b0 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
2b4c0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2b4d0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
2b4e0 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20  t isAggSub;.    
2b4f0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
2b500 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
2b510 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
2b520 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43  tinue;..    /* C
2b530 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e  atch mismatch in
2b540 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f   the declared co
2b550 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20  lumns of a view 
2b560 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
2b570 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  f.    ** columns
2b580 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f   in the SELECT o
2b590 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20  n the RHS */.   
2b5a0 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21   if( pTab->nCol!
2b5b0 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e  =pSub->pEList->n
2b5c0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
2b5d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2b5e0 61 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20  arse, "expected 
2b5f0 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27  %d columns for '
2b600 25 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c  %s' but got %d",
2b610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b620 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
2b630 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  l, pTab->zName, 
2b640 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2b650 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  xpr);.      goto
2b660 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2b670 20 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62   }..    isAggSub
2b680 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61   = (pSub->selFla
2b690 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2b6a0 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66  e)!=0;.    if( f
2b6b0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
2b6c0 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41  Parse, p, i, isA
2b6d0 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b  gg, isAggSub) ){
2b6e0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
2b6f0 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
2b700 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73  bsorbed into its
2b710 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
2b720 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29    if( isAggSub )
2b730 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20  {.        isAgg 
2b740 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
2b750 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
2b760 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20  ggregate;.      
2b770 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a  }.      i = -1;.
2b780 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69      }.    pTabLi
2b790 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2b7a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2b7b0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
2b7c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
2b7d0 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
2b7e0 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
2b7f0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
2b800 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
2b810 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2b820 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70  if..  /* Get a p
2b830 6f 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20  ointer the VDBE 
2b840 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
2b850 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  on, allocating a
2b860 20 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65   new VDBE if one
2b870 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61  .  ** does not a
2b880 6c 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a  lready exist */.
2b890 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
2b8a0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
2b8b0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
2b8c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66  select_end;..#if
2b8d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b8e0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
2b8f0 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d  .  /* Handle com
2b900 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
2b910 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68  tements using th
2b920 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69  e separate multi
2b930 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72  Select().  ** pr
2b940 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ocedure..  */.  
2b950 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
2b960 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
2b970 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
2b980 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70   pDest);.    exp
2b990 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2b9a0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2b9b0 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
2b9c0 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  Id);.#if SELECTT
2b9d0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2b9e0 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
2b9f0 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f  Parse,p,("end co
2ba00 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72  mpound-select pr
2ba10 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20  ocessing\n"));. 
2ba20 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65     pParse->nSele
2ba30 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64  ctIndent--;.#end
2ba40 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  if.    return rc
2ba50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2ba60 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2ba70 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
2ba80 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
2ba90 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66   clause.  */.#if
2baa0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2bab0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
2bac0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
2bad0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
2bae0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
2baf0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
2bb00 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2bb10 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
2bb20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
2bb30 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
2bb40 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
2bb50 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
2bb60 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
2bb70 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
2bb80 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
2bb90 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
2bba0 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
2bbb0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
2bbc0 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
2bbd0 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
2bbe0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
2bbf0 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
2bc00 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
2bc10 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
2bc20 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
2bc30 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
2bc40 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
2bc50 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
2bc60 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
2bc70 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
2bc80 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
2bc90 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
2bca0 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
2bcb0 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
2bcc0 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
2bcd0 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
2bce0 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
2bcf0 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
2bd00 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
2bd10 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
2bd20 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
2bd30 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2bd40 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
2bd50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2bd60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bd70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
2bd80 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
2bd90 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2bda0 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sub);.      }.  
2bdb0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2bdc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
2bdd0 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
2bde0 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
2bdf0 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
2be00 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
2be10 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
2be20 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
2be30 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
2be40 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
2be50 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
2be60 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
2be70 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
2be80 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
2be90 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
2bea0 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
2beb0 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
2bec0 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
2bed0 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
2bee0 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
2bef0 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
2bf00 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
2bf10 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
2bf20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
2bf30 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
2bf40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2bf50 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
2bf60 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20   /* Make copies 
2bf70 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52  of constant WHER
2bf80 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69  E-clause terms i
2bf90 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
2bfa0 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e  y down.    ** in
2bfb0 73 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72  side the subquer
2bfc0 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c  y.  This can hel
2bfd0 70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  p the subquery t
2bfe0 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63  o run more effic
2bff0 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  iently..    */. 
2c000 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66     if( (pItem->f
2c010 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
2c020 4f 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26  OUTER)==0.     &
2c030 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  & pushDownWhereT
2c040 65 72 6d 73 28 64 62 2c 20 70 53 75 62 2c 20 70  erms(db, pSub, p
2c050 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
2c060 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b  >iCursor).    ){
2c070 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2c080 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69  _ENABLED.      i
2c090 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2c0a0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2c0b0 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54  .        SELECTT
2c0c0 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2c0d0 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52  e,p,("After WHER
2c0e0 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f  E-clause push-do
2c0f0 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  wn:\n"));.      
2c100 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2c110 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2c120 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2c130 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
2c140 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
2c150 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75  implement the su
2c160 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20  bquery.    **.  
2c170 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72    ** The subquer
2c180 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  y is implemented
2c190 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
2c1a0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
2c1b0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a   are true:.    *
2c1c0 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
2c1d0 71 75 65 72 79 20 69 73 20 67 75 61 72 61 6e 74  query is guarant
2c1e0 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75  eed to be the ou
2c1f0 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61  ter loop (so tha
2c200 74 20 69 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  t it.    **     
2c210 20 20 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64     does not need
2c220 20 74 6f 20 62 65 20 63 6f 6d 70 75 74 65 64 20   to be computed 
2c230 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a  more than once).
2c240 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 54 68      **   (2)  Th
2c250 65 20 41 4c 4c 20 6b 65 79 77 6f 72 64 20 61 66  e ALL keyword af
2c260 74 65 72 20 53 45 4c 45 43 54 20 69 73 20 6f 6d  ter SELECT is om
2c270 69 74 74 65 64 2e 20 20 28 41 70 70 6c 69 63 61  itted.  (Applica
2c280 74 69 6f 6e 73 20 61 72 65 0a 20 20 20 20 2a 2a  tions are.    **
2c290 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20          allowed 
2c2a0 74 6f 20 73 61 79 20 22 53 45 4c 45 43 54 20 41  to say "SELECT A
2c2b0 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 6a  LL" instead of j
2c2c0 75 73 74 20 22 53 45 4c 45 43 54 22 20 74 6f 20  ust "SELECT" to 
2c2d0 64 69 73 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20  disable.    **  
2c2e0 20 20 20 20 20 20 74 68 65 20 75 73 65 20 6f 66        the use of
2c2f0 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 29 0a 20   co-routines.). 
2c300 20 20 20 2a 2a 20 20 20 28 33 29 20 20 43 6f 2d     **   (3)  Co-
2c310 72 6f 75 74 69 6e 65 73 20 61 72 65 20 6e 6f 74  routines are not
2c320 20 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20   disabled using 
2c330 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2c340 74 72 6f 6c 28 29 0a 20 20 20 20 2a 2a 20 20 20  trol().    **   
2c350 20 20 20 20 20 77 69 74 68 20 53 51 4c 49 54 45       with SQLITE
2c360 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
2c370 5a 41 54 49 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a  ZATIONS..    **.
2c380 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65      ** TODO: Are
2c390 20 74 68 65 72 65 20 6f 74 68 65 72 20 72 65 61   there other rea
2c3a0 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29 20  sons beside (1) 
2c3b0 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74  to use a co-rout
2c3c0 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65  ine.    ** imple
2c3d0 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a  mentation?.    *
2c3e0 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20  /.    if( i==0. 
2c3f0 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74      && (pTabList
2c400 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20  ->nSrc==1.      
2c410 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69        || (pTabLi
2c420 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e  st->a[1].fg.join
2c430 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54  type&(JT_LEFT|JT
2c440 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a  _CROSS))!=0)  /*
2c450 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 26 26 20   (1) */.     && 
2c460 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2c470 46 5f 41 6c 6c 29 3d 3d 30 20 20 20 20 20 20 20  F_All)==0       
2c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2c4a0 32 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 4f 70  2) */.     && Op
2c4b0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2c4c0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62  d(db, SQLITE_Sub
2c4d0 71 43 6f 72 6f 75 74 69 6e 65 29 20 20 20 20 20  qCoroutine)     
2c4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29            /* (3)
2c4f0 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
2c500 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
2c510 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
2c520 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
2c530 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2c540 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2c550 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
2c560 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
2c570 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2c580 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2c590 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
2c5a0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2c5b0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2c5c0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2c5d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c5e0 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
2c5f0 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2c600 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
2c610 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
2c620 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2c630 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2c640 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
2c650 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2c660 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
2c670 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2c680 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2c690 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
2c6a0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2c6b0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2c6c0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2c6d0 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2c6e0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2c6f0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2c700 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2c710 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2c720 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2c730 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2c740 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
2c750 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
2c760 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2c770 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
2c780 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
2c790 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
2c7a0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
2c7b0 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
2c7c0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2c7d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c7e0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2c7f0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
2c800 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
2c810 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
2c820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c830 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
2c840 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
2c850 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
2c860 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
2c870 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
2c880 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
2c890 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
2c8a0 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
2c8b0 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
2c8c0 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
2c8d0 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
2c8e0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
2c8f0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
2c900 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
2c910 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
2c920 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
2c930 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
2c940 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
2c950 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
2c960 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
2c970 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
2c980 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
2c990 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
2c9a0 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20  >addrFillSub==0 
2c9b0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2c9c0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
2c9d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2c9e0 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69    topAddr = sqli
2c9f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ca00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2ca10 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2ca20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2ca30 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f  addrFillSub = to
2ca40 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69  pAddr+1;.      i
2ca50 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43  f( pItem->fg.isC
2ca60 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a  orrelated==0 ){.
2ca70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2ca80 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
2ca90 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64  t correlated and
2caa0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
2cab0 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20  nside of.       
2cac0 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74   ** a trigger, t
2cad0 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  hen we only need
2cae0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
2caf0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62  value of the sub
2cb00 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  query.        **
2cb10 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20   once. */.      
2cb20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c    onceAddr = sql
2cb30 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
2cb40 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
2cb50 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2cb60 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2cb70 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
2cb80 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
2cb90 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2cba0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2cbb0 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
2cbc0 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
2cbd0 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
2cbe0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2cbf0 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
2cc00 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2cc10 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
2cc20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
2cc30 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2cc40 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2cc50 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2cc60 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2cc70 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2cc80 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
2cc90 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
2cca0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
2ccb0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
2ccc0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2ccd0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2cce0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
2ccf0 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
2cd00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e  beJumpHere(v, on
2cd10 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  ceAddr);.      r
2cd20 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  etAddr = sqlite3
2cd30 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2cd40 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  _Return, pItem->
2cd50 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2cd60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2cd70 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
2cd80 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2cd90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2cda0 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74  dbeChangeP1(v, t
2cdb0 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29  opAddr, retAddr)
2cdc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
2cdd0 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2cde0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
2cdf0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2ce00 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2ce10 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2ce20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
2ce30 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
2ce40 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
2ce50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2ce60 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73  Various elements
2ce70 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63   of the SELECT c
2ce80 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c  opied into local
2ce90 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20   variables for. 
2cea0 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20   ** convenience 
2ceb0 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
2cec0 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72  >pEList;.  pWher
2ced0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
2cee0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
2cef0 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
2cf00 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
2cf10 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  .  sDistinct.isT
2cf20 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
2cf30 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
2cf40 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43  )!=0;..#if SELEC
2cf50 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2cf60 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2cf70 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
2cf80 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2cf90 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
2cfa0 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52  p,("After all FR
2cfb0 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73  OM-clause analys
2cfc0 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  is:\n"));.    sq
2cfd0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2cfe0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2cff0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
2d000 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44  f the query is D
2d010 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20  ISTINCT with an 
2d020 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20  ORDER BY but is 
2d030 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
2d040 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74  , and .  ** if t
2d050 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
2d060 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
2d070 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c  e ORDER BY list,
2d080 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79   then this query
2d090 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  .  ** can be rew
2d0a0 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55  ritten as a GROU
2d0b0 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77  P BY. In other w
2d0c0 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a  ords, this:.  **
2d0d0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2d0e0 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52   DISTINCT xyz FR
2d0f0 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  OM ... ORDER BY 
2d100 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  xyz.  **.  ** is
2d110 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a   transformed to:
2d120 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2d130 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  ELECT xyz FROM .
2d140 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20  .. GROUP BY xyz 
2d150 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
2d160 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
2d170 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72  d form is prefer
2d180 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  red as a single 
2d190 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74  index (or temp-t
2d1a0 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20  able) may be .  
2d1b0 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  ** used for both
2d1c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   the ORDER BY an
2d1d0 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  d DISTINCT proce
2d1e0 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e  ssing. As origin
2d1f0 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74  ally .  ** writt
2d200 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73  en the query mus
2d210 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62  t use a temp-tab
2d220 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  le for at least 
2d230 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  one of the ORDER
2d240 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49   .  ** BY and DI
2d250 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69  STINCT, and an i
2d260 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65  ndex or separate
2d270 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
2d280 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a  the other..  */.
2d290 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
2d2a0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
2d2b0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
2d2c0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20  ==SF_Distinct . 
2d2d0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
2d2e0 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72  ListCompare(sSor
2d2f0 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69  t.pOrderBy, pELi
2d300 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
2d310 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2d320 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
2d330 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
2d340 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
2d350 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2d360 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b  (db, pEList, 0);
2d370 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
2d380 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
2d390 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
2d3a0 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
2d3b0 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
2d3c0 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
2d3d0 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
2d3e0 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
2d3f0 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
2d400 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
2d410 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
2d420 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
2d430 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
2d440 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
2d450 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2d460 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2d470 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54   );..#if SELECTT
2d480 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2d490 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2d4a0 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
2d4b0 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  ){.      SELECTT
2d4c0 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2d4d0 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20  e,p,("Transform 
2d4e0 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52  DISTINCT into GR
2d4f0 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20  OUP BY:\n"));.  
2d500 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2d510 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2d520 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
2d530 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2d540 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
2d550 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2d560 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65  create an epheme
2d570 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a  ral index to.  *
2d580 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67  * do the sorting
2d590 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74  .  But this sort
2d5a0 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e  ing ephemeral in
2d5b0 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
2d5c0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73  .  ** being unus
2d5d0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
2d5e0 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
2d5f0 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
2d600 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61  der..  ** If tha
2d610 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
2d620 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  hen the OP_OpenE
2d630 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
2d640 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  tion will be.  *
2d650 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  * changed to an 
2d660 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20  OP_Noop once we 
2d670 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
2d680 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2d690 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65  x is.  ** not ne
2d6a0 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74  eded.  The sSort
2d6b0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76  .addrSortIndex v
2d6c0 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
2d6d0 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20  to facilitate.  
2d6e0 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  ** that change..
2d6f0 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
2d700 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2d710 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2d720 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
2d730 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2d740 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73  prList(pParse, s
2d750 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30  Sort.pOrderBy, 0
2d760 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
2d770 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75  ;.    sSort.iECu
2d780 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
2d790 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74  Tab++;.    sSort
2d7a0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2d7b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d7c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2d7d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2d7e0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45          sSort.iE
2d7f0 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f  Cursor, sSort.pO
2d800 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b  rderBy->nExpr+1+
2d810 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
2d820 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
2d830 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2d840 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b  KEYINFO.      );
2d850 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53  .  }else{.    sS
2d860 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d870 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
2d880 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
2d890 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
2d8a0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
2d8b0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
2d8c0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
2d8d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d8e0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
2d8f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d900 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
2d910 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
2d920 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  SDParm, pEList->
2d930 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
2d940 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
2d950 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
2d960 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2d970 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e  Label(v);.  p->n
2d980 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b  SelectRow = 320;
2d990 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72    /* 4 billion r
2d9a0 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ows */.  compute
2d9b0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
2d9c0 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
2d9d0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
2d9e0 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64  ==0 && sSort.add
2d9f0 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
2da00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2da10 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
2da20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2da30 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  dex, OP_SorterOp
2da40 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73  en);.    sSort.s
2da50 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54  ortFlags |= SORT
2da60 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a  FLAG_UseSorter;.
2da70 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
2da80 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
2da90 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
2daa0 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
2dab0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
2dac0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2dad0 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
2dae0 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
2daf0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2db00 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
2db10 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
2db20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2db30 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
2db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db50 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73              sDis
2db60 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
2db70 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db90 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
2dba0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2dbb0 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30  rse, p->pEList,0
2dbc0 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,0),.           
2dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbe0 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
2dbf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2dc00 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
2dc10 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
2dc20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2dc30 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
2dc40 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a  INCT_UNORDERED;.
2dc50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69    }else{.    sDi
2dc60 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2dc70 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2dc80 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  T_NOOP;.  }..  i
2dc90 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
2dca0 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
2dcb0 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
2dcc0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
2dcd0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2dce0 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
2dcf0 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
2dd00 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
2dd10 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
2dd20 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
2dd30 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  t( WHERE_USE_LIM
2dd40 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69  IT==SF_FixedLimi
2dd50 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c  t );.    wctrlFl
2dd60 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61  ags |= p->selFla
2dd70 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
2dd80 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69  it;..    /* Begi
2dd90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
2dda0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e  can. */.    pWIn
2ddb0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
2ddc0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
2ddd0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
2dde0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
2ddf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de10 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c  p->pEList, wctrl
2de20 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63  Flags, p->nSelec
2de30 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  tRow);.    if( p
2de40 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2de50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2de60 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2de70 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
2de80 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
2de90 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
2dea0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2deb0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2dec0 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2ded0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2dee0 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2def0 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
2df00 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2df10 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
2df20 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2df30 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
2df40 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2df50 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2df60 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2df70 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
2df80 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
2df90 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2dfa0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53  WInfo);.      sS
2dfb0 6f 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65  ort.bOrderedInne
2dfc0 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57  rLoop = sqlite3W
2dfd0 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72  hereOrderedInner
2dfe0 4c 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Loop(pWInfo);.  
2dff0 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f      if( sSort.nO
2e000 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64  BSat==sSort.pOrd
2e010 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
2e020 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
2e030 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2e040 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2e050 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
2e060 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
2e070 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
2e080 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
2e090 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
2e0a0 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
2e0b0 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
2e0c0 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
2e0d0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
2e0e0 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
2e0f0 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
2e100 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72    if( sSort.addr
2e110 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
2e120 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d  sSort.pOrderBy==
2e130 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2e140 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
2e150 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
2e160 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
2e170 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
2e180 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
2e190 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65   loop. */.    se
2e1a0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2e1b0 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
2e1c0 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44   -1, &sSort, &sD
2e1d0 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1f0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2e200 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57  ContinueLabel(pW
2e210 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
2e220 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2e230 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
2e240 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20  l(pWInfo));..   
2e250 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
2e260 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
2e270 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2e280 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2e290 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
2e2a0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68   /* This case wh
2e2b0 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61  en there exist a
2e2c0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2e2d0 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59  ns or a GROUP BY
2e2e0 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f   clause.    ** o
2e2f0 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61  r both */.    Na
2e300 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
2e310 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
2e320 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
2e330 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
2e340 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
2e350 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
2e360 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
2e370 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
2e380 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
2e390 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2e3a0 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
2e3b0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
2e3c0 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
2e3d0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
2e3e0 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
2e3f0 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
2e400 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
2e410 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
2e420 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
2e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e440 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
2e450 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
2e460 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
2e470 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
2e480 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2e490 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
2e4a0 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
2e4b0 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
2e4c0 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
2e4d0 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
2e4e0 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
2e4f0 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
2e500 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
2e510 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
2e520 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
2e530 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
2e540 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  d;        /* End
2e550 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66   of processing f
2e560 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  or this SELECT *
2e570 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54  /.    int sortPT
2e580 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65  ab = 0;   /* Pse
2e590 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f  udotable used to
2e5a0 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20   decode sorting 
2e5b0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69  results */.    i
2e5c0 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20  nt sortOut = 0; 
2e5d0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67     /* Output reg
2e5e0 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73  ister from the s
2e5f0 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  orter */.    int
2e600 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b   orderByGrp = 0;
2e610 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2e620 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44  GROUP BY and ORD
2e630 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61  ER BY are the sa
2e640 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  me */..    /* Re
2e650 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c  move any and all
2e660 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e   aliases between
2e670 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2e680 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  and the.    ** G
2e690 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
2e6a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2e6b0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
2e6c0 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
2e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e6e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2e6f0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
2e700 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
2e710 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  tem;  /* For loo
2e720 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73  ping over expres
2e730 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a  sion in a list *
2e740 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  /..      for(k=p
2e750 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
2e760 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74   pItem=p->pEList
2e770 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
2e780 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2e790 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
2e7a0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
2e7b0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f        for(k=pGro
2e7c0 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74  upBy->nExpr, pIt
2e7d0 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
2e7e0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
2e7f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
2e800 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
2e810 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2e820 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c   assert( 66==sql
2e830 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20  ite3LogEst(100) 
2e840 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
2e850 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20  nSelectRow>66 ) 
2e860 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2e870 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  66;.    }else{. 
2e880 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
2e890 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
2e8a0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   );.      p->nSe
2e8b0 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20  lectRow = 0;.   
2e8c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2e8d0 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
2e8e0 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
2e8f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2e900 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
2e910 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
2e920 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
2e930 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
2e940 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2e950 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
2e960 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
2e970 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
2e980 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
2e990 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
2e9a0 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
2e9b0 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
2e9c0 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
2e9d0 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20   GROUP BY might 
2e9e0 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74  use a.    ** dat
2e9f0 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74  abase index that
2ea00 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20   causes rows to 
2ea10 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  be grouped toget
2ea20 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a  her as required.
2ea30 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61      ** but not a
2ea40 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20  ctually sorted. 
2ea50 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f  Either way, reco
2ea60 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
2ea70 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45   the.    ** ORDE
2ea80 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42  R BY and GROUP B
2ea90 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68  Y clauses are th
2eaa0 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e  e same by settin
2eab0 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70  g the orderByGrp
2eac0 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
2ead0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  .  */.    if( sq
2eae0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2eaf0 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73  pare(pGroupBy, s
2eb00 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d  Sort.pOrderBy, -
2eb10 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  1)==0 ){.      o
2eb20 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20  rderByGrp = 1;. 
2eb30 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72     }. .    /* Cr
2eb40 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20  eate a label to 
2eb50 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20  jump to when we 
2eb60 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68  want to abort th
2eb70 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61  e query */.    a
2eb80 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
2eb90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2eba0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
2ebb0 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
2ebc0 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
2ebd0 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
2ebe0 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
2ebf0 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
2ec00 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
2ec10 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
2ec20 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
2ec30 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
2ec40 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
2ec50 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
2ec60 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
2ec70 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
2ec80 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
2ec90 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
2eca0 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
2ecb0 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
2ecc0 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
2ecd0 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mnReg = pParse->
2ece0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67  nMem+1;.    sAgg
2ecf0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
2ed00 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
2ed10 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2ed20 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
2ed30 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
2ed40 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
2ed50 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2ed60 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
2ed70 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
2ed80 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2ed90 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70  st(&sNC, sSort.p
2eda0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
2edb0 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
2edc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2edd0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2ede0 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
2edf0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2ee00 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
2ee10 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
2ee20 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
2ee30 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
2ee40 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
2ee50 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ee60 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
2ee70 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
2ee80 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2ee90 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
2eea0 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46  ags |= NC_InAggF
2eeb0 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
2eec0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2eed0 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
2eee0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
2eef0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
2ef00 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
2ef10 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63  &= ~NC_InAggFunc
2ef20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
2ef30 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61  Info.mxReg = pPa
2ef40 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
2ef50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2ef60 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
2ef70 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50  t_end;..    /* P
2ef80 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
2ef90 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
2efa0 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
2efb0 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
2efc0 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
2efd0 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
2efe0 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
2eff0 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
2f000 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2f010 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
2f020 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
2f030 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
2f040 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
2f050 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
2f060 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b        int addr1;
2f070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
2f080 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
2f090 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
2f0a0 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
2f0b0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
2f0c0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
2f0d0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
2f0e0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
2f0f0 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
2f100 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
2f110 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
2f120 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
2f130 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2f140 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
2f150 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
2f160 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
2f170 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2f180 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
2f190 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
2f1a0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
2f1b0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
2f1c0 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
2f1d0 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
2f1e0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2f1f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2f200 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
2f210 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
2f220 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
2f230 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
2f240 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
2f250 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2f260 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
2f270 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
2f280 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
2f290 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
2f2a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2f2b0 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
2f2c0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
2f2d0 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
2f2e0 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
2f2f0 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
2f300 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
2f310 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
2f320 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
2f330 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
2f340 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
2f350 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
2f360 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
2f370 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
2f380 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
2f390 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
2f3a0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2f3b0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
2f3c0 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
2f3d0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2f3e0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2f3f0 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41   pGroupBy, 0, sA
2f400 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b  ggInfo.nColumn);
2f410 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
2f420 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
2f430 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2f440 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
2f450 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2f460 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
2f470 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
2f480 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
2f490 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
2f4a0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
2f4b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
2f4c0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
2f4d0 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
2f4e0 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
2f4f0 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
2f500 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
2f510 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
2f520 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
2f530 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
2f540 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2f550 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
2f560 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2f570 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
2f580 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
2f590 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2f5a0 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
2f5b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2f5c0 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
2f5d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2f5e0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
2f5f0 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
2f600 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
2f610 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2f620 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2f630 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
2f640 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
2f650 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2f660 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
2f670 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
2f680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f690 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2f6a0 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
2f6b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2f6c0 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
2f6d0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2f6e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f6f0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2f700 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
2f710 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2f720 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
2f730 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
2f740 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
2f750 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2f760 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
2f770 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
2f780 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
2f790 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
2f7a0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
2f7b0 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
2f7c0 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
2f7d0 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
2f7e0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
2f7f0 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
2f800 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
2f810 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
2f820 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
2f830 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
2f840 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
2f850 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
2f860 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
2f870 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
2f880 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
2f890 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
2f8a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2f8b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2f8c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2f8d0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
2f8e0 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  t);.      pWInfo
2f8f0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2f900 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2f910 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
2f920 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20  GroupBy, 0,.    
2f930 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
2f940 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72  PBY | (orderByGr
2f950 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59  p ? WHERE_SORTBY
2f960 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20  GROUP : 0), 0.  
2f970 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
2f980 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
2f990 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2f9a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2f9b0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2f9c0 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d  Info)==pGroupBy-
2f9d0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2f9e0 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
2f9f0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
2fa00 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
2fa10 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
2fa20 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
2fa30 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
2fa40 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
2fa50 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
2fa60 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
2fa70 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
2fa80 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
2fa90 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
2faa0 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
2fab0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
2fac0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
2fad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fae0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
2faf0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
2fb00 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
2fb10 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
2fb20 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
2fb30 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
2fb40 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
2fb50 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
2fb60 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
2fb70 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
2fb80 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
2fb90 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
2fba0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
2fbb0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
2fbc0 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
2fbd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
2fbe0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
2fbf0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
2fc00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
2fc10 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
2fc20 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
2fc30 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
2fc40 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
2fc50 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
2fc60 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
2fc70 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
2fc80 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
2fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fca0 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
2fcb0 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
2fcc0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
2fcd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
2fce0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
2fcf0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
2fd00 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
2fd10 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
2fd20 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
2fd30 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2fd40 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
2fd50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2fd60 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
2fd70 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
2fd80 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
2fd90 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
2fda0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2fdb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2fdc0 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
2fdd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2fde0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
2fdf0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2fe00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2fe10 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2fe20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2fe30 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
2fe40 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
2fe50 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20  egBase, 0, 0);. 
2fe60 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
2fe70 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
2fe80 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
2fe90 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
2fea0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2feb0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
2fec0 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
2fed0 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
2fee0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
2fef0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2ff10 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
2ff20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2ff30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
2ff40 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72  ColumnToReg(pPar
2ff50 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
2ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff70 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
2ff80 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
2ff90 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29  Col->iTable, r1)
2ffa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
2ffb0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2ffc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ffd0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
2ffe0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2fff0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
30000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30010 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
30020 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
30030 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
30040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30050 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
30060 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
30070 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
30080 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
30090 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
300a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
300b0 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
300c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
300d0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
300e0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
300f0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
30100 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
30110 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
30120 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
30130 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
30140 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
30150 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
30160 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
30170 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
30180 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30190 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
301a0 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
301b0 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
301c0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
301d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
301e0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
301f0 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
30200 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
30210 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
30220 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
30230 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56  UP BY sort")); V
30240 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
30250 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
30260 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
30270 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
30280 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
30290 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  r(pParse);..    
302a0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
302b0 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65   the index or te
302c0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73  mporary table us
302d0 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20  ed by the GROUP 
302e0 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a  BY sort.      **
302f0 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20   will naturally 
30300 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
30310 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72  the order requir
30320 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20  ed by the ORDER 
30330 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  BY.      ** clau
30340 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65  se, cancel the e
30350 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
30360 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65  pen coded earlie
30370 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
30380 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20    ** This is an 
30390 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
303a0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
303b0 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
303c0 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
303d0 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c    ** Use the SQL
303e0 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
303f0 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54   flag with SQLIT
30400 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
30410 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a  IZER to .      *
30420 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f  * disable this o
30430 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
30440 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
30450 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
30460 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70  orderByGrp && Op
30470 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
30480 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f  d(db, SQLITE_Gro
30490 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20  upByOrder) .    
304a0 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f     && (groupBySo
304b0 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65  rt || sqlite3Whe
304c0 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66  reIsSorted(pWInf
304d0 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  o)).      ){.   
304e0 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
304f0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
30500 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
30510 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
30520 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
30530 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
30540 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
30550 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
30560 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
30570 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
30580 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
30590 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
305a0 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
305b0 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
305c0 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
305d0 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
305e0 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
305f0 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
30600 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
30610 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
30620 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
30630 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
30640 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
30650 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
30660 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
30670 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
30680 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
30690 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
306a0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
306b0 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
306c0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
306d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
306e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
306f0 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
30700 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  fo.sortingIdx,. 
30710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30720 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74           sortOut
30730 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20  , sortPTab);.   
30740 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
30750 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
30760 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
30770 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
30780 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
30790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
307a0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
307b0 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
307c0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
307d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
307e0 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
307f0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
30800 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
30810 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
30820 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
30830 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
30840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30860 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
30870 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
30880 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
30890 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
308a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
308b0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
308c0 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
308d0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
308e0 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
308f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
30900 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
30910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
30920 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
30930 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31  r1+1, 0, addr1+1
30940 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
30950 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  v);..      /* Ge
30960 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
30970 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
30980 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
30990 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
309a0 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
309b0 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
309c0 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
309d0 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
309e0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
309f0 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
30a00 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
30a10 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
30a20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
30a30 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
30a40 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
30a50 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
30a60 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
30a70 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
30a80 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
30a90 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
30aa0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
30ab0 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
30ac0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
30ad0 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
30ae0 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
30af0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
30b00 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
30b10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30b20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
30b30 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
30b40 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
30b50 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
30b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30b70 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
30b80 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
30b90 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
30ba0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
30bb0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
30bc0 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
30bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30be0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
30bf0 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
30c00 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
30c10 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
30c20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
30c30 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
30c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30c50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
30c60 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
30c70 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
30c80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
30c90 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
30ca0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
30cb0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
30cc0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
30cd0 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
30ce0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
30cf0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
30d00 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
30d10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30d20 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
30d30 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
30d40 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
30d50 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
30d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30d70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
30d80 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
30d90 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
30da0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
30db0 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
30dc0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
30dd0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
30de0 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
30df0 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
30e00 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
30e10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30e20 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
30e30 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
30e40 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
30e50 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
30e60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
30e70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
30e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
30e90 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
30ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30eb0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
30ec0 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
30ed0 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  dx);.      }..  
30ee0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
30ef0 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
30f00 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
30f10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30f20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
30f30 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
30f40 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
30f50 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
30f60 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
30f70 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20  final row"));.. 
30f80 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65       /* Jump ove
30f90 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  r the subroutine
30fa0 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
30fb0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
30fc0 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20  (v, addrEnd);.. 
30fd0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
30fe0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
30ff0 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
31000 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
31010 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
31020 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
31030 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
31040 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
31050 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
31060 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
31070 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
31080 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
31090 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
310a0 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
310b0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
310c0 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
310d0 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
310e0 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
310f0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
31100 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
31110 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
31120 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
31130 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
31140 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
31150 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
31160 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31170 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
31180 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
31190 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
311a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
311b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
311c0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
311d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
311e0 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
311f0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
31200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31210 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
31220 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
31230 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31240 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
31250 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
31260 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
31270 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
31280 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
31290 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
312a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
312b0 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
312c0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
312d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
312e0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
312f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
31300 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
31310 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
31320 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
31330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31340 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
31350 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
31360 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
31370 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
31380 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
31390 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
313a0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
313b0 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
313c0 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
313d0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
313e0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
313f0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
31400 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53  >pEList, -1, &sS
31410 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ort,.           
31420 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73             &sDis
31430 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
31440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31450 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
31460 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
31470 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
31480 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
31490 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
314a0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
314b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
314c0 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
314d0 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
314e0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
314f0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
31500 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
31510 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
31520 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
31530 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
31540 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
31550 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
31560 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
31570 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
31580 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
31590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
315a0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
315b0 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
315c0 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
315d0 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
315e0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
315f0 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
31600 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
31610 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
31620 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69  st *pDel = 0;.#i
31630 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31640 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
31650 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
31660 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20        if( (pTab 
31670 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  = isSimpleCount(
31680 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d  p, &sAggInfo))!=
31690 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
316a0 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  If isSimpleCount
316b0 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  () returns a poi
316c0 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20  nter to a Table 
316d0 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a  structure, then.
316e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
316f0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
31700 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
31710 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31720 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
31730 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
31740 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31750 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
31760 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
31770 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65  returned represe
31780 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e  nts table <tbl>.
31790 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
317a0 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74      ** This stat
317b0 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d  ement is so comm
317c0 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70  on that it is op
317d0 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c  timized speciall
317e0 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  y. The.        *
317f0 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72  * OP_Count instr
31800 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
31810 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65  ed either on the
31820 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68   intkey table th
31830 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
31840 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20  ntains the data 
31850 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20  for table <tbl> 
31860 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73  or on one of its
31870 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20   indexes. It.   
31880 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65       ** is bette
31890 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  r to execute the
318a0 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c   op on an index,
318b0 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20   as indexes are 
318c0 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a  almost.        *
318d0 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20  * always spread 
318e0 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65  across less page
318f0 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72  s than their cor
31900 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
31910 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
31920 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
31930 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
31940 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
31950 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
31960 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63  hema);.        c
31970 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20  onst int iCsr = 
31980 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
31990 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
319a0 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a   scan b-tree */.
319b0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
319c0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
319d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
319e0 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
319f0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79  e */.        Key
31a00 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
31a10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31a20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72    /* Keyinfo for
31a30 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a   scanned index *
31a40 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
31a50 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
31a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31a70 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75  * Best index fou
31a80 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
31a90 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d       int iRoot =
31aa0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20   pTab->tnum;    
31ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
31ac0 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65  t page of scanne
31ad0 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  d b-tree */..   
31ae0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
31af0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
31b00 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
31b10 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
31b20 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
31b30 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
31b40 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
31b50 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
31b60 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74   for the index t
31b70 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65  hat has the lowe
31b80 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20  st scan cost..  
31b90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31ba0 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
31bb0 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
31bc0 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
31bd0 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
31be0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31bf0 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29   ** (2013-10-03)
31c00 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68   Do not count th
31c10 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70  e entries in a p
31c20 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20  artial index..  
31c30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31c40 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
31c50 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
31c60 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
31c70 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
31c80 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
31c90 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
31ca0 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
31cb0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
31cc0 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
31cd0 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20  d(pTab) ) pBest 
31ce0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
31cf0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
31d00 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
31d10 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
31d20 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
31d30 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
31d40 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f    if( pIdx->bUno
31d50 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
31d60 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a       && pIdx->sz
31d70 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
31d80 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20  abRow.          
31d90 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49   && pIdx->pPartI
31da0 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20  dxWhere==0.     
31db0 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74        && (!pBest
31dc0 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   || pIdx->szIdxR
31dd0 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52  ow<pBest->szIdxR
31de0 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ow).          ){
31df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
31e00 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
31e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31e20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
31e30 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
31e40 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74  iRoot = pBest->t
31e50 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  num;.          p
31e60 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
31e70 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
31e80 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a  pParse, pBest);.
31e90 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
31ea0 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61     /* Open a rea
31eb0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65  d-only cursor, e
31ec0 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f  xecute the OP_Co
31ed0 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63  unt, close the c
31ee0 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ursor. */.      
31ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31f00 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
31f10 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
31f20 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20  ot, iDb, 1);.   
31f30 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
31f40 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
31f50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
31f60 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
31f70 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
31f80 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
31f90 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
31fa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31fb0 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20  OP_Count, iCsr, 
31fc0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
31fd0 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
31fe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31ff0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
32000 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65  iCsr);.        e
32010 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
32020 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  t(pParse, pTab, 
32030 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pBest);.      }e
32040 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
32050 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
32060 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  OUNT */.      {.
32070 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
32080 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
32090 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
320a0 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
320b0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
320c0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
320d0 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
320e0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
320f0 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e  CT max(x) FROM .
32100 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ...        **.  
32110 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69        ** If it i
32120 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20  s, then ask the 
32130 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
32140 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f  to attempt to so
32150 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  rt results.     
32160 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
32170 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
32180 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
32190 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
321a0 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  e. .        ** I
321b0 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c  f where.c is abl
321c0 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73  e to produce res
321d0 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74  ults sorted in t
321e0 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  his order, then.
321f0 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76          ** add v
32200 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
32210 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
32220 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
32230 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  er the .        
32240 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69  ** first iterati
32250 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69  on (since the fi
32260 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
32270 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20   the loop is .  
32280 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
32290 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
322a0 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
322b0 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
322c0 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a  ximum .        *
322d0 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68  * value of x, th
322e0 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69  e only row requi
322f0 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  red)..        **
32300 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70  .        ** A sp
32310 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20  ecial flag must 
32320 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  be passed to sql
32330 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
32340 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   to slightly.   
32350 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
32360 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f  ehavior as follo
32370 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ws:.        **. 
32380 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66         **   + If
32390 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
323a0 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
323b0 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
323c0 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  oded by.        
323d0 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
323e0 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
323f0 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
32400 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
32410 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  lue.        **  
32420 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
32430 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
32440 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
32450 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
32460 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
32470 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
32480 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
32490 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
324a0 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
324b0 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
324c0 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
324d0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
324e0 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
324f0 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
32500 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
32510 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
32520 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
32530 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
32540 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
32550 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
32560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32570 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
32580 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  x = 0;.        u
32590 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  8 flag = WHERE_O
325a0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
325b0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
325c0 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
325d0 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
325e0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
325f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
32600 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
32610 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
32620 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26   = minMaxQuery(&
32630 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d  sAggInfo, &pMinM
32640 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ax);.        }. 
32650 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
32660 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d  lag==0 || (pMinM
32670 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78  ax!=0 && pMinMax
32680 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a  ->nExpr==1) );..
32690 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
326a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   ){.          pM
326b0 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
326c0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
326d0 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20  MinMax, 0);.    
326e0 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
326f0 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20  nMax;.          
32700 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
32710 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 4d 69 6e  ocFailed || pMin
32720 4d 61 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Max!=0 );.      
32730 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
32740 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
32750 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
32760 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
32770 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f   = flag!=WHERE_O
32780 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b  RDERBY_MIN ?1:0;
32790 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
327a0 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  nMax->a[0].pExpr
327b0 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
327c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
327d0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
327e0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
327f0 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
32800 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
32810 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
32820 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
32830 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
32840 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
32850 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
32860 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
32870 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
32880 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32890 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
328a0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
328b0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
328c0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
328d0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
328e0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
328f0 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66  ere, pMinMax,0,f
32900 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  lag,0);.        
32910 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
32920 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
32930 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
32940 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
32950 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
32960 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
32970 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41  .        updateA
32980 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
32990 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
329a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
329b0 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69  MinMax==0 || pMi
329c0 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  nMax->nExpr==1 )
329d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
329e0 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
329f0 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b  red(pWInfo)>0 ){
32a00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
32a10 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73 71  e3VdbeGoto(v, sq
32a20 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
32a30 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20  abel(pWInfo));. 
32a40 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
32a50 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62  ment((v, "%s() b
32a60 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20  y index",.      
32a70 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d            (flag=
32a80 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
32a90 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
32aa0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32ab0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
32ac0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
32ad0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
32ae0 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
32af0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
32b00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53       }..      sS
32b10 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
32b20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
32b30 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
32b40 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
32b50 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
32b60 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
32b70 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
32b80 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
32b90 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a  ist, -1, 0, 0, .
32ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32bb0 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
32bc0 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
32bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
32be0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
32bf0 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
32c00 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
32c10 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
32c20 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
32c30 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
32c40 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
32c50 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63  ( sDistinct.eTnc
32c60 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
32c70 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
32c80 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
32c90 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
32ca0 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d  "DISTINCT");.  }
32cb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
32cc0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
32cd0 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
32ce0 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
32cf0 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
32d00 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
32d10 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
32d20 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
32d30 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
32d40 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
32d50 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
32d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32d70 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
32d80 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41  at>0 ? "RIGHT PA
32d90 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a  RT OF ORDER BY":
32da0 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20  "ORDER BY");.   
32db0 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
32dc0 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53  l(pParse, p, &sS
32dd0 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ort, pEList->nEx
32de0 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a  pr, pDest);.  }.
32df0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
32e00 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
32e10 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
32e20 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
32e30 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
32e40 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73  * The SELECT has
32e50 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20   been coded. If 
32e60 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
32e70 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  r in the Parse s
32e80 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73  tructure,.  ** s
32e90 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
32ea0 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69  de to 1. Otherwi
32eb0 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  se 0. */.  rc = 
32ec0 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29  (pParse->nErr>0)
32ed0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
32ee0 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
32ef0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
32f00 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
32f10 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
32f20 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
32f30 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
32f40 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
32f50 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
32f60 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
32f70 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
32f80 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49  lectId);..  /* I
32f90 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
32fa0 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20  ames if results 
32fb0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  of the SELECT ar
32fc0 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a  e to be output..
32fd0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
32fe0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73  QLITE_OK && pDes
32ff0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
33000 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
33010 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
33020 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
33030 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
33040 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
33050 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  db, sAggInfo.aCo
33060 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
33070 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
33080 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c  .aFunc);.#if SEL
33090 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
330a0 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
330b0 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20  ,pParse,p,("end 
330c0 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b  processing\n"));
330d0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65  .  pParse->nSele
330e0 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64  ctIndent--;.#end
330f0 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
33100 7d 0a                                            }.