/ Hex Artifact Content
Login

Artifact 19ebf10e33de8e1f327cbc844aff12af74bdf0513b3eb1b712b7bcdca4c9bdb5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  end(pParse, 0,. 
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50    sqlite3Expr(pP
1030: 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45  arse->db,TK_ASTE
1040: 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20  RISK,0));.  }.  
1050: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pNew->pEList = p
1060: 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f  EList;.  pNew->o
1070: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
1080: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
1090: 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e  = selFlags;.  pN
10a0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
10b0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
10c0: 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  = 0;.#if SELECTT
10d0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
10e0: 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d  New->zSelName[0]
10f0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
1100: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
1110: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
1120: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
1130: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
1140: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
1150: 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29  .  if( pSrc==0 )
1160: 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44   pSrc = sqlite3D
1170: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
1180: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
1190: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
11a0: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
11b0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
11c0: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
11d0: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
11e0: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
11f0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1200: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1210: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1220: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
1230: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
1240: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
1250: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
1260: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
1270: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  fset;.  pNew->pW
1280: 69 74 68 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ith = 0;.  asser
1290: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
12a0: 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50   pLimit!=0 || pP
12b0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 0a 20 20 20  arse->nErr>0.   
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
12e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
12f0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
1300: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1310: 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  ed ) {.    clear
1320: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64  Select(pParse->d
1330: 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26  b, pNew, pNew!=&
1340: 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e  standin);.    pN
1350: 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ew = 0;.  }else{
1360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
1370: 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50  w->pSrc!=0 || pP
1380: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a  arse->nErr>0 );.
1390: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
13a0: 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a  ew!=&standin );.
13b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
13c0: 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
13d0: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
13e0: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
13f0: 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a  a Select object.
1400: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1410: 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c  electSetName(Sel
1420: 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ect *p, const ch
1430: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
1440: 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a  ( p && zName ){.
1450: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1460: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a  intf(sizeof(p->z
1470: 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65  SelName), p->zSe
1480: 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61  lName, "%s", zNa
1490: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  me);.  }.}.#endi
14a0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  f.../*.** Delete
14b0: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
14c0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
14d0: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
14e0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
14f0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1500: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1510: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1520: 20 69 66 28 20 70 20 29 20 63 6c 65 61 72 53 65   if( p ) clearSe
1530: 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a  lect(db, p, 1);.
1540: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1550: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1560: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
1570: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1580: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
1590: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
15a0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
15b0: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
15c0: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
15d0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
15e0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
15f0: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1600: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1610: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1620: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1630: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1640: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
1650: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
1660: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
1670: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
1680: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
1690: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
16a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
16b0: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
16c0: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
16d0: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
16e0: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
16f0: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1700: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1710: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1720: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1730: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1740: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
1750: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
1760: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1770: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
1780: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
1790: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
17a0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
17b0: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
17c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
17d0: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
17e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
17f0: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1800: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1810: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1820: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1830: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1840: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
1870: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1880: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
1890: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
18a0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
18b0: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
18c0: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
18d0: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
18e0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
18f0: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1900: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1910: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1920: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1930: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1940: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1950: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1960: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1970: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1980: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
1990: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
19a0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
19b0: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
19c0: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
19e0: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
19f0: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1a00: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1a10: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1a20: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1a30: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1a50: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1a60: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1a70: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1a80: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
1a90: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
1aa0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1ab0: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1ac0: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1af0: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1b00: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1b10: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1b20: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1b30: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1b40: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1b50: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1b60: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1b70: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1b80: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1b90: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1ba0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1bb0: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1bc0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1bd0: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1be0: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1bf0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1c00: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1c10: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1c20: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1c30: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1c40: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1c50: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1c60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c80: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1c90: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1ca0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1cb0: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1cc0: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1cd0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1ce0: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1cf0: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1d00: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1d10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1d20: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1d30: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1d40: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
1d50: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
1d60: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
1d70: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
1d80: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d90: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
1da0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1db0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1dc0: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1dd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1de0: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1df0: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1e00: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1e10: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1e20: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1e30: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1e40: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1e50: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1e60: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1e70: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1e80: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1e90: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1ea0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1eb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ec0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1ed0: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1ee0: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1ef0: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1f00: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1f10: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1f20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1f30: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1f40: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1f50: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1f60: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1f70: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1f80: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1f90: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1fa0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1fb0: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1fc0: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1fd0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1fe0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1ff0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
2000: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
2010: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
2020: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
2030: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
2040: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
2050: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
2060: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
2070: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
2080: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
2090: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
20a0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
20b0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
20c0: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
20d0: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
20e0: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
20f0: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
2100: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
2110: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
2120: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
2130: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
2140: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
2150: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
2160: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
2170: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
2180: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
2190: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
21a0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
21b0: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
21c0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
21d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21e0: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
21f0: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
2200: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
2210: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
2220: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
2230: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
2240: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
2250: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
2260: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
2270: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
2280: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
2290: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
22a0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
22b0: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
22c0: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
22d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2300: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
2310: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2330: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
2340: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
2350: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
2360: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
2370: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
2380: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
2390: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
23a0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
23b0: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
23c0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
23d0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
23e0: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
23f0: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2400: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2410: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2420: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2430: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2450: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2460: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2470: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
2480: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
2490: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
24a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
24b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
24c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24d0: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
24e0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
24f0: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2500: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2510: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2520: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2530: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2540: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
2550: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
2560: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
2570: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
2580: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
2590: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
25a0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
25b0: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
25c0: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
25d0: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
25e0: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
25f0: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2600: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2610: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2630: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2640: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2660: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
2670: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
2680: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
2690: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
26a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26b0: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
26c0: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
26d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
26e0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
26f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2700: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2710: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2720: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2740: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
2750: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
2760: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
2770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2780: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
2790: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
27a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
27b0: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
27c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27d0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
27e0: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
27f0: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2820: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2830: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2840: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2850: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
2860: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
2870: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
2880: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
2890: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
28a0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
28b0: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
28c0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
28d0: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
28e0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
28f0: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2900: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2910: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2920: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2930: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2940: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2950: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2960: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2970: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2980: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2990: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
29a0: 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45  , pE2);.  if( pE
29b0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
29c0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
29d0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
29e0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
29f0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2a20: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
2a30: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2a40: 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  pEq, EP_NoReduce
2a50: 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67  );.    pEq->iRig
2a60: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
2a70: 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a  16)pE2->iTable;.
2a80: 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d    }.  *ppWhere =
2a90: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2aa0: 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45  db, *ppWhere, pE
2ab0: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  q);.}../*.** Set
2ac0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
2ad0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
2ae0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
2af0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
2b00: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
2b10: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
2b20: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
2b30: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
2b40: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2b50: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
2b60: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2b70: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
2b80: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
2b90: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
2ba0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
2bb0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
2bc0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
2bd0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2be0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2bf0: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2c00: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2c10: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2c20: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2c30: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2c40: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2c50: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2c60: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2c70: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2c80: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
2c90: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
2ca0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
2cb0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
2cc0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
2cd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2ce0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
2cf0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2d00: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
2d10: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2d20: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
2d30: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
2d40: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
2d50: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
2d60: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
2d70: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
2d80: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
2d90: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
2da0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
2db0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
2dc0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
2dd0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2de0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
2df0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
2e00: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
2e10: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
2e20: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
2e30: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
2e40: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
2e50: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
2e60: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
2e70: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
2e80: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
2e90: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
2ea0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2eb0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
2ec0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
2ed0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
2ee0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
2ef0: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
2f00: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
2f10: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
2f20: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
2f30: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
2f40: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
2f50: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
2f60: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
2f70: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
2f80: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
2f90: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
2fa0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
2fb0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
2fc0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
2fd0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2fe0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ff0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
3000: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
3010: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
3020: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c  etVVAProperty(p,
3030: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
3040: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
3050: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
3060: 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ble;.    if( p->
3070: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
3080: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
3090: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
30a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
30b0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
30c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30d0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
30e0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
30f0: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
3100: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
3110: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
3120: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
3130: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
3140: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
3150: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
3160: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
3170: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
3180: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3190: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
31a0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
31b0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
31c0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
31d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
31e0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
31f0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
3200: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
3210: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  erms..**.** The 
3220: 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20  terms of a FROM 
3230: 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61  clause are conta
3240: 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65  ined in the Sele
3250: 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72  ct.pSrc structur
3260: 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d  e..** The left m
3270: 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65  ost table is the
3280: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
3290: 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68  Select.pSrc.  Th
32a0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20  e right-most.** 
32b0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73  table is the las
32c0: 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f  t entry.  The jo
32d0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68  in operator is h
32e0: 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79  eld in the entry
32f0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e   to.** the left.
3300: 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63    Thus entry 0 c
3310: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e  ontains the join
3320: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   operator for th
3330: 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a  e join between.*
3340: 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20  * entries 0 and 
3350: 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53  1.  Any ON or US
3360: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f  ING clauses asso
3370: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3380: 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f  join are.** also
3390: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
33a0: 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   left entry..**.
33b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
33c0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
33d0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
33e0: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  ountered..*/.sta
33f0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72  tic int sqlitePr
3400: 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20  ocessJoin(Parse 
3410: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
3420: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
3430: 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  pSrc;           
3440: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61         /* All ta
3450: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
3460: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
3470: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3490: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
34a0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34b0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20  t_item *pLeft;  
34c0: 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65     /* Left table
34d0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
34e0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34f0: 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20  t_item *pRight; 
3500: 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c     /* Right tabl
3510: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
3520: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  /..  pSrc = p->p
3530: 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26  Src;.  pLeft = &
3540: 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52  pSrc->a[0];.  pR
3550: 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d  ight = &pLeft[1]
3560: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3570: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b  Src->nSrc-1; i++
3580: 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66  , pRight++, pLef
3590: 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  t++){.    Table 
35a0: 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66  *pLeftTab = pLef
35b0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62  t->pTab;.    Tab
35c0: 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20  le *pRightTab = 
35d0: 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20  pRight->pTab;.  
35e0: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a    int isOuter;..
35f0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c      if( NEVER(pL
3600: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
3610: 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e  ghtTab==0) ) con
3620: 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74  tinue;.    isOut
3630: 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67  er = (pRight->fg
3640: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
3650: 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f  UTER)!=0;..    /
3660: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
3670: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
3680: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
3690: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
36a0: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
36b0: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
36c0: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
36d0: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
36e0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
36f0: 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
3700: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
3710: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3720: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
3730: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
3740: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3750: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
3760: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
3770: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
3780: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
3790: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
37a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
37b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
37c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
37d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
37e0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
37f0: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
3800: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
3810: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
3820: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3830: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
3840: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
3850: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3860: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
3870: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
3880: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
3890: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
38a0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
38b0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
38c0: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
38d0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
38e0: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
38f0: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
3900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
3910: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
3920: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
3930: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
3940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3950: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
3960: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
3970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3980: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
3990: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
39a0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
39b0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
39c0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
39d0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
39e0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
39f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3a00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3a10: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
3a20: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
3a30: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
3a40: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
3a50: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
3a60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
3a70: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
3a80: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
3a90: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
3aa0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
3ab0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3ac0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3ad0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3ae0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3af0: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3b00: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3b10: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3b20: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3b30: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3b40: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3b50: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
3b60: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
3b70: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
3b80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
3b90: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
3ba0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
3bb0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3bc0: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3bd0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3be0: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3bf0: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3c00: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3c10: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3c20: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3c30: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3c40: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3c50: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
3c60: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
3c70: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
3c80: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
3c90: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
3ca0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
3cb0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3cc0: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3cd0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3ce0: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3cf0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3d00: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3d10: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3d20: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3d30: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3d40: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3d50: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
3d60: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
3d70: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
3d80: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3d90: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
3da0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
3db0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3dc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3dd0: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3de0: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3df0: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3e00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3e10: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3e20: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3e30: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3e40: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3e50: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
3e60: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
3e70: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
3e80: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3e90: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
3ea0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
3eb0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3ec0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3ed0: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3ee0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3ef0: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3f00: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3f10: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3f20: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3f30: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3f40: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3f50: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
3f60: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
3f70: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3f80: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
3f90: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
3fa0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
3fb0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3fc0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3fd0: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3fe0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3ff0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
4000: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
4010: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
4020: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
4030: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
4040: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
4050: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
4060: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
4070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4080: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4090: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
40a0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
40b0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
40c0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
40d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
40e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
40f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4100: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
4110: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
4120: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
4130: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
4140: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
4150: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
4160: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
4170: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
4180: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
4190: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
41a0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
41b0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
41c0: 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  d */.);../*.** G
41d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
41e0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
41f0: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4200: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4210: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4220: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4230: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4240: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4250: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4260: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4270: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4280: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4290: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
42a0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
42b0: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
42c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
42d0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
42e0: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
42f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4300: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4310: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4320: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4330: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4340: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4350: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4360: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4370: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4380: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4390: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
43a0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
43b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
43c0: 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
43d0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
43e0: 6e 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20  nPrefixReg      
43f0: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67     /* No. of reg
4400: 20 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74   prior to regDat
4410: 61 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  a available for 
4420: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  use */.){.  Vdbe
4430: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4440: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4460: 53 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  Stmt under const
4470: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
4480: 20 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d   bSeq = ((pSort-
4490: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
44a0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
44b0: 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ==0);.  int nExp
44c0: 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  r = pSort->pOrde
44d0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20  rBy->nExpr;     
44e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
44f0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
4500: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65  s */.  int nBase
4510: 20 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20   = nExpr + bSeq 
4520: 2b 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  + nData;        
4530: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
4540: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
4550: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  rd */.  int regB
4560: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73           /* Regs
4590: 20 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f   for sorter reco
45a0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  rd */.  int regR
45b0: 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65  ecord = ++pParse
45c0: 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
45d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65           /* Asse
45e0: 6d 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63  mbled sorter rec
45f0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42  ord */.  int nOB
4600: 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42  Sat = pSort->nOB
4610: 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44            /* ORD
4630: 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73  ER BY terms to s
4640: 6b 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  kip */.  int op;
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4670: 70 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72  pcode to add sor
4680: 74 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f  ter record to so
4690: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rter */.  int iL
46a0: 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46c0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f  LIMIT counter */
46d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71  ..  assert( bSeq
46e0: 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29  ==0 || bSeq==1 )
46f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74  ;.  assert( nDat
4700: 61 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d  a==1 || regData=
4710: 3d 72 65 67 4f 72 69 67 44 61 74 61 20 7c 7c 20  =regOrigData || 
4720: 72 65 67 4f 72 69 67 44 61 74 61 3d 3d 30 20 29  regOrigData==0 )
4730: 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  ;.  if( nPrefixR
4740: 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  eg ){.    assert
4750: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45  ( nPrefixReg==nE
4760: 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20  xpr+bSeq );.    
4770: 72 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74  regBase = regDat
4780: 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53 65 71  a - nExpr - bSeq
4790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
47a0: 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
47b0: 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70  >nMem + 1;.    p
47c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
47d0: 42 61 73 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Base;.  }.  asse
47e0: 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  rt( pSelect->iOf
47f0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65  fset==0 || pSele
4800: 63 74 2d 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b  ct->iLimit!=0 );
4810: 0a 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c  .  iLimit = pSel
4820: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  ect->iOffset ? p
4830: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
4840: 31 20 3a 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  1 : pSelect->iLi
4850: 6d 69 74 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61  mit;.  pSort->la
4860: 62 65 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  belDone = sqlite
4870: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4890: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
48a0: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64  rse, pSort->pOrd
48b0: 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 72  erBy, regBase, r
48c0: 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20 20  egOrigData,.    
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
48f0: 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69 67  L_DUP | (regOrig
4900: 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43 45  Data? SQLITE_ECE
4910: 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20 69  L_REF : 0));.  i
4920: 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73  f( bSeq ){.    s
4930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4940: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
4950: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4960: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4970: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65  ;.  }.  if( nPre
4980: 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44 61  fixReg==0 && nDa
4990: 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ta>0 ){.    sqli
49a0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
49b0: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
49c0: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 62   regBase+nExpr+b
49d0: 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d  Seq, nData);.  }
49e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
49f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4a00: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e  ecord, regBase+n
4a10: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
4a20: 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Sat, regRecord);
4a30: 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30 20  .  if( nOBSat>0 
4a40: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50 72  ){.    int regPr
4a50: 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20  evKey;   /* The 
4a60: 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c  first nOBSat col
4a70: 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65 76  umns of the prev
4a80: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
4a90: 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20  int addrFirst;  
4aa0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
4ab0: 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63  the OP_IfNot opc
4ac0: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ode */.    int a
4ad0: 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20  ddrJmp;      /* 
4ae0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
4af0: 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f  P_Jump opcode */
4b00: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
4b10: 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  ;      /* Opcode
4b20: 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20   that opens the 
4b30: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
4b40: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
4b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72  /* Number of sor
4b60: 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  ting key columns
4b70: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53  , including OP_S
4b80: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b  equence */.    K
4b90: 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20  eyInfo *pKI;    
4ba0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79   /* Original Key
4bb0: 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74  Info on the sort
4bc0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  er table */..   
4bd0: 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50   regPrevKey = pP
4be0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
4bf0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4c00: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
4c10: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70  .    nKey = nExp
4c20: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
4c30: 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66  t + bSeq;.    if
4c40: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ( bSeq ){.      
4c50: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
4c60: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c70: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61   OP_IfNot, regBa
4c80: 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20  se+nExpr); .    
4c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
4ca0: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4cb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4cc0: 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70  _SequenceTest, p
4cd0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43  .    }.    VdbeC
4cf0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d10: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
4d20: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67   regPrevKey, reg
4d30: 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  Base, pSort->nOB
4d40: 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20  Sat);.    pOp = 
4d50: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
4d60: 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53  (v, pSort->addrS
4d70: 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  ortIndex);.    i
4d80: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
4d90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
4da0: 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  turn;.    pOp->p
4db0: 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61  2 = nKey + nData
4dc0: 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d  ;.    pKI = pOp-
4dd0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
4de0: 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53    memset(pKI->aS
4df0: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49  ortOrder, 0, pKI
4e00: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a  ->nKeyField); /*
4e10: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74   Makes OP_Jump t
4e20: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4e30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4e40: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4e50: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4e60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4e70: 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20   pKI->nAllField 
4e80: 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  > pKI->nKeyField
4e90: 2b 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  +2 );.    pOp->p
4ea0: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79  4.pKeyInfo = key
4eb0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
4ec0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
4ed0: 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74  pOrderBy, nOBSat
4ee0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
4f10: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
4f20: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
4f30: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
4f40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4f50: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
4f60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4f70: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
4f80: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
4f90: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
4fa0: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
4fb0: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
4fc0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4fd0: 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  l(v);.    pSort-
4fe0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
4ff0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5010: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
5020: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
5030: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
5040: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
5050: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5060: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
5070: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
5080: 0a 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20  .    if( iLimit 
5090: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
50a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
50b0: 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
50c0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65  pSort->labelDone
50d0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
50e0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
50f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5100: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46  umpHere(v, addrF
5110: 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  irst);.    sqlit
5120: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
5130: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
5140: 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72  regPrevKey, pSor
5150: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5160: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5170: 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b  ere(v, addrJmp);
5180: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
5190: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
51a0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
51b0: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f   ){.    op = OP_
51c0: 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20  SorterInsert;.  
51d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
51e0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20  OP_IdxInsert;.  
51f0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
5200: 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
5210: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
5220: 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61     regBase+nOBSa
5250: 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29  t, nBase-nOBSat)
5260: 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29  ;.  if( iLimit )
5270: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
5280: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30 3b 0a      int r1 = 0;.
5290: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
52a0: 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69 74 20  sorter until it 
52b0: 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54 2b 4f  contains LIMIT+O
52c0: 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e 20 20  FFSET entries.  
52d0: 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20 20 20  (The iLimit.    
52e0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73 20 69  ** register is i
52f0: 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74 68 20  nitialized with 
5300: 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54 2b 4f  value of LIMIT+O
5310: 46 46 53 45 54 2e 29 20 20 41 66 74 65 72 20 74  FFSET.)  After t
5320: 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20 2a 2a  he sorter.    **
5330: 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c 65 74   fills up, delet
5340: 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e 74 72  e the least entr
5350: 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20  y in the sorter 
5360: 61 66 74 65 72 20 65 61 63 68 20 69 6e 73 65 72  after each inser
5370: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73 20 77  t..    ** Thus w
5380: 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d 6f 72  e never hold mor
5390: 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d 49 54  e than the LIMIT
53a0: 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69 6e 20  +OFFSET rows in 
53b0: 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65 20 2a  memory at once *
53c0: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  /.    addr = sql
53d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
53e0: 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  , OP_IfNotZero, 
53f0: 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
5400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5420: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72  v, OP_Last, pSor
5430: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
5440: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72    if( pSort->bOr
5450: 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29  deredInnerLoop )
5460: 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 2b 2b 70  {.      r1 = ++p
5470: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5490: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
54a0: 6e 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  n, pSort->iECurs
54b0: 6f 72 2c 20 6e 45 78 70 72 2c 20 72 31 29 3b 0a  or, nExpr, r1);.
54c0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
54d0: 74 28 28 76 2c 20 22 73 65 71 22 29 29 3b 0a 20  t((v, "seq"));. 
54e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
54f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5500: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
5510: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
5520: 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72  f( pSort->bOrder
5530: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
5540: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
5550: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 64 72 69  nner loop is dri
5560: 76 65 6e 20 62 79 20 61 6e 20 69 6e 64 65 78 20  ven by an index 
5570: 73 75 63 68 20 74 68 61 74 20 76 61 6c 75 65 73  such that values
5580: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74   from.      ** t
5590: 68 65 20 73 61 6d 65 20 69 74 65 72 61 74 69 6f  he same iteratio
55a0: 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  n of the inner l
55b0: 6f 6f 70 20 61 72 65 20 69 6e 20 73 6f 72 74 65  oop are in sorte
55c0: 64 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  d order, then.  
55d0: 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
55e0: 6c 79 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  ly jump to the n
55f0: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
5600: 20 61 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69   an inner loop i
5610: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  f the.      ** e
5620: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 63 75  ntry from the cu
5630: 72 72 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  rrent iteration 
5640: 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 69 6e 74  does not fit int
5650: 6f 20 74 68 65 20 74 6f 70 0a 20 20 20 20 20 20  o the top.      
5660: 2a 2a 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  ** LIMIT+OFFSET 
5670: 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
5680: 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  orter. */.      
5690: 69 6e 74 20 69 42 72 6b 20 3d 20 73 71 6c 69 74  int iBrk = sqlit
56a0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
56b0: 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20  r(v) + 2;.      
56c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56d0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 42  3(v, OP_Eq, regB
56e0: 61 73 65 2b 6e 45 78 70 72 2c 20 69 42 72 6b 2c  ase+nExpr, iBrk,
56f0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
5700: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5710: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
5720: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5730: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
5740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5750: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
5760: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
5770: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
5780: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
5790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
57a0: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
57b0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
57c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
57d0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
57e0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
57f0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5800: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
5810: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
5820: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
5830: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
5840: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
5850: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
5860: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
5870: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5880: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5890: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69  fPos, iOffset, i
58a0: 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64  Continue, 1); Vd
58b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
58c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
58d0: 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20  v, "OFFSET"));. 
58e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
58f0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
5900: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5910: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
5920: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
5930: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
5940: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
5950: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
5960: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
5970: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
5980: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
5990: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
59a0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
59b0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
59c0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
59d0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
59e0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
59f0: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
5a00: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
5a10: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
5a20: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
5a30: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
5a40: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
5a50: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
5a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
5a70: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
5a80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5a90: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5aa0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5ab0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
5ac0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
5ad0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
5ae0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
5af0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
5b00: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
5b10: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
5b20: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
5b30: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
5b40: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
5b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
5b60: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
5b70: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
5b80: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
5b90: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
5ba0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
5bb0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5bc0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
5bd0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5be0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5bf0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
5c00: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
5c10: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
5c20: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5c30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5c40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5c50: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
5c60: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
5c70: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5c80: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
5c90: 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e  Tab, r1, iMem, N
5ca0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5cb0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5cc0: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
5cd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
5ce0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5cf0: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
5d00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
5d10: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
5d20: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
5d30: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
5d40: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
5d50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
5d60: 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  b is negative, t
5d70: 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  hen the p->pELis
5d80: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
5d90: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
5da0: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
5db0: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5dc0: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5dd0: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5de0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5df0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5e00: 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c 69  cTab and p->pELi
5e10: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
5e20: 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 6e  .** to get the n
5e30: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5e40: 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74 69   and the collati
5e50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
5e60: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
5e70: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
5e80: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
5e90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
5eb0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5ec0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5ee0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
5ef0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5f00: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
5f10: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5f20: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5f30: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5f40: 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   if non-negative
5f50: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5f60: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5f70: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5f80: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5f90: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5fa0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5fb0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5fc0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5fd0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5fe0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5ff0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
6000: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
6010: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
6020: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6030: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
6040: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
6050: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
6060: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
6070: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
6080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6090: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
60a0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
60b0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
60c0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
60d0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
60e0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
60f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
6100: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
6110: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
6120: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6130: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6140: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6150: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6160: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6170: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6180: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6190: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
61a0: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
61b0: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
61c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61d0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
61e0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
61f0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
6200: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
6210: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
6220: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6230: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6240: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6250: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6260: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6270: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6280: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6290: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
62a0: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
62b0: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
62c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
62d0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
62e0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
62f0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
6300: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
6310: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
6320: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6330: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6340: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6350: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6360: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6370: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6380: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6390: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
63a0: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
63b0: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
63c0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
63d0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
63e0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
63f0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
6400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6410: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
6420: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6430: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6440: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6450: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
6460: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61  EList!=0 );.  ha
6470: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73  sDistinct = pDis
6480: 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63  tinct ? pDistinc
6490: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57  t->eTnctType : W
64a0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
64b0: 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20  OP;.  if( pSort 
64c0: 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  && pSort->pOrder
64d0: 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20  By==0 ) pSort = 
64e0: 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  0;.  if( pSort==
64f0: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
6500: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
6510: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b   iContinue!=0 );
6520: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
6530: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
6540: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a  Continue);.  }..
6550: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
6560: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
6570: 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43  .  */.  nResultC
6580: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
6590: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
65a0: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
65b0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
65c0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
65d0: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
65e0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
65f0: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6600: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6610: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6620: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6630: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6640: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6660: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
6670: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
6680: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6690: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
66a0: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
66b0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
66c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
66d0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
66e0: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
66f0: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6700: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6710: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6720: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6730: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6740: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6750: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6760: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
6770: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
6780: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
6790: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
67a0: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
67b0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
67c0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
67d0: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
67e0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
67f0: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6800: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6810: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6820: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6830: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6840: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6850: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6860: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
6870: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
6880: 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20  ol;.  regOrig = 
6890: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
68a0: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20  t->iSdst;.  if( 
68b0: 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20  srcTab>=0 ){.   
68c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
68d0: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
68e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
68f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
6900: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72  mn, srcTab, i, r
6910: 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20  egResult+i);.   
6920: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
6930: 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c 69  v, "%s", p->pELi
6940: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29  st->a[i].zName))
6950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
6960: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  if( eDest!=SRT_E
6970: 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20  xists ){.    /* 
6980: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
6990: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
69a0: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
69b0: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
69c0: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
69d0: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
69e0: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
69f0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38  d..    */.    u8
6a00: 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20   ecelFlags;.    
6a10: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
6a20: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
6a30: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
6a40: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6a50: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
6a60: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
6a70: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
6a80: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
6a90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
6aa0: 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61 73  if( pSort && has
6ab0: 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65  Distinct==0 && e
6ac0: 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54  Dest!=SRT_EphemT
6ad0: 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  ab && eDest!=SRT
6ae0: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
6af0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  /* For each expr
6b00: 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c  ession in p->pEL
6b10: 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ist that is a co
6b20: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
6b30: 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ion in.      ** 
6b40: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6b50: 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64  use (pSort->pOrd
6b60: 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20 61  erBy), set the a
6b70: 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20  ssociated .     
6b80: 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20   ** iOrderByCol 
6b90: 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72  value to one mor
6ba0: 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78  e than the index
6bb0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
6bc0: 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65   .      ** expre
6bd0: 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
6be0: 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70   sort-key that p
6bf0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
6c00: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
6c10: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c       ** This all
6c20: 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  ows the p->pELis
6c30: 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d  t field to be om
6c40: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
6c50: 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20  orted record,.  
6c60: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70      ** saving sp
6c70: 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c  ace and CPU cycl
6c80: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63  es.  */.      ec
6c90: 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  elFlags |= (SQLI
6ca0: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c  TE_ECEL_OMITREF|
6cb0: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
6cc0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
6cd0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70  ort->nOBSat; i<p
6ce0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
6cf0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6d00: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
6d10: 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53 6f      if( (j = pSo
6d20: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt->pOrderBy->a[
6d30: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
6d40: 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ol)>0 ){.       
6d50: 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b     p->pEList->a[
6d60: 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  j-1].u.x.iOrderB
6d70: 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74  yCol = i+1-pSort
6d80: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20  ->nOBSat;.      
6d90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6da0: 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20    regOrig = 0;. 
6db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
6dc0: 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65  st==SRT_Set || e
6dd0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20  Dest==SRT_Mem . 
6de0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65            || eDe
6df0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6e00: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
6e10: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a  Output );.    }.
6e20: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
6e30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6e40: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6e50: 70 2d 3e 70 45 4c 69 73 74 2c 72 65 67 52 65 73  p->pEList,regRes
6e60: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
6e90: 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  ecelFlags);.  }.
6ea0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
6eb0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
6ec0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
6ed0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6ee0: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
6ef0: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
6f00: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
6f10: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
6f20: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
6f30: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
6f40: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
6f50: 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63  nct ){.    switc
6f60: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
6f70: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
6f80: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
6f90: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
6fa0: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
6fb0: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
6fc0: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
6fd0: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
6fe0: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
6ff0: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7010: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
7020: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
7030: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
7040: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
7050: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
7060: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
7070: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
7080: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
7090: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
70a0: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
70b0: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
70c0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
70d0: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  sultCol;..      
70e0: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
70f0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7100: 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
7110: 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20  o an OP_Null.   
7120: 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65       ** sets the
7130: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74   MEM_Cleared bit
7140: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65   on the first re
7150: 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20  gister of the.  
7160: 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
7170: 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77  s value.  This w
7180: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50  ill cause the OP
7190: 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77  _Ne below to alw
71a0: 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ays.        ** f
71b0: 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ail on the first
71c0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
71d0: 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74  e loop even if t
71e0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
71f0: 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e   ** row is all N
7200: 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ULLs..        */
7210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7220: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
7230: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
7240: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
7250: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
7260: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73  dbeGetOp(v, pDis
7270: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
7280: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ;.        pOp->o
7290: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
72a0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
72b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
72c0: 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b  p->p2 = regPrev;
72d0: 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ..        iJump 
72e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
72f0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52  rentAddr(v) + nR
7300: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20  esultCol;.      
7310: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
7320: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
7330: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
7340: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
7350: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
7360: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
7370: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
7380: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
7390: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
73a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
73b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
73c0: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
73d0: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
73e0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
73f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7400: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7410: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
7420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7430: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
7440: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
7450: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
7460: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
7470: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
74a0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
74b0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
74c0: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
74d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
74e0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
74f0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
7500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7520: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
7530: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
7540: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
7550: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
7560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7570: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
7580: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
7590: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
75a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
75b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
75c0: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
75d0: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
75e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
75f0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
7600: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7610: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
7620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7630: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
7640: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7650: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
7660: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
7670: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
7680: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
7690: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
76a0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
76b0: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
76c0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
76f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7700: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7710: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
7720: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
7730: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
7740: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
7750: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
7760: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
7770: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
7780: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
7790: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
77a0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
77b0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
77c0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
77d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
77e0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
77f0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
7800: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
7810: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
7820: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7830: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7850: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
7860: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
7870: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
7880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7890: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
78a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
78b0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
78c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
78d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
78e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
78f0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
7900: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7910: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
7920: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
7930: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
7940: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
7950: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
7960: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
7970: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
7980: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
7990: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
79a0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
79b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
79c0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
79d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
79e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
79f0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
7a00: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7a10: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  tCol);.      bre
7a20: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
7a30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7a40: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
7a50: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  */..    /* Store
7a60: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
7a70: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
7a80: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
7a90: 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f     case SRT_Fifo
7aa0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
7ab0: 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  istFifo:.    cas
7ac0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
7ad0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
7ae0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
7af0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7b00: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7b10: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
7b20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7b30: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
7b40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7b50: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
7b60: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
7b70: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7b80: 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  ==SRT_Fifo );.  
7b90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ba0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
7bb0: 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  o );.      sqlit
7bc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
7be0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7bf0: 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78  tCol, r1+nPrefix
7c00: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
7c10: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7c20: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
7c30: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20  RT_DistFifo ){. 
7c40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7c50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
7c60: 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63  DistFifo, then c
7c70: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
7c80: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
7c90: 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72  ** on an ephemer
7ca0: 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  al index. If the
7cb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
7cc0: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a  already present.
7cd0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
7ce0: 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20  e index, do not 
7cf0: 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
7d00: 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20  output. If not, 
7d10: 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  add the.        
7d20: 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74  ** current row t
7d30: 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  o the index and 
7d40: 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69  proceed with wri
7d50: 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20  ting it to the. 
7d60: 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
7d70: 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20   table as well. 
7d80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7d90: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
7da0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
7db0: 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71   + 4;.        sq
7dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7dd0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
7de0: 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72  iParm+1, addr, r
7df0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 0);.        V
7e00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7e20: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
7e30: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7e40: 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73  arm+1, r1,regRes
7e50: 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  ult,nResultCol);
7e60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e70: 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20   pSort==0 );.   
7e80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7e90: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
7ea0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
7eb0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
7ec0: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
7ed0: 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c  ixReg,regResult,
7ee0: 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  1,nPrefixReg);. 
7ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7f00: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
7f10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
7f20: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
7f30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7f40: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7f50: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
7f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7f80: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
7f90: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
7fa0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7fb0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
7fc0: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
7fd0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7fe0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
7ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8000: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8010: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
8020: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
8030: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8040: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
8050: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
8060: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
8070: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
8080: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
8090: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
80a0: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
80b0: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
80c0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
80d0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
80e0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
80f0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
8100: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
8110: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
8120: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8130: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
8140: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
8150: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
8160: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
8170: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
8180: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
8190: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
81a0: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
81b0: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
81c0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
81d0: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
81e0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
81f0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
8200: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
8210: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
8220: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
8230: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
8240: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
8250: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
8260: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
8270: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
8280: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
8290: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
82a0: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
82b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
82c0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
82d0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
82e0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
82f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
8300: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
8310: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
8320: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
8330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8340: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8350: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8360: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
8370: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
8380: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
8390: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
83a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
83b0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
83c0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
83d0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
83e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
83f0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
8400: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8410: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
8420: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8430: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8440: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8450: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
8460: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8470: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
8480: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
8490: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
84a0: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
84b0: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
84c0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
84d0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
84e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
84f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8500: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
8510: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
8520: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
8530: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
8540: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
8550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8560: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
8570: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
8580: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
8590: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
85a0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
85b0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
85c0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
85d0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
85e0: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
85f0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8600: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
8610: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
8620: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8630: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
8640: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8650: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
8660: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
8670: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
8680: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
8690: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
86a0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
86b0: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
86c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
86d0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
86e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
86f0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
8700: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
8710: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8720: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
8730: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
8740: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
8750: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
8760: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
8770: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
8780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8790: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
87a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
87b0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
87c0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
87d0: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
87e0: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
87f0: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
8800: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
8810: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
8820: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
8830: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
8840: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
8850: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
8860: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8870: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
8880: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8890: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
88a0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
88b0: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
88c0: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
88d0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
8900: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8910: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8920: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
8930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8940: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
8950: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
8960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8980: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8990: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
89a0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
89b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
89c0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
89d0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
89e0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
89f0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
8a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a10: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8a20: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
8a30: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
8a40: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
8a50: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
8a60: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
8a70: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
8a80: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
8a90: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
8aa0: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
8ab0: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
8ac0: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
8ad0: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
8ae0: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
8af0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
8b00: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
8b10: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
8b20: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
8b30: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
8b40: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
8b50: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
8b60: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
8b70: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
8b80: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
8b90: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
8ba0: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
8bb0: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
8bc0: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
8bd0: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
8be0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
8bf0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
8c00: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
8c10: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
8c20: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
8c30: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
8c40: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
8c50: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
8c60: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
8c70: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
8c80: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
8c90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8ca0: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
8cb0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
8cc0: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
8cd0: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
8ce0: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
8cf0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8d00: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8d10: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
8d20: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
8d30: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
8d40: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
8d50: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
8d60: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
8d70: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
8d80: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
8d90: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
8da0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
8db0: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
8dc0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
8dd0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
8de0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8df0: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
8e00: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
8e30: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8e40: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
8e50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8e60: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8e70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8e80: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8e90: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8ea0: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
8eb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8ec0: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
8ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ee0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8ef0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
8f00: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
8f10: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8f20: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
8f30: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
8f40: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
8f50: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
8f60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8f70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8f80: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
8fb0: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
8fc0: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
8ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9010: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
9020: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
9030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9040: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
9050: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
9060: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
9070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9080: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
9090: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
90a0: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
90b0: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
90c0: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
90d0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
90e0: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
90f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
9100: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9110: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9120: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
9130: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
9140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9150: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
9160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
9170: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
9180: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
9190: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
91a0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
91b0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
91c0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
91d0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
91e0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
91f0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
9200: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
9210: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
9220: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
9230: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
9240: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
9250: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
9260: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
9270: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
9280: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
9290: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
92a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
92b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
92c0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
92d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
92e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
92f0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
9300: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
9310: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
9320: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
9330: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
9340: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
9350: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
9360: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
9370: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
9380: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
9390: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
93a0: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
93b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
93c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
93d0: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
93e0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
93f0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
9400: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
9410: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
9420: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
9430: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
9440: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
9450: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
9460: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
9470: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
9480: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
9490: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
94a0: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
94b0: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
94c0: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
94d0: 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43  *)+1) - sizeof(C
94e0: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49  ollSeq*);.  KeyI
94f0: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
9500: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9510: 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  , sizeof(KeyInfo
9520: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
9530: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
9540: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
9550: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
9560: 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c  .    p->nKeyFiel
9570: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
9580: 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28  p->nAllField = (
9590: 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70  u16)(N+X);.    p
95a0: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
95b0: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
95c0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
95d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
95e0: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
95f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
9600: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
9610: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
9630: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
9640: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
9650: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
9660: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
9670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
9680: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
9690: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
96a0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
96b0: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
96c0: 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70  bFreeNN(p->db, p
96d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
96e0: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
96f0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
9700: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
9710: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
9720: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
9730: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
9740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
9750: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
9760: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
9770: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
9780: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
9790: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
97a0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
97b0: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
97c0: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
97d0: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
97e0: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
97f0: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
9800: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
9810: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
9820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9830: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
9840: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
9850: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
9860: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
9870: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
9880: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
9890: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
98a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
98b0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
98c0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
98d0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
98e0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
98f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
9900: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
9910: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
9920: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
9930: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
9940: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
9950: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
9960: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
9970: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
9980: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
9990: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
99a0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
99b0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
99c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
99d0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
99e0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
99f0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
9a00: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
9a10: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
9a20: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
9a30: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
9a40: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
9a50: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
9a60: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
9a70: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
9a80: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
9a90: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
9aa0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
9ab0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
9ac0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
9ad0: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
9ae0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
9af0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
9b00: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
9b10: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
9b20: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
9b30: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
9b40: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
9b50: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
9b60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9b70: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
9b80: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9b90: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9ba0: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
9bb0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9bc0: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
9bd0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
9be0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
9bf0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
9c00: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
9c10: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
9c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9c30: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
9c40: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
9c50: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
9c60: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
9c70: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
9c80: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9c90: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
9ca0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9cb0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
9cc0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
9cd0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
9ce0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9cf0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
9d00: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
9d10: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
9d20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9d30: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
9d40: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
9d50: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
9d60: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
9d70: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
9d80: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9d90: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
9da0: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
9db0: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
9dc0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
9dd0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
9de0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
9df0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
9e00: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
9e10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9e20: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
9e30: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
9e40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
9e50: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
9e60: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
9e70: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
9e80: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
9e90: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
9ea0: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
9eb0: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
9ec0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
9ed0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
9ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9ef0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
9f00: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
9f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9f20: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
9f30: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
9f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
9f50: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
9f60: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
9f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
9f80: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
9f90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9fa0: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
9fb0: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
9fc0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
9fd0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
9fe0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
9ff0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
a000: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
a010: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
a020: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
a030: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
a040: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
a050: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
a060: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
a070: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
a080: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
a090: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
a0a0: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
a0b0: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
a0c0: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
a0d0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
a0e0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
a0f0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
a100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a110: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
a120: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
a140: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
a150: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
a160: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
a170: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a180: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
a190: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
a1a0: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
a1b0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
a1c0: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
a1d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a1e0: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
a1f0: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
a200: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
a210: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
a220: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
a230: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
a240: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
a250: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
a260: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
a270: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
a280: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
a290: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
a2a0: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
a2b0: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
a2c0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
a2d0: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
a2e0: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
a2f0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
a300: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
a310: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
a320: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
a330: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
a340: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
a350: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
a360: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
a370: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
a380: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
a390: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
a3a0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
a3b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
a3c0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
a3d0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
a3e0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
a3f0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
a400: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
a410: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
a420: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
a430: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a440: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
a450: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a460: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
a470: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
a480: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
a490: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
a4a0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
a4b0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
a4c0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
a4d0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
a4e0: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
a4f0: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
a500: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
a510: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
a520: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
a530: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
a540: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
a550: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
a560: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
a570: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
a580: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
a590: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
a5a0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
a5b0: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
a5c0: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
a5d0: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
a5e0: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
a5f0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
a600: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
a610: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
a620: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
a630: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
a640: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
a650: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
a660: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
a670: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
a680: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
a690: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
a6a0: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
a6b0: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
a6c0: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
a6d0: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
a6e0: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
a6f0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
a700: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
a710: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
a720: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
a730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
a760: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
a790: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
a7a0: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
a7b0: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7d0: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
a7e0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
a810: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
a820: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
a830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a840: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
a850: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
a860: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
a870: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
a880: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
a890: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
a8a0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
a8b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
a8c0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
a8d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a8e0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
a8f0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
a900: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
a910: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
a920: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
a930: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
a940: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
a950: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
a960: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
a970: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
a980: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
a990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a9a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a9b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a9c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a9d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a9e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
a9f0: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
aa00: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
aa10: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
aa20: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
aa30: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
aa40: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
aa50: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
aa60: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
aa70: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
aa80: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
aa90: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
aaa0: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
aab0: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
aac0: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
aad0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
aae0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
aaf0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
ab00: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
ab10: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
ab20: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
ab30: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
ab40: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
ab50: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
ab60: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
ab70: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
ab80: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
ab90: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
aba0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
abb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
abc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
abd0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
abe0: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
abf0: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
ac00: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
ac10: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
ac20: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
ac30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
ac40: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
ac50: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
ac60: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
ac70: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
ac80: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
ac90: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
aca0: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
acb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
acc0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
acd0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
ace0: 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d  drBreak = pSort-
acf0: 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20  >labelDone;     
ad00: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
ad10: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
ad20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
ad30: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
ad40: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ad50: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
ad60: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
ad70: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
ad80: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
ad90: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
ada0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
adb0: 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  By = pSort->pOrd
adc0: 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73  erBy;.  int eDes
add0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
ade0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
adf0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
ae00: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
ae10: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20  int regRowid;.  
ae20: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20  int iCol;.  int 
ae30: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
ae40: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
ae60: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
ae70: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
ae80: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
ae90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
aea0: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
aeb0: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
aec0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  r */.  int i;.  
aed0: 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20  int bSeq;       
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65  /* True if sorte
af00: 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65  r record include
af10: 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20  s seq. no. */.  
af20: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
af30: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
af40: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20  ->pEList->a;..  
af50: 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65 61  assert( addrBrea
af60: 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53 6f  k<0 );.  if( pSo
af70: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
af80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
af90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
afa0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
afb0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
afc0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
afd0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
afe0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
aff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b000: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
b010: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
b020: 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53  .  }.  iTab = pS
b030: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  ort->iECursor;. 
b040: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b050: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
b060: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
b070: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
b080: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64   ){.    regRowid
b090: 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77   = 0;.    regRow
b0a0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
b0b0: 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d  .    nSortData =
b0c0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
b0d0: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
b0e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b0f0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
b100: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
b110: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
b120: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
b130: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
b140: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20 20 6e  nColumn;.  }.  n
b150: 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Key = pOrderBy->
b160: 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e  nExpr - pSort->n
b170: 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f  OBSat;.  if( pSo
b180: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
b190: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
b1a0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  er ){.    int re
b1b0: 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61  gSortOut = ++pPa
b1c0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
b1d0: 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73 65  SortTab = pParse
b1e0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66  ->nTab++;.    if
b1f0: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
b200: 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Out ){.      add
b210: 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56  rOnce = sqlite3V
b220: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
b230: 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
b240: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
b250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b260: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
b270: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
b280: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
b290: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
b2a0: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
b2b0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
b2c0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
b2d0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
b2e0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
b2f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
b300: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
b310: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
b320: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b330: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b340: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b350: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
b360: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b370: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
b380: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
b390: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
b3a0: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
b3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
b3c0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
b3d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
b3e0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
b3f0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
b400: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
b410: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
b420: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
b430: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
b440: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
b450: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
b460: 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b  (i=0, iCol=nKey+
b470: 62 53 65 71 3b 20 69 3c 6e 53 6f 72 74 44 61 74  bSeq; i<nSortDat
b480: 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  a; i++){.    int
b490: 20 69 52 65 61 64 3b 0a 20 20 20 20 69 66 28 20   iRead;.    if( 
b4a0: 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f  aOutEx[i].u.x.iO
b4b0: 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20  rderByCol ){.   
b4c0: 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45     iRead = aOutE
b4d0: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
b4e0: 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  yCol-1;.    }els
b4f0: 65 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d  e{.      iRead =
b500: 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iCol++;.    }. 
b510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b520: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b530: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65  n, iSortTab, iRe
b540: 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  ad, regRow+i);. 
b550: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b560: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
b570: 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45  i].zName ? aOutE
b580: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
b590: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
b5a0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
b5b0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
b5c0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
b5d0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
b5e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b5f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b600: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
b610: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
b620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b630: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
b640: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
b650: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
b660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
b670: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
b680: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
b690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
b6a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
b6c0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
b6d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
b6e0: 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72  lumn==sqlite3Str
b6f0: 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66  len30(pDest->zAf
b700: 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20 20  fSdst) );.      
b710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b720: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
b730: 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  rd, regRow, nCol
b740: 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20  umn, regRowid,. 
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 41         pDest->zA
b770: 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  ffSdst, nColumn)
b780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b790: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
b7a0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
b7b0: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
b7c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b7d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
b7e0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
b7f0: 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65  rm, regRowid, re
b800: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  gRow, nColumn);.
b810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b820: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
b830: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  Mem: {.      /* 
b840: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
b850: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
b860: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
b870: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
b880: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b890: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b8a0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b8b0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
b8c0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b8d0: 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65  ine ); .      te
b8e0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
b8f0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
b900: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
b910: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
b920: 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  e );.      if( e
b930: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b940: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b950: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b960: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
b970: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
b980: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
b990: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
b9a0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
b9b0: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64  arse, pDest->iSd
b9c0: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
b9d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b9f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
ba00: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
ba10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ba20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ba30: 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64  }.  if( regRowid
ba40: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73   ){.    if( eDes
ba50: 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20  t==SRT_Set ){.  
ba60: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ba70: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
ba80: 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  se, regRow, nCol
ba90: 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  umn);.    }else{
baa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
bab0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
bac0: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
bad0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
bae0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
baf0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
bb00: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f  .  }.  /* The bo
bb10: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
bb20: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
bb30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
bb40: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
bb50: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  ;.  if( pSort->s
bb60: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
bb70: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
bb80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bb90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
bba0: 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  terNext, iTab, a
bbb0: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
bbc0: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
bbd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bbe0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
bbf0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
bc00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
bc10: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d    }.  if( pSort-
bc20: 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c  >regReturn ) sql
bc30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
bc40: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f  , OP_Return, pSo
bc50: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  rt->regReturn);.
bc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
bc70: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
bc80: 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rBreak);.}../*.*
bc90: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
bca0: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
bcb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
bcc0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
bcd0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
bce0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
bcf0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
bd00: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
bd10: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
bd20: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74  **.** Also try t
bd30: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73  o estimate the s
bd40: 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ize of the retur
bd50: 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65  ned value and re
bd60: 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73  turn that.** res
bd70: 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74  ult in *pEstWidt
bd80: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  h..**.** The dec
bd90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
bda0: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
bdb0: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
bdc0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
bdd0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
bde0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
bdf0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
be00: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
be10: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
be20: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
be30: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
be40: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
be50: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
be60: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
be70: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
be80: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
be90: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
bea0: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
beb0: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
bec0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
bed0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
bee0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
bef0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
bf00: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
bf10: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
bf20: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
bf30: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
bf40: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
bf50: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
bf60: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
bf70: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
bf80: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
bf90: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
bfa0: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
bfb0: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
bfc0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
bfd0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
bfe0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
bff0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
c000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c010: 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20  tine has either 
c020: 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72  3 or 6 parameter
c030: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  s depending on w
c040: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
c050: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
c060: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c070: 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TA compile-time 
c080: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
c090: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
c0a0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c0b0: 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65  ETADATA.# define
c0c0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
c0d0: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
c0e0: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
c0f0: 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66  E,F).#else /* if
c100: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c110: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c120: 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65  ETADATA) */.# de
c130: 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28  fine columnType(
c140: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c  A,B,C,D,E,F) col
c150: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
c160: 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  F).#endif.static
c170: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
c180: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
c190: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
c1a0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
c1b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c1c0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c1d0: 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68  ADATA.  const ch
c1e0: 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20  ar **pzOrigDb,. 
c1f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
c200: 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74  OrigTab,.  const
c210: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f   char **pzOrigCo
c220: 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a  l,.#endif.  u8 *
c230: 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63  pEstWidth.){.  c
c240: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
c250: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
c260: 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31   u8 estWidth = 1
c270: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c280: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c290: 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f  TADATA.  char co
c2a0: 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  nst *zOrigDb = 0
c2b0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
c2c0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
c2d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
c2e0: 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  gCol = 0;.#endif
c2f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
c300: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
c310: 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
c320: 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  =0 );.  switch( 
c330: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
c340: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
c350: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
c360: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
c370: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c380: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
c390: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
c3a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
c3b0: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
c3c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
c3d0: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
c3e0: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
c3f0: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
c400: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
c410: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
c420: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
c430: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
c440: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
c450: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
c460: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
c470: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
c480: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
c490: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c4a0: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
c4b0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
c4c0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
c4d0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
c4e0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
c4f0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
c500: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
c510: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
c520: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
c530: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
c540: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
c550: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
c560: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
c570: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
c580: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
c590: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
c5a0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
c5b0: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
c5c0: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
c5d0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
c5e0: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
c5f0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
c600: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
c610: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
c620: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
c630: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
c640: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
c650: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
c660: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
c670: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
c680: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
c690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c6a0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
c6b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
c6c0: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
c6d0: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
c6e0: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
c6f0: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
c700: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
c710: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
c720: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
c730: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
c740: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
c750: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
c760: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
c770: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
c780: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
c790: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
c7a0: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
c7b0: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
c7c0: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
c7d0: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
c7e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
c7f0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
c800: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
c810: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
c820: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
c830: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
c840: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
c850: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
c860: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
c870: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
c880: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
c890: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
c8a0: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
c8b0: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
c8c0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
c8d0: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
c8e0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
c8f0: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
c900: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
c910: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
c920: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
c930: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c940: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
c950: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
c960: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
c970: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
c980: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
c990: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
c9a0: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
c9b0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
c9c0: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
c9d0: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
c9e0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
c9f0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
ca00: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
ca10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
ca20: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
ca30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ca40: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
ca50: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
ca60: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
ca70: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
ca80: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
ca90: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
caa0: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
cab0: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
cac0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
cad0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
cae0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
caf0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
cb00: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
cb10: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
cb20: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
cb30: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
cb40: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
cb50: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
cb60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
cb70: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d  l>=0 && iCol<pS-
cb80: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
cb90: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
cba0: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
cbb0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
cbc0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
cbd0: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
cbe0: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
cbf0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
cc00: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
cc10: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
cc20: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
cc30: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
cc40: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
cc50: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
cc60: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
cc70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
cc80: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
cc90: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
cca0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
ccb0: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
ccc0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
ccd0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
cce0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
ccf0: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
cd00: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
cd10: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
cd20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
cd30: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
cd40: 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c  sNC, p,&zOrigDb,
cd50: 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67  &zOrigTab,&zOrig
cd60: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
cd70: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
cd80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
cd90: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
cda0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
cdb0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
cdc0: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
cdd0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cde0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
cdf0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
ce00: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
ce10: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
ce20: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
ce30: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
ce40: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
ce50: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
ce60: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
ce70: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
ce80: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
ce90: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
cea0: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
ceb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cec0: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
ced0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
cee0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
cef0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
cf00: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
cf10: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
cf20: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
cf30: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
cf40: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
cf50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
cf60: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
cf70: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
cf80: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
cf90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
cfa0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
cfb0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
cfc0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
cfd0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
cfe0: 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20        zOrigDb = 
cff0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
d000: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
d010: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
d020: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
d030: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d040: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
d050: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
d060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d070: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
d080: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
d090: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
d0a0: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
d0b0: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
d0c0: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
d0d0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
d0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d0f0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
d100: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
d110: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
d120: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
d130: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
d140: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
d150: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
d160: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d170: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
d180: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
d190: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
d1a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d1b0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
d1c0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
d1d0: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
d1e0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
d1f0: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
d200: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
d210: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
d220: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
d230: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
d240: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
d250: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
d260: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
d270: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
d280: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
d290: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
d2a0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
d2b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
d2c0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
d2d0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d2e0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
d2f0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
d300: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
d310: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
d320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d330: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
d340: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d350: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
d360: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
d370: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d380: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
d390: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
d3a0: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
d3b0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
d3c0: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
d3d0: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
d3e0: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
d3f0: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
d400: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
d410: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
d420: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
d430: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d440: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
d450: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
d460: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d470: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
d480: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d490: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
d4a0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
d4b0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
d4c0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
d4d0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
d4e0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
d4f0: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
d500: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
d510: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
d520: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d530: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
d540: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
d550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d560: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
d570: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
d580: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
d590: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
d5a0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
d5b0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
d5c0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
d5d0: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  arse;.  sNC.pNex
d5e0: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 0;.  for(i=0
d5f0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d600: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d610: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
d620: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
d630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
d640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d650: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
d660: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
d670: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
d680: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
d690: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
d6a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
d6b0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
d6c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d6d0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d6e0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
d6f0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
d700: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
d710: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
d720: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
d730: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
d740: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
d750: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
d760: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
d770: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
d780: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
d790: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
d7a0: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
d7b0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
d7c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d7d0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d7e0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
d7f0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
d800: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
d810: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d820: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d830: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
d840: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
d850: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
d860: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d870: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
d880: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
d890: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d8a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
d8b0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d8c0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
d8d0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
d8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d8f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d900: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
d910: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
d920: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
d930: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
d940: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
d950: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
d960: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
d970: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
d980: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
d990: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
d9a0: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
d9b0: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
d9c0: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
d9d0: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
d9e0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
d9f0: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
da00: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
da10: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
da20: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
da30: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
da40: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
da50: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
da60: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
da70: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
da80: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
da90: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
daa0: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
dab0: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
dac0: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
dad0: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
dae0: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
daf0: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
db00: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
db10: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
db20: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
db30: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
db40: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
db50: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
db60: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
db70: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
db80: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
db90: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
dba0: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
dbb0: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
dbc0: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
dbd0: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
dbe0: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
dbf0: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
dc00: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
dc10: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
dc20: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
dc30: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
dc40: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
dc50: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
dc60: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
dc70: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
dc80: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
dc90: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
dca0: 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
dcb0: 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
dcc0: 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
dcf0: 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
dd00: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
dd10: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
dd40: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
dd50: 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
dd60: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
dd70: 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
dd80: 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
dd90: 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
dda0: 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
ddb0: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
ddc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
dde0: 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
ddf0: 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
de00: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
de30: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
de40: 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
de50: 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
de80: 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
de90: 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
dea0: 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
deb0: 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
dec0: 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
ded0: 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
dee0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
def0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
df10: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
df20: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
df30: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
df40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
df60: 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
df70: 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
df80: 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
df90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
dfa0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
dfb0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
dfc0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
dfd0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
dfe0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
dff0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
e000: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
e010: 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
e020: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
e030: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
e040: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
e050: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
e060: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
e070: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
e080: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
e090: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e0a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
e0b0: 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
e0c0: 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
e0d0: 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
e0e0: 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
e0f0: 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
e100: 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
e110: 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
e120: 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
e130: 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
e140: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e150: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
e160: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
e170: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
e180: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
e190: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
e1a0: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
e1b0: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
e1c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
e1d0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e  NamesSet || db->
e1e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
e1f0: 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75  eturn;.  /* Colu
e200: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64 65 74  mn names are det
e210: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6c  ermined by the l
e220: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
e230: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
e240: 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  ct */.  while( p
e250: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
e260: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
e270: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 70 54  ct->pPrior;.  pT
e280: 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  abList = pSelect
e290: 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
e2a0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
e2b0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  st;.  assert( v!
e2c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e2d0: 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pTabList!=0 );. 
e2e0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
e2f0: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
e300: 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  Name = (db->flag
e310: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
e320: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
e330: 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c  rcName = (db->fl
e340: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
e350: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 7c  rtColNames)!=0 |
e360: 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73 71  | fullName;.  sq
e370: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
e380: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
e390: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
e3a0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
e3b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
e3c0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
e3d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20  [i].pExpr;..    
e3e0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
e3f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
e400: 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
e410: 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f 63   );  /* Agg proc
e420: 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74 20 72  essing has not r
e430: 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20 61 73  un yet */.    as
e440: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
e450: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54 61  COLUMN || p->pTa
e460: 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72  b!=0 ); /* Cover
e470: 69 6e 67 20 69 64 78 20 6e 6f 74 20 79 65 74 20  ing idx not yet 
e480: 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  coded */.    if(
e490: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
e4a0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
e4b0: 41 6e 20 41 53 20 63 6c 61 75 73 65 20 61 6c 77  An AS clause alw
e4c0: 61 79 73 20 74 61 6b 65 73 20 66 69 72 73 74 20  ays takes first 
e4d0: 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20  priority */.    
e4e0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
e4f0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
e500: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
e510: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
e520: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
e530: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
e540: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
e550: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 72 63 4e    }else if( srcN
e560: 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b  ame && p->op==TK
e570: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
e580: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
e590: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
e5a0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
e5b0: 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a  pTab = p->pTab;.
e5c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e5d0: 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab!=0 );.      i
e5e0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
e5f0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
e600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
e610: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
e620: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
e630: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
e640: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
e650: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
e660: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
e670: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
e680: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
e690: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
e6a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c  }.      if( full
e6b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
e6c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
e6d0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e6e0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e6f0: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
e700: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
e710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e720: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
e730: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
e740: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
e750: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
e760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e770: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e780: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
e790: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
e7a0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
e7b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e7c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
e7d0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69  t char *z = pELi
e7e0: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
e7f0: 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f        z = z==0 ?
e800: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e810: 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  db, "column%d", 
e820: 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62  i+1) : sqlite3Db
e830: 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20  StrDup(db, z);. 
e840: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e850: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e860: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
e870: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e880: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67  );.    }.  }.  g
e890: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
e8a0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
e8b0: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ist, pEList);.}.
e8c0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
e8d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e8e0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
e8f0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
e900: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
e910: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
e920: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
e930: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
e940: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
e950: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
e960: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
e970: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
e980: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
e990: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
e9a0: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
e9b0: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
e9c0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
e9d0: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
e9e0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
e9f0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
ea00: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
ea10: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
ea20: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
ea30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
ea40: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
ea50: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
ea60: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
ea70: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
ea80: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
ea90: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
eaa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
eab0: 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c  M..**.** The onl
eac0: 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  y guarantee that
ead0: 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62   SQLite makes ab
eae0: 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  out column names
eaf0: 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a   is that if the.
eb00: 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e  ** column has an
eb10: 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67   AS clause assig
eb20: 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20  ning it a name, 
eb30: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65  that will be the
eb40: 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54   name used..** T
eb50: 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  hat is the only 
eb60: 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61  documented guara
eb70: 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  ntee.  However, 
eb80: 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63  countless applic
eb90: 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f  ations.** develo
eba0: 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61  ped over the yea
ebb0: 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73  rs have made bas
ebc0: 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e  eless assumption
ebd0: 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
ebe0: 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c  ames.** and will
ebf0: 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20   break if those 
ec00: 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e  assumptions chan
ec10: 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65  ges.  Hence, use
ec20: 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e   extreme caution
ec30: 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69  .** when modifyi
ec40: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
ec50: 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e  to avoid breakin
ec60: 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20  g legacy..**.** 
ec70: 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61  See Also: genera
ec80: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a  teColumnNames().
ec90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
eca0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
ecb0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
ecc0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ecd0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
ece0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
ecf0: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
ed00: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
ed10: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
ed20: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
ed30: 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   i16 *pnCol,    
ed40: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
ed50: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
ed60: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
ed70: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
ed80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
ed90: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
eda0: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
edb0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
edc0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
edd0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
ede0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
edf0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
ee00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ee10: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33  counters */.  u3
ee20: 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  2 cnt;          
ee30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ee40: 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65  ex added to make
ee50: 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65   the name unique
ee60: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
ee70: 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  ol, *pCol;      
ee80: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
ee90: 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c   over result col
eea0: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  umns */.  int nC
eeb0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
eec0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
eed0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
eee0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
eef0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef10: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
ef20: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef40: 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e   Size of name in
ef50: 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61   zName[] */.  Ha
ef60: 73 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20  sh ht;          
ef70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
ef80: 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d  h table of colum
ef90: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71  n names */..  sq
efa0: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68  lite3HashInit(&h
efb0: 74 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  t);.  if( pEList
efc0: 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   ){.    nCol = p
efd0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
efe0: 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    aCol = sqlite3
eff0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f000: 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29   sizeof(aCol[0])
f010: 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74  *nCol);.    test
f020: 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b  case( aCol==0 );
f030: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
f040: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c  ol = 0;.    aCol
f050: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
f060: 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e  rt( nCol==(i16)n
f070: 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20  Col );.  *pnCol 
f080: 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c  = nCol;.  *paCol
f090: 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28   = aCol;..  for(
f0a0: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
f0b0: 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d  i<nCol && !db->m
f0c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b  allocFailed; i++
f0d0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
f0e0: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
f0f0: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
f100: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
f110: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
f120: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
f130: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
f140: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
f150: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
f160: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
f170: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
f180: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
f190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
f1a0: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71  r *pColExpr = sq
f1b0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
f1c0: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
f1d0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
f1e0: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
f1f0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
f200: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
f210: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
f220: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
f230: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
f240: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f250: 20 69 66 28 20 28 70 43 6f 6c 45 78 70 72 2d 3e   if( (pColExpr->
f260: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
f270: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
f280: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 0a 20 20  K_AGG_COLUMN).  
f290: 20 20 20 20 20 26 26 20 70 43 6f 6c 45 78 70 72       && pColExpr
f2a0: 2d 3e 70 54 61 62 21 3d 30 20 0a 20 20 20 20 20  ->pTab!=0 .     
f2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
f2c0: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
f2d0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
f2e0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
f2f0: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
f300: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
f310: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
f320: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
f330: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
f340: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
f350: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
f360: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c      zName = iCol
f370: 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  >=0 ? pTab->aCol
f380: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22  [iCol].zName : "
f390: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
f3a0: 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72  lse if( pColExpr
f3b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
f3c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
f3d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f3e0: 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74  pColExpr, EP_Int
f3f0: 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
f400: 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78    zName = pColEx
f410: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
f420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f430: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
f440: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
f450: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
f460: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
f470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   */.        zNam
f480: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
f490: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a  .zSpan;.      }.
f4a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e      }.    if( zN
f4b0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61  ame ){.      zNa
f4c0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
f4d0: 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  rDup(db, zName);
f4e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f4f0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
f500: 33 4d 50 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c  3MPrintf(db,"col
f510: 75 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20  umn%d",i+1);.   
f520: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
f530: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
f540: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
f550: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
f560: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
f570: 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74  ** append an int
f580: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
f590: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
f5a0: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
f5b0: 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  */.    cnt = 0;.
f5c0: 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
f5d0: 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46   && sqlite3HashF
f5e0: 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21  ind(&ht, zName)!
f5f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d  =0 ){.      nNam
f600: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
f610: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
f620: 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b    if( nName>0 ){
f630: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e  .        for(j=n
f640: 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73  Name-1; j>0 && s
f650: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
f660: 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a  ame[j]); j--){}.
f670: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
f680: 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[j]==':' ) nNam
f690: 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  e = j;.      }. 
f6a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
f6b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
f6c0: 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65  "%.*z:%u", nName
f6d0: 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b  , zName, ++cnt);
f6e0: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33  .      if( cnt>3
f6f0: 20 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f   ) sqlite3_rando
f700: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74  mness(sizeof(cnt
f710: 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a  ), &cnt);.    }.
f720: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
f730: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  = zName;.    sql
f740: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
f750: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20  tiesFromName(0, 
f760: 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  pCol);.    if( z
f770: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
f780: 61 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a  ashInsert(&ht, z
f790: 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f  Name, pCol)==pCo
f7a0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
f7b0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
f7c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
f7d0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74  te3HashClear(&ht
f7e0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
f7f0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f800: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
f810: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
f820: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
f830: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
f840: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
f850: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a  Free(db, aCol);.
f860: 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a      *paCol = 0;.
f870: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a      *pnCol = 0;.
f880: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f890: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
f8a0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
f8b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
f8c0: 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  dd type and coll
f8d0: 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
f8e0: 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69  n to a column li
f8f0: 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  st based on.** a
f900: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f910: 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  t..** .** The co
f920: 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d  lumn list presum
f930: 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73  ably came from s
f940: 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  electColumnNames
f950: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a  FromExprList()..
f960: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
f970: 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65  st has only name
f980: 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20  s, not types or 
f990: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69  collations.  Thi
f9a0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65  s.** routine goe
f9b0: 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64  s through and ad
f9c0: 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64  ds the types and
f9d0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   collations..**.
f9e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f9f0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c  requires that al
fa00: 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  l identifiers in
fa10: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73   the SELECT.** s
fa20: 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f  tatement be reso
fa30: 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lved..*/.void sq
fa40: 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
fa50: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
fa60: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
fa70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
fa80: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
fa90: 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  s */.  Table *pT
faa0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
fab0: 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  Add column type 
fac0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
fad0: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  his table */.  S
fae0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
faf0: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75       /* SELECT u
fb00: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
fb10: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
fb20: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  tions */.){.  sq
fb30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
fb40: 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f  se->db;.  NameCo
fb50: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c  ntext sNC;.  Col
fb60: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c  umn *pCol;.  Col
fb70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
fb80: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b  nt i;.  Expr *p;
fb90: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
fba0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36  st_item *a;.  u6
fbb0: 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20  4 szAll = 0;..  
fbc0: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21  assert( pSelect!
fbd0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fbe0: 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61  (pSelect->selFla
fbf0: 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
fc00: 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
fc10: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53  ( pTab->nCol==pS
fc20: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
fc30: 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
fc40: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
fc50: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
fc60: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  ed ) return;.  m
fc70: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
fc80: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
fc90: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
fca0: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61  elect->pSrc;.  a
fcb0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
fcc0: 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30  st->a;.  for(i=0
fcd0: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
fce0: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
fcf0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
fd00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fd10: 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c  Type;.    int n,
fd20: 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d   m;.    p = a[i]
fd30: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70  .pExpr;.    zTyp
fd40: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
fd50: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
fd60: 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a   &pCol->szEst);.
fd70: 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f      szAll += pCo
fd80: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43  l->szEst;.    pC
fd90: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
fda0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
fdb0: 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  ty(p);.    if( z
fdc0: 54 79 70 65 20 26 26 20 28 6d 20 3d 20 73 71 6c  Type && (m = sql
fdd0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
fde0: 70 65 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  pe))>0 ){.      
fdf0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
fe00: 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  n30(pCol->zName)
fe10: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
fe20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52  ame = sqlite3DbR
fe30: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c  eallocOrFree(db,
fe40: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b   pCol->zName, n+
fe50: 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+2);.      if( 
fe60: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pCol->zName ){. 
fe70: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
fe80: 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c  Col->zName[n+1],
fe90: 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20   zType, m+1);.  
fea0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
feb0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
fec0: 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d  HASTYPE;.      }
fed0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
fee0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
fef0: 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
ff00: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
ff10: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  LOB;.    pColl =
ff20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
ff30: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
ff40: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
ff50: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20   pCol->zColl==0 
ff60: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
ff70: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
ff80: 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
ff90: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
ffa0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61    }.  pTab->szTa
ffb0: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
ffc0: 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d  gEst(szAll*4);.}
ffd0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
ffe0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fff0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
10000 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
10010 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
10020 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
10030 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
10040 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
10050 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
10060 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10070 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
10080 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
10090 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
100a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
100b0 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a  nt savedFlags;..
100c0 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64    savedFlags = d
100d0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e  b->flags;.  db->
100e0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
100f0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
10100 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
10110 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
10120 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  es;.  sqlite3Sel
10130 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
10140 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10150 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
10160 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
10170 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
10180 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
10190 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
101a0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20  ;.  db->flags = 
101b0 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54  savedFlags;.  pT
101c0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
101d0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
101e0 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
101f0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
10200 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10210 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
10220 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
10230 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65  ct() is only use
10240 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65  d n contexts whe
10250 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a  re lookaside.  *
10260 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  * is disabled */
10270 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
10280 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
10290 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  e );.  pTab->nTa
102a0 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  bRef = 1;.  pTab
102b0 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
102c0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
102d0 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
102e0 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
102f0 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
10300 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
10310 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
10320 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
10330 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
10340 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
10350 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
10360 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
10370 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
10380 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
10390 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
103a0 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
103b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
103c0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
103d0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
103e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
103f0 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
10400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
10410 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
10420 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
10430 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
10440 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
10450 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
10460 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
10470 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
10480 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
10490 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
104a0 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
104b0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
104c0 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  f( pParse->pVdbe
104d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
104e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
104f0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
10500 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20  pToplevel==0.   
10510 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
10520 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
10530 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
10540 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20  utConst).  ){.  
10550 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
10560 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d  tFactor = 1;.  }
10570 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10580 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
10590 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  se);.}.../*.** C
105a0 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
105b0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
105c0 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
105d0 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
105e0 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
105f0 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
10600 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
10610 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
10620 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
10630 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
10640 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
10650 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
10660 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
10670 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
10680 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
10690 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
106a0 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
106b0 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
106c0 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
106d0 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
106e0 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
106f0 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
10700 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
10710 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
10720 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
10730 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
10740 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
10750 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
10760 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
10770 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10780 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
10790 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
107a0 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
107b0 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
107c0 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
107d0 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
107e0 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
107f0 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
10800 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
10810 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
10820 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
10830 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20  alues (zero).** 
10840 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
10850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
10860 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74  *.** The iOffset
10870 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74   register (if it
10880 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74   exists) is init
10890 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
108a0 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f  alue.** of the O
108b0 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d  FFSET.  The iLim
108c0 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69  it register is i
108d0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
108e0 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a  MIT.  Register.*
108f0 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69  * iOffset+1 is i
10900 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
10910 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  MIT+OFFSET..**.*
10920 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
10930 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
10940 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
10950 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
10960 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
10970 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
10980 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
10990 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
109a0 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
109b0 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
109c0 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
109d0 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
109e0 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
109f0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
10a00 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
10a10 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
10a20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
10a30 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
10a40 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
10a50 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
10a60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
10a70 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  set;.  int n;.  
10a80 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
10a90 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
10aa0 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
10ab0 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
10ac0 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
10ad0 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
10ae0 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
10af0 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
10b00 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
10b10 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
10b20 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
10b30 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
10b40 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
10b50 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
10b60 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
10b70 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
10b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
10b90 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
10ba0 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
10bb0 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
10bc0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
10bd0 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
10be0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
10bf0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
10c00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73  pParse);.    ass
10c10 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
10c20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
10c30 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
10c40 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
10c50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10c60 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
10c70 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
10c80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10c90 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
10ca0 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
10cb0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
10cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
10cd0 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  o(v, iBreak);.  
10ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
10cf0 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
10d00 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73  Row>sqlite3LogEs
10d10 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20  t((u64)n) ){.   
10d20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
10d30 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
10d40 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20  st((u64)n);.    
10d50 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
10d60 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  |= SF_FixedLimit
10d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10d80 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10d90 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10da0 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
10db0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
10dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10dd0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
10de0 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
10df0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10e00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10e10 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
10e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10e40 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
10e50 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
10e60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
10e70 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73      if( p->pOffs
10e80 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  et ){.      p->i
10e90 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
10ea0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10eb0 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
10ec0 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
10ed0 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
10ee0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
10ef0 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
10f00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10f10 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
10f20 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b  ffset, iOffset);
10f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10f40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
10f50 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65  ustBeInt, iOffse
10f60 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
10f70 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
10f80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
10f90 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
10fa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10fb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
10fc0 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  setLimit, iLimit
10fd0 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f 66  , iOffset+1, iOf
10fe0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  fset);.      Vdb
10ff0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
11000 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
11010 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
11020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11030 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
11040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11050 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
11060 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
11070 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
11080 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
11090 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
110a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
110b0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
110c0 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
110d0 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
110e0 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
110f0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
11100 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
11110 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11120 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
11130 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
11140 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
11150 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
11160 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
11170 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
11180 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
11190 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
111a0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
111b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
111c0 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
111d0 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
111e0 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
111f0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
11200 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
11210 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
11220 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
11230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
11240 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
11250 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
11260 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20  .  /* iCol must 
11270 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e  be less than p->
11280 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20  pEList->nExpr.  
11290 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  Otherwise an err
112a0 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61  or would.  ** ha
112b0 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20 64  ve been thrown d
112c0 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c  uring name resol
112d0 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75  ution and we wou
112e0 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74 74  ld not have gott
112f0 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 72  en.  ** this far
11300 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   */.  if( pRet==
11310 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c  0 && ALWAYS(iCol
11320 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
11330 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  r) ){.    pRet =
11340 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
11350 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
11360 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
11370 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
11380 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
11390 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
113a0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
113b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
113c0 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70  ameter is a comp
113d0 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77  ound SELECT.** w
113e0 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
113f0 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e  clause. This fun
11400 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
11410 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65  and returns a Ke
11420 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  yInfo.** structu
11430 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  re suitable for 
11440 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
11450 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a   ORDER BY..**.**
11460 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
11470 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
11480 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64  ture is obtained
11490 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68   from malloc. Th
114a0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
114b0 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
114c0 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
114d0 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
114e0 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
114f0 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f  lly.** freed..*/
11500 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
11510 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65  *multiSelectOrde
11520 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  rByKeyInfo(Parse
11530 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
11540 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29   *p, int nExtra)
11550 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
11560 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
11570 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  erBy;.  int nOrd
11580 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
11590 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c  By->nExpr;.  sql
115a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
115b0 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f  e->db;.  KeyInfo
115c0 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
115d0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
115e0 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61   nOrderBy+nExtra
115f0 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74  , 1);.  if( pRet
11600 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
11610 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
11620 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
11630 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
11640 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
11650 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  = &pOrderBy->a[i
11660 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ];.      Expr *p
11670 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Term = pItem->pE
11680 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  xpr;.      CollS
11690 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20  eq *pColl;..    
116a0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
116b0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
116c0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
116d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
116e0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54  llSeq(pParse, pT
116f0 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  erm);.      }els
11700 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e{.        pColl
11710 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
11720 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
11730 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
11740 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  erByCol-1);.    
11750 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
11760 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
11770 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
11780 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
11790 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  .pExpr =.       
117a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
117b0 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70  dCollateString(p
117c0 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43  Parse, pTerm, pC
117d0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
117e0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
117f0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
11800 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52 65  oIsWriteable(pRe
11810 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74  t) );.      pRet
11820 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
11830 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e  ll;.      pRet->
11840 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
11850 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
11860 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
11870 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
11880 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  et;.}..#ifndef S
11890 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
118a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
118b0 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45  e generates VDBE
118c0 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65   code to compute
118d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
118e0 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45  a WITH RECURSIVE
118f0 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65  .** query of the
11900 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c   form:.**.**   <
11910 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e  recursive-table>
11920 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72   AS (<setup-quer
11930 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c  y> UNION [ALL] <
11940 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e  recursive-query>
11950 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
11970 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
11980 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
11990 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20       p.**.**.** 
119e0 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79  There is exactly
119f0 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
11a00 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  o the recursive-
11a10 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
11a20 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72  M clause.** of r
11a30 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20  ecursive-query, 
11a40 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20  marked with the 
11a50 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e  SrcList->a[].fg.
11a60 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67  isRecursive flag
11a70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75  ..**.** The setu
11a80 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63  p-query runs onc
11a90 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
11aa0 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20   initial set of 
11ab0 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20  rows that go.** 
11ac0 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62  into a Queue tab
11ad0 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78  le.  Rows are ex
11ae0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
11af0 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65   Queue table one
11b00 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63   by.** one.  Eac
11b10 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20  h row extracted 
11b20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75  from Queue is ou
11b30 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20  tput to pDest.  
11b40 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a  Then the single.
11b50 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77  ** extracted row
11b60 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75   (now in the iCu
11b70 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63  rrent table) bec
11b80 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  omes the content
11b90 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72   of the.** recur
11ba0 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61  sive-table for a
11bb0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
11bc0 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75   run.  The outpu
11bd0 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  t of the recursi
11be0 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61  ve-query.** is a
11bf0 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  dded back into t
11c00 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
11c10 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f   Then another ro
11c20 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  w is extracted f
11c30 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64  rom Queue.** and
11c40 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63   the iteration c
11c50 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74  ontinues until t
11c60 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
11c70 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
11c80 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
11c90 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73  uery operator is
11ca0 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64   UNION then no d
11cb0 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72  uplicate rows ar
11cc0 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74  e ever.** insert
11cd0 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ed into the Queu
11ce0 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44  e table.  The iD
11cf0 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65  istinct table ke
11d00 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c  eps a copy of al
11d10 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68  l rows.** that h
11d20 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e  ave ever been in
11d30 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75  serted into Queu
11d40 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75 70  e and causes dup
11d50 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a  licates to be.**
11d60 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 20   discarded.  If 
11d70 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  the operator is 
11d80 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20  UNION ALL, then 
11d90 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20 61  duplicates are a
11da0 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49  llowed..** .** I
11db0 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20  f the query has 
11dc0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
11dd0 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  n entries in the
11de0 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72 65   Queue table are
11df0 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45   kept in.** ORDE
11e00 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74  R BY order and t
11e10 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
11e20 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72 20  s extracted for 
11e30 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74  each cycle.  Wit
11e40 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52  hout.** an ORDER
11e50 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20 74   BY, the Queue t
11e60 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46  able is just a F
11e70 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  IFO..**.** If a 
11e80 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20  LIMIT clause is 
11e90 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74  provided, then t
11ea0 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f  he iteration sto
11eb0 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72  ps after LIMIT r
11ec0 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ows.** have been
11ed0 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74   output to pDest
11ee0 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65  .  A LIMIT of ze
11ef0 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  ro means to outp
11f00 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61  ut no rows and a
11f10 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d  .** negative LIM
11f20 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  IT means to outp
11f30 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66  ut all rows.  If
11f40 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   there is also a
11f50 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
11f60 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74 69  ** with a positi
11f70 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  ve value, then t
11f80 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
11f90 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73 63  outputs are disc
11fa0 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20  arded rather.** 
11fb0 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20  than being sent 
11fc0 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c  to pDest.  The L
11fd0 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20  IMIT count does 
11fe0 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20  not begin until 
11ff0 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20  after OFFSET.** 
12000 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 73  rows have been s
12010 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
12020 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57  c void generateW
12030 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72  ithRecursiveQuer
12040 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
12050 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
12060 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12070 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
12080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12090 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
120a0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
120b0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
120c0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
120d0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
120e0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
120f0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
12100 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f   p->pSrc;      /
12110 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
12120 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  e of the recursi
12130 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ve query */.  in
12140 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  t nCol = p->pELi
12150 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e  st->nExpr;  /* N
12160 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
12170 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
12180 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62  e table */.  Vdb
12190 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
121a0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
121b0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
121c0 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
121d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ruction */.  Sel
121e0 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d  ect *pSetup = p-
121f0 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68  >pPrior;   /* Th
12200 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f  e setup query */
12210 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
12240 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
12250 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
12260 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e  ;      /* CONTIN
12270 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64  UE and BREAK add
12280 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20  resses */.  int 
12290 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  iCurrent = 0;   
122a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
122b0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
122c0 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72 65  /.  int regCurre
122d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
122e0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
122f0 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61  lding Current ta
12300 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75  ble */.  int iQu
12310 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  eue;            
12320 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75         /* The Qu
12330 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
12340 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30  nt iDistinct = 0
12350 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12360 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65  To ensure unique
12370 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f   results if UNIO
12380 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  N */.  int eDest
12390 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20   = SRT_Fifo;    
123a0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77       /* How to w
123b0 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f  rite to Queue */
123c0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
123d0 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20 20  stQueue;        
123e0 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74   /* SelectDest t
123f0 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51 75  argetting the Qu
12400 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
12410 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12430 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12440 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
12470 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
12480 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
12490 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
124a0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
124b0 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
124c0 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  fset;       /* S
124d0 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f  aved LIMIT and O
124e0 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72  FFSET */.  int r
124f0 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73  egLimit, regOffs
12500 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69  et;      /* Regi
12510 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c 49  sters used by LI
12520 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
12530 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
12540 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
12550 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20 71  do a recursive q
12560 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71  uery */.  if( sq
12570 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
12580 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
12590 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30  CURSIVE, 0, 0, 0
125a0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
125b0 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49  * Process the LI
125c0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
125d0 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79 20  lauses, if they 
125e0 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42  exist */.  addrB
125f0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
12600 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12610 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
12620 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c  = 320;  /* 4 bil
12630 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63  lion rows */.  c
12640 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
12650 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
12660 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c  addrBreak);.  pL
12670 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
12680 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d  ;.  pOffset = p-
12690 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c  >pOffset;.  regL
126a0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
126b0 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
126c0 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
126d0 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66  >pLimit = p->pOf
126e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  fset = 0;.  p->i
126f0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
12700 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
12710 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12720 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
12730 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
12740 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
12750 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
12760 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
12770 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
12780 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
12790 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
127a0 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
127b0 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
127c0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
127d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
127e0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
127f0 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
12800 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
12810 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
12820 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
12830 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
12840 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
12850 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
12860 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
12870 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
12880 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
12890 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
128a0 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
128b0 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
128c0 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
128d0 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
128e0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
128f0 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
12900 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
12910 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
12920 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
12930 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
12940 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
12950 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
12960 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
12970 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
12980 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
12990 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
129a0 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
129b0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
129c0 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
129d0 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
129e0 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
129f0 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
12a00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12a20 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
12a30 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
12a40 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
12a50 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
12a60 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
12a70 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
12a80 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
12a90 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
12aa0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
12ab0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12ac0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
12ad0 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
12ae0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
12b10 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
12b20 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
12b30 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
12b40 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
12b50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b60 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
12b70 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
12b80 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
12b90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
12ba0 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
12bb0 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
12bc0 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
12bd0 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
12be0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12bf0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
12c00 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
12c10 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
12c20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
12c30 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
12c40 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
12c50 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
12c60 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
12c70 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
12c80 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
12c90 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
12ca0 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
12cb0 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
12cc0 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
12cd0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
12ce0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
12cf0 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74  e, pSetup, &dest
12d00 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70  Queue);.  pSetup
12d10 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69  ->pNext = p;.  i
12d20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
12d30 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
12d40 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ery;..  /* Find 
12d50 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
12d60 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75  the Queue and ou
12d70 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f  tput that row */
12d80 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
12d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12da0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75  , OP_Rewind, iQu
12db0 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  eue, addrBreak);
12dc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12dd0 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  ;..  /* Transfer
12de0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
12df0 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43   Queue over to C
12e00 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  urrent */.  sqli
12e10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12e20 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75   OP_NullRow, iCu
12e30 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65  rrent); /* To re
12e40 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  set column cache
12e50 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
12e60 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
12e70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12e80 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65  P_Column, iQueue
12e90 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
12ea0 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29  r+1, regCurrent)
12eb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
12ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12ed0 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20  (v, OP_RowData, 
12ee0 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65  iQueue, regCurre
12ef0 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
12f00 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12f10 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75  OP_Delete, iQueu
12f20 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  e);..  /* Output
12f30 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
12f40 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  in Current */.  
12f50 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
12f60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
12f70 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  v);.  codeOffset
12f80 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61  (v, regOffset, a
12f90 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65  ddrCont);.  sele
12fa0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
12fb0 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c  se, p, iCurrent,
12fc0 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65  .      0, 0, pDe
12fd0 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
12fe0 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
12ff0 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
13000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13010 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
13020 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
13030 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
13040 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13050 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
13060 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13070 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
13080 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
13090 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
130a0 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
130b0 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
130c0 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
130d0 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
130e0 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
130f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
13100 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
13110 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
13120 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
13130 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
13140 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13150 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72   "recursive aggr
13160 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f  egate queries no
13170 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  t supported");. 
13180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70   }else{.    p->p
13190 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73  Prior = 0;.    s
131a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
131b0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
131c0 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ue);.    assert(
131d0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
131e0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
131f0 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20   pSetup;.  }..  
13200 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20  /* Keep running 
13210 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74  the loop until t
13220 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74  he Queue is empt
13230 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
13240 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f  beGoto(v, addrTo
13250 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  p);.  sqlite3Vdb
13260 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
13270 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e   addrBreak);..en
13280 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
13290 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45  uery:.  sqlite3E
132a0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
132b0 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72  arse->db, p->pOr
132c0 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72  derBy);.  p->pOr
132d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
132e0 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
132f0 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66  pLimit;.  p->pOf
13300 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
13310 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
13320 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
13330 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  T_CTE */../* For
13340 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
13350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
13360 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
13370 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13380 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
13390 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
133a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
133b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
133c0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
133d0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
133e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
133f0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
13400 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
13410 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
13420 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  );../*.** Handle
13430 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
13440 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  e of a compound-
13450 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
13460 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a  inates from a.**
13470 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20   VALUES clause. 
13480 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69   By handling thi
13490 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  s as a special c
134a0 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65  ase, we avoid de
134b0 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c  ep.** recursion,
134c0 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74   and thus do not
134d0 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65   need to enforce
134e0 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
134f0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
13500 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53  T.** on a VALUES
13510 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42   clause..**.** B
13520 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63  ecause the Selec
13530 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61  t object origina
13540 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45  tes from a VALUE
13550 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28  S clause:.**   (
13560 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d  1) It has no LIM
13570 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20  IT or OFFSET.** 
13580 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20    (2) All terms 
13590 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a  are UNION ALL.**
135a0 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20     (3) There is 
135b0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
135c0 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
135d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
135e0 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
135f0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
13600 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13610 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
13620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13630 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
13640 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
13650 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
13660 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
13670 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
13680 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
13690 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
136a0 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52 6f  Prior;.  int nRo
136b0 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20  w = 1;.  int rc 
136c0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
136d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
136e0 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20  MultiValue );.  
136f0 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
13700 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13710 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61  _Values );.    a
13720 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
13730 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d  _ALL || (p->op==
13740 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e  TK_SELECT && p->
13750 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20  pPrior==0) );.  
13760 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
13770 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  mit==0 );.    as
13780 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
13790 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
137a0 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c  t( p->pNext==0 |
137b0 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
137c0 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45  pr==p->pNext->pE
137d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
137e0 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72     if( p->pPrior
137f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
13800 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
13810 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a  or->pNext==p );.
13820 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f      p = p->pPrio
13830 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20  r;.    nRow++;. 
13840 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77 68   }while(1);.  wh
13850 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70 50  ile( p ){.    pP
13860 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
13870 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
13880 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
13890 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
138a0 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
138b0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
138c0 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 72  Prior;.    if( r
138d0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  c ) break;.    p
138e0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
138f0 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
13900 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
13910 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13930 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
13940 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
13950 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
13960 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
13970 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
13980 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
13990 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
139a0 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
139b0 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
139c0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
139d0 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
139e0 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
139f0 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
13a00 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
13a10 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
13a20 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
13a30 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
13a40 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
13a50 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
13a60 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
13a70 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
13a80 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
13a90 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
13aa0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
13ab0 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
13ac0 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
13ad0 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
13ae0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
13af0 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
13b00 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
13b10 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
13b20 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
13b30 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
13b40 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
13b50 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
13b60 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
13b70 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
13b80 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
13b90 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
13ba0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
13bb0 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
13bc0 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
13bd0 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
13be0 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
13bf0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
13c00 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
13c10 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
13c20 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
13c30 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
13c40 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
13c50 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
13c60 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
13c70 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
13c80 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
13c90 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
13ca0 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
13cb0 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
13cc0 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
13cd0 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
13ce0 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
13cf0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
13d00 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
13d10 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
13d20 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
13d30 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
13d40 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
13d50 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
13d60 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
13d70 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
13d80 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
13d90 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
13da0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
13db0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
13dc0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
13dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13de0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
13df0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
13e00 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
13e10 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
13e20 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
13e30 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
13e40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
13e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
13e60 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
13e70 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
13e80 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
13e90 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
13ea0 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
13eb0 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
13ec0 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
13ed0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
13ee0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13ef0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
13f00 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
13f10 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
13f20 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
13f30 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
13f40 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
13f50 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
13f60 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
13f70 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
13f80 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
13f90 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
13fa0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
13fb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13fc0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
13fd0 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
13fe0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
13ff0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
14000 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
14010 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
14020 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
14030 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
14040 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
14050 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
14060 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
14070 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
14080 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
14090 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
140a0 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
140b0 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
140c0 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
140d0 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
140e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
140f0 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
14100 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
14110 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
14120 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
14130 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
14140 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
14150 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
14160 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
14170 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
14180 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14190 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
141a0 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
141b0 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
141c0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c  ior->pOrderBy ||
141d0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
141e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
141f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
14200 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  s clause should 
14210 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
14220 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
14230 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
14240 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59  y!=0 ? "ORDER BY
14250 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c  " : "LIMIT", sel
14260 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
14270 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
14280 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14290 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
142a0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
142b0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
142c0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
142d0 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65  /* The VDBE alre
142e0 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63  ady created by c
142f0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
14300 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  */..  /* Create 
14310 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
14320 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
14330 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
14340 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65  /.  if( dest.eDe
14350 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
14360 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14370 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
14380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14390 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
143a0 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44  emeral, dest.iSD
143b0 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
143c0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73  >nExpr);.    des
143d0 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
143e0 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ble;.  }..  /* S
143f0 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
14400 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  for a compound-s
14410 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
14420 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45  nates as a VALUE
14430 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  S clause..  */. 
14440 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
14450 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
14460 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
14470 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70  tiSelectValues(p
14480 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
14490 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
144a0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
144b0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
144c0 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
144d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
144e0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
144f0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
14500 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
14510 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
14520 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14530 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
14540 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74  List );.  assert
14550 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
14560 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr==pPrior->pELi
14570 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69  st->nExpr );..#i
14580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14590 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73  T_CTE.  if( p->s
145a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
145b0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65  ursive ){.    ge
145c0 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
145d0 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c  iveQuery(pParse,
145e0 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65   p, &dest);.  }e
145f0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  lse.#endif..  /*
14600 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
14610 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
14620 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
14630 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
14640 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
14650 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
14660 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
14670 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
14680 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
14690 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
146a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
146b0 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
146c0 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
146d0 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
146e0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
146f0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
14700 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
14710 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
14720 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
14730 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
14740 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
14750 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
14760 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20   p->iLimit;.    
14770 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
14780 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
14790 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
147a0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
147b0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
147c0 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
147d0 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c  fset;.      expl
147e0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
147f0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
14800 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14810 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14820 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
14830 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
14840 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14850 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  0;.      p->pOff
14860 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
14870 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14880 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
14890 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
148a0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
148b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  = 0;.      p->iL
148c0 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
148d0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
148e0 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
148f0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
14900 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
14910 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  {.        addr =
14920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14930 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
14940 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
14950 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14960 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
14970 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
14980 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
14990 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d"));.        if
149a0 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ( p->iOffset ){.
149b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
149c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
149d0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20  P_OffsetLimit,. 
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4c             p->iL
14a00 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74  imit, p->iOffset
14a10 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  +1, p->iOffset);
14a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14a30 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
14a40 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
14a50 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
14a60 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
14a70 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
14a80 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
14a90 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
14aa0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14ab0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
14ac0 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
14ad0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
14ae0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
14af0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
14b00 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
14b10 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
14b20 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
14b30 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28  tRow);.      if(
14b40 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
14b50 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
14b60 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
14b70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
14b80 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
14b90 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
14ba0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
14bb0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
14bc0 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
14bd0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
14be0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14bf0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
14c00 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
14c10 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
14c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14c30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14c40 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
14c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14c60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
14c70 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
14c80 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
14c90 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
14ca0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
14cb0 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
14cc0 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
14cd0 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
14ce0 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
14cf0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
14d00 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
14d10 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
14d20 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
14d30 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
14d40 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
14d50 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
14d60 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
14d70 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
14d80 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
14d90 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
14da0 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
14db0 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
14dc0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
14dd0 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
14de0 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
14df0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
14e00 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
14e10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
14e20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
14e30 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
14e40 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
14e50 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
14e60 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
14e70 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
14e80 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
14e90 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
14ea0 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
14eb0 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
14ec0 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
14ed0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14ee0 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
14ef0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
14f00 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
14f10 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
14f20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14f30 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
14f40 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
14f50 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
14f60 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
14f70 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
14f80 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
14f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
14fa0 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
14fb0 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
14fc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
14fd0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
14fe0 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
14ff0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
15000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15010 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
15020 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
15030 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
15040 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
15050 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
15060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15070 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
15080 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
15090 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
150a0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
150b0 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
150c0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
150d0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
150e0 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
150f0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
15100 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
15110 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
15120 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15130 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
15140 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
15150 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15160 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
15170 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
15180 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
15190 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
151a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
151b0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
151c0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
151d0 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  Tab);.      expl
151e0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
151f0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
15200 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
15210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
15220 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
15230 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
15240 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
15250 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
15260 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15270 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15280 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
15290 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
152a0 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
152b0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
152c0 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
152d0 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
152e0 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
152f0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
15300 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
15310 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
15320 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
15330 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
15340 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
15350 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
15360 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
15370 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
15380 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
15390 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
153a0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
153b0 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
153c0 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78  t = op;.      ex
153d0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
153e0 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
153f0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
15400 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15410 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
15420 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
15430 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
15450 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
15460 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
15470 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
15480 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
15490 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
154a0 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
154b0 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
154c0 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
154d0 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
154e0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
154f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
15500 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
15510 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
15520 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
15530 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
15540 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
15550 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
15560 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
15570 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
15580 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
15590 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
155a0 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
155b0 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
155c0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
155d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
155e0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
155f0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
15600 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
15610 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
15620 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
15630 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
15640 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
15650 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
15660 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
15670 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
15680 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
15690 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
156a0 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
156b0 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
156c0 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
156d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
156e0 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
156f0 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
15700 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
15710 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
15720 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
15730 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
15740 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
15750 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
15760 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
15770 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
15780 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15790 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
157a0 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
157b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
157c0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
157d0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
157e0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
157f0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
15800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15810 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
15820 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20  onTab, iBreak); 
15830 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15840 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
15850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
15860 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
15870 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
15880 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15890 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20  unionTab,.      
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
158c0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
158d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
158e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
158f0 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
15900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15910 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15920 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
15930 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15940 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
15950 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15960 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
15970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15990 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
159a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
159b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
159c0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
159d0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
159e0 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
159f0 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
15a00 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
15a10 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
15a20 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
15a30 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
15a40 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
15a50 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
15a60 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
15a70 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
15a80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
15a90 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
15aa0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
15ab0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
15ac0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
15ad0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15ae0 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
15af0 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
15b00 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
15b10 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
15b20 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
15b30 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
15b40 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
15b50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
15b60 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
15b70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
15b80 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
15b90 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
15ba0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
15bb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
15bc0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
15bd0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
15be0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
15bf0 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
15c00 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
15c10 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
15c20 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
15c30 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
15c40 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
15c50 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
15c60 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
15c70 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
15c80 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
15c90 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
15ca0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
15cb0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
15cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15cd0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
15ce0 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
15cf0 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
15d00 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15d10 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
15d20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15d30 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15d40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15d50 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
15d60 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
15d70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
15d80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
15d90 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
15da0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15db0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
15dc0 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
15dd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
15de0 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
15df0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15e00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15e10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15e20 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
15e30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
15e40 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
15e50 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
15e60 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
15e70 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
15e80 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15e90 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
15ea0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
15eb0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
15ec0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
15ed0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
15ee0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
15ef0 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
15f00 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
15f10 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
15f20 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
15f30 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
15f40 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
15f50 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
15f60 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
15f70 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
15f80 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
15f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15fa0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
15fb0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
15fc0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
15fd0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
15fe0 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
15ff0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
16000 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
16010 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
16020 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
16030 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
16040 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
16050 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
16060 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
16070 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
16080 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
16090 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
160a0 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
160b0 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
160c0 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
160d0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
160e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
160f0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
16100 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
16110 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16120 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
16130 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16140 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
16150 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
16160 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
16170 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
16180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16190 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
161a0 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
161b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
161c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
161d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
161e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
161f0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
16200 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
16210 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72 31  owData, tab1, r1
16220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16230 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
16240 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
16250 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
16260 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16270 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16280 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16290 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
162a0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
162b0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61  op(pParse, p, ta
162c0 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b1,.            
162d0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
162e0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
162f0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
16300 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16310 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
16320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
16340 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
16350 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16360 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16370 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16380 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
16390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
163a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
163b0 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
163c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
163d0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
163e0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
163f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16400 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d   }..  explainCom
16410 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
16420 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
16430 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  b2, p->op!=TK_AL
16440 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  L);..  /* Comput
16450 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
16460 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
16470 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
16480 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
16490 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
164a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
164b0 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
164c0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
164d0 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
164e0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
164f0 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
16500 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
16510 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
16520 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
16530 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
16540 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
16550 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
16560 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
16570 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
16580 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
16590 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
165a0 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
165b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
165c0 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
165d0 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
165e0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
165f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
16600 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
16610 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
16640 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
16650 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
16660 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
16670 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
16680 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
16690 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
166a0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
166b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
166c0 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
166d0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
166e0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
166f0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
16700 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
16710 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
16720 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
16730 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
16760 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
16770 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
16780 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
16790 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
167a0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
167b0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
167c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
167d0 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
167e0 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
167f0 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
16800 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
16810 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
16820 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
16830 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
16840 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
16850 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
16860 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
16870 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
16880 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
16890 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
168a0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
168b0 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
168c0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
168d0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
168e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
168f0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
16900 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
16910 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
16920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
16930 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
16940 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
16950 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
16960 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
16970 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
16980 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
16990 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
169a0 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
169b0 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
169c0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
169d0 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
169e0 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
169f0 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
16a00 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
16a10 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
16a20 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
16a30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
16a40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
16a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16a60 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
16a70 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
16a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16a90 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
16aa0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
16ab0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
16ac0 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16af0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
16b00 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
16b10 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16b20 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
16b30 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
16b40 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
16b50 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
16b60 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
16b70 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
16b80 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
16b90 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
16ba0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
16bb0 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
16bc0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
16bd0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
16be0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
16bf0 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
16c00 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
16c10 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
16c20 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
16c30 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
16c40 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
16c50 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
16c60 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
16c70 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
16c80 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
16c90 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
16ca0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
16cb0 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
16cc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16cd0 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
16ce0 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
16cf0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
16d00 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
16d10 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
16d20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16d30 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
16d40 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
16d50 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
16d60 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
16d70 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
16d80 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
16d90 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
16da0 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
16db0 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
16dc0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
16dd0 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
16de0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
16df0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
16e00 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
16e10 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
16e20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
16e30 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
16e40 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
16e50 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
16e60 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
16e70 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
16e80 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
16e90 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
16ea0 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
16eb0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
16ec0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
16ed0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
16ee0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
16ef0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
16f00 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
16f10 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
16f20 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
16f30 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
16f40 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
16f50 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
16f60 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
16f70 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
16f80 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
16f90 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
16fa0 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
16fb0 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
16fc0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
16fd0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
16fe0 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
16ff0 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
17000 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
17010 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
17020 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
17030 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
17040 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
17050 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
17060 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
17070 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
17080 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
17090 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
170a0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
170b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170d0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
170e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
170f0 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
17100 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
17110 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
17120 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
17130 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
17140 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
17150 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
17160 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
17170 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
17180 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
17190 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
171a0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
171b0 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
171c0 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
171d0 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
171e0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
171f0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
17200 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
17210 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
17220 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
17230 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
17240 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
17250 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
17260 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
17270 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
17280 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
17290 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
172a0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
172b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
172c0 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
172d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
172e0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
172f0 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
17300 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
17310 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
17320 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
17330 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
17340 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
17350 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
17360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17370 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
17380 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
17390 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
173a0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
173b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
173c0 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
173d0 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
173e0 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
17410 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
17420 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
17430 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
17440 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17450 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
17460 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
17470 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
17480 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
17490 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
174a0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
174b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
174c0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
174d0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
174e0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
174f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17500 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17510 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
17520 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
17530 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
17540 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
17550 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
17560 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
17570 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
17580 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
17590 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
175a0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
175b0 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
175c0 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
175d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
175e0 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
175f0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
17600 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
17610 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
17620 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
17630 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
17640 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
17650 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
17660 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17670 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
17680 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
17690 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
176a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
176b0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
176c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
176d0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
176e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
176f0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
17700 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
17710 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
17720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17730 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
17740 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
17750 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
17760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17770 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
17780 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
17790 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
177a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
177b0 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
177c0 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
177d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
177e0 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
177f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17800 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17810 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
17820 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
17830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
17840 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
17850 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
17860 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
17870 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
17880 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
17890 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
178a0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
178b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
178c0 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
178d0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
178e0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
178f0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
17900 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17910 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
17920 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
17930 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
17940 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
17950 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
17960 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17970 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
17980 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
17990 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
179a0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
179b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
179c0 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
179d0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
179e0 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20  Parm, r1,.      
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c       pIn->iSdst,
17a10 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17a20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17a30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17a40 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
17a50 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
17a60 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
17a70 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
17a80 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
17a90 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
17aa0 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
17ab0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
17ac0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
17ad0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
17ae0 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
17af0 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
17b00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17b10 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
17b20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
17b30 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65  dst==1 || pParse
17b40 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73  ->nErr>0 );  tes
17b50 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
17b60 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  t!=1 );.      sq
17b70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
17b80 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17b90 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  Sdst, pDest->iSD
17ba0 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
17bb0 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
17bc0 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
17bd0 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
17be0 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
17bf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
17c00 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
17c10 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
17c20 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  Y */..    /* The
17c30 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
17c40 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
17c50 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  e of registers. 
17c60 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
17c70 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20  t pDest->iSdst. 
17c80 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75   Then the co-rou
17c90 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20  tine yields..   
17ca0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
17cb0 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  _Coroutine: {.  
17cc0 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69      if( pDest->i
17cd0 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sdst==0 ){.     
17ce0 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
17cf0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17d00 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  Range(pParse, pI
17d10 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17d20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
17d30 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20  = pIn->nSdst;.  
17d40 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
17d50 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
17d60 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17d70 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  st, pDest->iSdst
17d80 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17da0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
17db0 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
17dc0 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
17dd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17de0 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
17df0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
17e00 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
17e10 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
17e20 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
17e30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
17e40 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
17e50 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
17e60 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
17e70 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
17e80 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
17e90 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
17ea0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
17eb0 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
17ec0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
17ed0 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
17ee0 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
17ef0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
17f00 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
17f10 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
17f20 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
17f30 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
17f40 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
17f50 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
17f60 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
17f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
17f80 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
17f90 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
17fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17fb0 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
17fc0 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  w, pIn->iSdst, p
17fd0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17ff0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
18000 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
18010 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
18020 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18030 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
18040 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
18050 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
18060 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
18070 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
18080 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
18090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
180a0 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
180b0 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
180c0 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
180d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
180e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
180f0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
18100 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
18110 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18120 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
18130 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18140 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
18150 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
18160 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
18170 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
18180 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
18190 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
181a0 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
181b0 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
181c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
181d0 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
181e0 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
181f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
18200 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
18210 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
18220 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
18230 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
18240 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
18250 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
18260 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
18270 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
18280 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
18290 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
182a0 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
182b0 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
182c0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
182d0 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
182e0 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
182f0 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
18300 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
18310 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
18320 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
18330 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
18340 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
18350 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
18360 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
18370 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
18380 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
18390 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
183a0 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
183b0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
183c0 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
183d0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
183e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
183f0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
18400 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
18410 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
18420 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
18430 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
18440 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
18450 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
18460 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
18470 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
18480 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
18490 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
184a0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
184b0 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
184c0 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
184d0 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
184e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
184f0 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
18500 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
18510 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
18520 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
18530 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
18540 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
18550 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
18560 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
18570 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
18580 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
18590 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
185a0 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
185b0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
185c0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
185d0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
185e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
185f0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
18600 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
18610 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
18620 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
18630 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
18640 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
18650 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
18660 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
18670 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
18680 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
18690 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
186a0 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
186b0 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
186c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
186d0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
186e0 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
186f0 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
18700 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
18710 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
18720 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
18730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
18740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
18750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
18760 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
18770 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
18780 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
18790 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
187a0 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
187b0 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
187c0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
187d0 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
187e0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
187f0 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
18800 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
18810 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
18820 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
18830 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
18840 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
18850 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
18860 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
18870 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
18880 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
18890 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
188a0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
188b0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
188c0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
188d0 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
188e0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
188f0 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
18900 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
18910 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
18920 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
18930 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
18940 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
18950 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
18960 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
18970 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
18980 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
18990 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
189a0 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
189b0 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
189c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
189d0 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
189e0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
189f0 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
18a00 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
18a10 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
18a20 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
18a30 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
18a40 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
18a50 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
18a60 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
18a70 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
18a80 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
18a90 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
18aa0 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
18ab0 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
18ac0 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
18ad0 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
18ae0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
18af0 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
18b00 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
18b10 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
18b20 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
18b30 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
18b40 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
18b50 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
18b60 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
18b70 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
18b80 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
18b90 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
18ba0 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
18bb0 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
18bc0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
18bd0 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
18be0 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
18bf0 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
18c00 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
18c10 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
18c20 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
18c30 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
18c40 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
18c50 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
18c60 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
18c70 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
18c80 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
18c90 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
18ca0 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
18cb0 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
18cc0 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
18cd0 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
18ce0 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
18cf0 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
18d00 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
18d10 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
18d20 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
18d30 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
18d40 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
18d50 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
18d60 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
18d70 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
18d80 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
18d90 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
18da0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
18db0 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
18dc0 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
18dd0 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
18de0 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
18df0 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
18e00 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
18e10 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
18e20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
18e30 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
18e40 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
18e50 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
18e60 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
18e70 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
18e80 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
18e90 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
18ea0 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
18eb0 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
18ec0 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
18ed0 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66   or EofB..*/.#if
18ee0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18ef0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
18f00 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
18f10 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
18f20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18f30 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
18f40 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18f50 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
18f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
18f70 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
18f80 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
18f90 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
18fa0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
18fb0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
18fc0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
18fd0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
18fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
18ff0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53   counters */.  S
19000 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
19010 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
19020 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
19030 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
19040 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
19050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
19060 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
19070 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
19080 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20  ectDest destA;  
19090 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
190a0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
190b0 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  A */.  SelectDes
190c0 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20  t destB;     /* 
190d0 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
190e0 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20  coroutine B */. 
190f0 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20   int regAddrA;  
19100 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
19110 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
19120 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
19130 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  e */.  int regAd
19140 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drB;         /* 
19150 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
19160 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f   for select-B co
19170 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19180 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
19190 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
191a0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
191b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
191c0 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
191d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
191e0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
191f0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19200 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
19210 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
19220 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
19230 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
19240 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
19250 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
19260 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
19270 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
19280 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
19290 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
192a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
192b0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
192c0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
192d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
192e0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
192f0 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
19300 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
19310 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
19320 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
19330 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
19340 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
19350 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
19360 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  int addrEofA_noB
19370 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61  ;     /* Alterna
19380 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42  te addrEofA if B
19390 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   is uninitialize
193a0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  d */.  int addrE
193b0 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
193c0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
193d0 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
193e0 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
193f0 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
19400 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
19410 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
19420 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
19430 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
19440 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19450 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
19460 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19470 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
19480 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19490 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
194a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
194b0 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
194c0 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
194d0 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
194e0 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
194f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
19500 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
19510 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
19520 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
19530 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
19540 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
19550 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19560 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
19570 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
19580 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
19590 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
195a0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
195b0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
195c0 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
195d0 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
195e0 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
195f0 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
19600 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
19610 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
19620 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
19630 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
19640 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19650 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
19660 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  tmt */.  int add
19670 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  r1;            /
19680 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
19690 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
196a0 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
196b0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
196c0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
196d0 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
196e0 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
196f0 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
19700 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20  Info *pKeyDup = 
19710 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  0; /* Comparison
19720 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
19730 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
19740 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
19750 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
19760 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
19770 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
19780 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
19790 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
197a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
197b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
197c0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
197d0 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
197e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
197f0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
19800 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19810 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
19820 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19830 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
19840 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
19850 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
19860 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
19870 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
19880 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
19890 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
198a0 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20  .  int iSub1;   
198b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
198c0 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  id of left-hand 
198d0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
198e0 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20  Sub2;           
198f0 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69   /* EQP id of ri
19900 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  ght-hand query *
19910 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
19920 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  rt( p->pOrderBy!
19930 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19940 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a  pKeyDup==0 ); /*
19950 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20   "Managed" code 
19960 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63  needs this.  Tic
19970 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20  ket #3382. */.  
19980 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
19990 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
199a0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
199b0 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
199c0 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20   Already thrown 
199d0 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42  the error if VDB
199e0 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a  E alloc failed *
199f0 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  /.  labelEnd = s
19a00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19a10 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
19a20 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
19a30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
19a40 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
19a50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19a60 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
19a70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
19a80 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
19a90 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
19aa0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
19ab0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
19ac0 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
19ad0 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
19ae0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
19af0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
19b00 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
19b10 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
19b20 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
19b30 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
19b40 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
19b50 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
19b60 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
19b70 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
19b80 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
19b90 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19ba0 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
19bb0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
19bc0 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
19bd0 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
19be0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
19bf0 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
19c00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
19c10 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
19c20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19c30 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
19c40 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
19c50 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
19c60 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19c70 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
19c80 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19c90 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
19ca0 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
19cb0 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
19cc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19cd0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
19ce0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
19cf0 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
19d00 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
19d10 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
19d20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
19d30 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19d40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
19d50 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
19d60 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
19d70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19d80 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
19d90 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
19da0 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
19db0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
19dc0 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
19dd0 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
19de0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
19df0 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
19e00 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
19e10 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
19e20 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
19e30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
19e40 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
19e50 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
19e60 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
19e70 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
19e80 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
19e90 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
19ea0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
19eb0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
19ec0 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
19ed0 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
19ee0 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
19ef0 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
19f00 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
19f10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
19f20 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
19f30 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
19f40 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
19f50 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
19f60 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
19f70 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
19f80 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
19f90 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
19fa0 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
19fb0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
19fc0 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65  zeof(int)*(nOrde
19fd0 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28  rBy + 1));.  if(
19fe0 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
19ff0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a000 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1a010 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20    aPermute[0] = 
1a020 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f  nOrderBy;.    fo
1a030 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=1, pItem=pOr
1a040 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72  derBy->a; i<=nOr
1a050 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
1a060 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
1a070 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1a080 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1a090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a0a0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1a0b0 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
1a0c0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1a0d0 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
1a0e0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1a0f0 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
1a100 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1a110 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1a120 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
1a130 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
1a140 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
1a150 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
1a160 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
1a170 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
1a180 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1a190 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1a1a0 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
1a1b0 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
1a1c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1a1d0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
1a1e0 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
1a1f0 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
1a200 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
1a210 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1a220 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
1a230 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
1a240 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
1a250 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
1a260 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
1a270 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
1a280 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1a290 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
1a2a0 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
1a2b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1a2c0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1a2d0 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
1a2e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
1a2f0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
1a300 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1a310 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
1a320 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1a330 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
1a340 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
1a350 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
1a360 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
1a370 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
1a380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a390 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
1a3a0 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
1a3b0 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
1a3c0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
1a3d0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
1a3e0 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
1a3f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
1a400 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
1a410 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
1a420 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1a430 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a440 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
1a450 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
1a460 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
1a470 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
1a480 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
1a490 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
1a4a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a4b0 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
1a4c0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
1a4d0 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
1a4e0 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
1a4f0 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
1a500 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
1a510 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
1a520 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1a530 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
1a540 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
1a550 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
1a560 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
1a570 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
1a580 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1a590 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
1a5a0 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
1a5b0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1a5c0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1a5d0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
1a5e0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
1a5f0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
1a600 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
1a610 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
1a620 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
1a630 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
1a640 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
1a650 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
1a660 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
1a670 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1a680 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a690 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
1a6a0 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
1a6b0 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
1a6f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a700 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
1a710 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
1a720 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
1a730 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
1a740 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
1a750 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
1a760 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
1a770 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
1a780 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
1a790 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1a7a0 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
1a7b0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
1a7c0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
1a7d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1a7e0 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
1a7f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
1a800 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
1a810 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
1a820 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a830 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1a840 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
1a850 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
1a860 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1a870 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
1a880 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
1a890 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1a8a0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
1a8b0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1a8c0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1a8d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1a8e0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
1a8f0 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
1a900 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
1a910 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
1a920 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
1a930 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1a940 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
1a950 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
1a960 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1a970 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
1a980 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61  , regAddrA, 0, a
1a990 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56  ddrSelectA);.  V
1a9a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a9b0 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
1a9c0 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
1a9d0 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
1a9e0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
1a9f0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
1aa00 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
1aa10 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1aa20 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
1aa30 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
1aa40 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1aa50 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41 29  ine(v, regAddrA)
1aa60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
1aa70 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
1aa80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1aa90 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1aaa0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1aab0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
1aac0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
1aad0 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
1aae0 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
1aaf0 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
1ab00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1ab10 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1ab20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab30 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1ab40 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1ab50 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42  , 0, addrSelectB
1ab60 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1ab70 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45  ((v, "right SELE
1ab80 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
1ab90 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
1aba0 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
1abb0 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
1abc0 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
1abd0 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
1abe0 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c  et = 0;  .  expl
1abf0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
1ac00 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
1ac10 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
1ac20 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1ac30 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
1ac40 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
1ac50 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
1ac60 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
1ac70 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
1ac80 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1ac90 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  (v, regAddrB);..
1aca0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1acb0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1acc0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1acd0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
1ace0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1acf0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1ad00 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1ad10 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1ad20 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1ad30 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1ad40 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
1ad50 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
1ad60 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1ad70 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad90 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
1ada0 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1adc0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1add0 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a  belEnd);.  .  /*
1ade0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1adf0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1ae00 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1ae10 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a  row of the B.  *
1ae20 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1ae30 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1ae40 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1ae50 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  select..  */.  i
1ae60 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1ae70 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1ae80 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1ae90 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1aea0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29   routine for B")
1aeb0 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20  );.    addrOutB 
1aec0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1aed0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1aee0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1aef0 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70      p, &destB, p
1af00 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20  Dest, regOutB,. 
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1af30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
1af40 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  .  sqlite3KeyInf
1af50 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b  oUnref(pKeyDup);
1af60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1af70 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1af80 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1af90 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1afa0 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
1afb0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1afc0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
1afd0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1afe0 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
1aff0 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
1b000 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1b010 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72  rEofA_noB = addr
1b020 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b  EofA = labelEnd;
1b030 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
1b040 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1b050 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
1b060 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1b070 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
1b080 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b090 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1b0a0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
1b0b0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73  addrEofA_noB = s
1b0c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b0d0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1b0e0 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64  gAddrB, labelEnd
1b0f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b110 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1b120 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1b130 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b140 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
1b150 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
1b160 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1b170 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
1b180 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1b190 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  w);.  }..  /* Ge
1b1a0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1b1b0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1b1c0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1b1d0 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
1b1e0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1b1f0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1b200 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
1b210 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1b220 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1b230 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
1b240 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
1b250 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
1b260 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1b270 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
1b280 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
1b290 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
1b2a0 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
1b2b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
1b2c0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1b2d0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
1b2e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b2f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1b300 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1b310 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1b320 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b330 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1b340 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
1b350 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b360 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1b370 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  (v, addrEofB);. 
1b380 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1b390 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1b3a0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1b3b0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1b3c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1b3d0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1b3e0 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1b3f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b400 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1b410 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1b420 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b430 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b440 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1b450 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1b460 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1b470 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1b480 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1b490 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b4a0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1b4b0 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
1b4c0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1b4d0 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1b4e0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
1b4f0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
1b500 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1b510 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1b520 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
1b530 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
1b540 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1b550 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
1b560 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1b570 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
1b580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b590 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b5a0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1b5b0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1b5c0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1b5d0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1b5e0 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
1b5f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b600 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1b610 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
1b620 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1b630 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
1b640 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1b650 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
1b660 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1b670 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
1b680 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1b690 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
1b6a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b6b0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1b6c0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1b6d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1b6e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b6f0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1b700 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1b710 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1b720 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1b730 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1b740 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
1b750 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
1b760 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
1b770 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1b780 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1b790 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
1b7a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b7b0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b7c0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
1b7d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b7e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b7f0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b800 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1b810 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1b820 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
1b830 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
1b840 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
1b850 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b860 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1b870 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
1b880 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b890 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
1b8a0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
1b8b0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
1b8c0 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
1b8d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b8e0 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
1b8f0 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
1b900 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1b930 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
1b940 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
1b950 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1b960 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
1b970 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b980 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
1b990 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
1b9a0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
1b9b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b9c0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1b9d0 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1b9e0 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1b9f0 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1ba00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1ba10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1ba20 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1ba30 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1ba40 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1ba50 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1ba60 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1ba70 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1ba80 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1ba90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1baa0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1bab0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1bac0 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1bad0 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1bae0 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1baf0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1bb00 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1bb10 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1bb20 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1bb30 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1bb40 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1bb50 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
1bb60 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
1bb70 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
1bb80 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
1bb90 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
1bba0 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  Err!=0;.}.#endif
1bbb0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1bbc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1bbd0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1bbe0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1bbf0 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  W)../* An instan
1bc00 63 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43  ce of the SubstC
1bc10 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65  ontext object de
1bc20 73 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74  scribes an subst
1bc30 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20  itution edit.** 
1bc40 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
1bc50 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e  on a parse tree.
1bc60 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72  .**.** All refer
1bc70 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
1bc80 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65   in table iTable
1bc90 20 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61   are to be repla
1bca0 63 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e  ced by correspon
1bcb0 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ding.** expressi
1bcc0 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a  ons in pEList..*
1bcd0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1bce0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a   SubstContext {.
1bcf0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bd10 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1bd20 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
1bd30 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
1bd40 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66    /* Replace ref
1bd50 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
1bd60 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1bd70 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20  NewTable;       
1bd80 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c       /* New tabl
1bd90 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
1bda0 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20  t isLeftJoin;   
1bdb0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54          /* Add T
1bdc0 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70  K_IF_NULL_ROW op
1bdd0 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65  codes on each re
1bde0 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45  placement */.  E
1bdf0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1be00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c           /* Repl
1be10 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69  acement expressi
1be20 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f  ons */.} SubstCo
1be30 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61  ntext;../* Forwa
1be40 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
1be50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1be60 75 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62  ubstExprList(Sub
1be70 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72  stContext*, Expr
1be80 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1be90 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1bea0 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53  SubstContext*, S
1beb0 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  elect*, int);../
1bec0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1bed0 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1bee0 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1bef0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1bf00 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1bf10 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1bf20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1bf30 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1bf40 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1bf50 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1bf60 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1bf70 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1bf80 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1bf90 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1bfa0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1bfb0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1bfc0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1bfd0 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1bfe0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1bff0 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1c000 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1c010 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1c020 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1c030 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1c040 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1c050 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1c060 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1c070 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1c080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1c090 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
1c0a0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1c0b0 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1c0c0 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1c0d0 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1c0e0 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1c0f0 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1c100 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1c110 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1c120 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1c130 75 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73  ubstExpr(.  Subs
1c140 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1c150 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  ,  /* Descriptio
1c160 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1c170 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ution */.  Expr 
1c180 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
1c190 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
1c1a0 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
1c1b0 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1c1c0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1c1d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78  turn 0;.  if( Ex
1c1e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c1f0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1c200 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  ).   && pExpr->i
1c210 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
1c220 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20  pSubst->iTable. 
1c230 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   ){.    pExpr->i
1c240 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c250 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1c260 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  le;.  }.  if( pE
1c270 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1c280 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1c290 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1c2a0 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1c2b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1c2c0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1c2d0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1c2e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1c2f0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1c300 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70   Expr *pCopy = p
1c310 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  Subst->pEList->a
1c320 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1c330 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
1c340 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20  pr ifNullRow;.  
1c350 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1c360 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26  st->pEList!=0 &&
1c370 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1c380 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e  pSubst->pEList->
1c390 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
1c3a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1c3b0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
1c3c0 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
1c3d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c3e0 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70  xprIsVector(pCop
1c3f0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  y) ){.        sq
1c400 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
1c410 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72  Msg(pSubst->pPar
1c420 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20  se, pCopy);.    
1c430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c440 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c450 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Subst->pParse->d
1c460 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
1c470 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69  Subst->isLeftJoi
1c480 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d  n && pCopy->op!=
1c490 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
1c4a0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69         memset(&i
1c4b0 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a  fNullRow, 0, siz
1c4c0 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b  eof(ifNullRow));
1c4d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1c4e0 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f  lRow.op = TK_IF_
1c4f0 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20  NULL_ROW;.      
1c500 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c      ifNullRow.pL
1c510 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20  eft = pCopy;.   
1c520 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1c530 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  .iTable = pSubst
1c540 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->iNewTable;.   
1c550 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26         pCopy = &
1c560 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20  ifNullRow;.     
1c570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
1c580 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
1c590 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29  up(db, pCopy, 0)
1c5a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1c5b0 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73  ew && pSubst->is
1c5c0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
1c5d0 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
1c5e0 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43  perty(pNew, EP_C
1c5f0 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  anBeNull);.     
1c600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c610 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61 73   pNew && ExprHas
1c620 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
1c630 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
1c640 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
1c650 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c660 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
1c670 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  inTable;.       
1c680 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1c690 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d  ty(pNew, EP_From
1c6a0 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  Join);.        }
1c6b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c6c0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1c6d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
1c6e0 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
1c6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1c700 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70  se{.    if( pExp
1c710 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c  r->op==TK_IF_NUL
1c720 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e  L_ROW && pExpr->
1c730 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e  iTable==pSubst->
1c740 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
1c750 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
1c760 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1c770 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78  e;.    }.    pEx
1c780 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
1c790 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1c7a0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1c7b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
1c7c0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1c7d0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1c7e0 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
1c7f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c800 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1c810 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1c820 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45 78  lect(pSubst, pEx
1c830 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31  pr->x.pSelect, 1
1c840 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c850 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1c860 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  t(pSubst, pExpr-
1c870 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
1c880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
1c890 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
1c8a0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1c8b0 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1c8c0 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1c8d0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1c8e0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1c8f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1c900 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t       /* List 
1c910 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
1c920 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1c930 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20  stitutes */.){. 
1c940 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1c950 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1c960 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1c970 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1c980 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1c990 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1c9a0 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73  xpr(pSubst, pLis
1c9b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
1c9c0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1c9d0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
1c9e0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1c9f0 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69  Subst, /* Descri
1ca00 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1ca10 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53  stitution */.  S
1ca20 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1ca30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
1ca40 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
1ca50 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1ca60 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
1ca70 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20   doPrior        
1ca80 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74     /* Do substit
1ca90 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f  utes on p->pPrio
1caa0 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72  r too */.){.  Sr
1cab0 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
1cac0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1cad0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1cae0 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
1caf0 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20  eturn;.  do{.   
1cb00 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1cb10 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74  Subst, p->pEList
1cb20 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
1cb30 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e  List(pSubst, p->
1cb40 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
1cb50 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1cb60 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  bst, p->pOrderBy
1cb70 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1cb80 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  g = substExpr(pS
1cb90 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67  ubst, p->pHaving
1cba0 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  );.    p->pWhere
1cbb0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1cbc0 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  bst, p->pWhere);
1cbd0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  .    pSrc = p->p
1cbe0 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Src;.    assert(
1cbf0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20   pSrc!=0 );.    
1cc00 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1cc10 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1cc20 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1cc30 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1cc40 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1cc50 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31  Item->pSelect, 1
1cc60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1cc70 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1cc80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73   ){.        subs
1cc90 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1cca0 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1ccb0 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  cArg);.      }. 
1ccc0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64     }.  }while( d
1ccd0 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70  oPrior && (p = p
1cce0 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a  ->pPrior)!=0 );.
1ccf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1cd00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1cd10 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1cd20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1cd30 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1cd40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1cd50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1cd60 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1cd70 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1cd80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1cd90 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1cda0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1cdb0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1cdc0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1cdd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1cde0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1cdf0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1ce00 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1ce10 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1ce20 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1ce30 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1ce40 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1ce50 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1ce60 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1ce70 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1ce80 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1ce90 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1cea0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1ceb0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1cec0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1ced0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1cee0 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1cef0 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1cf00 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1cf10 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1cf20 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1cf30 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1cf40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cf50 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1cf60 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1cf70 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1cf80 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1cf90 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1cfa0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1cfb0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1cfc0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1cfd0 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1cfe0 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1cff0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1d000 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1d010 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d020 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1d030 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1d040 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1d050 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1d060 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1d070 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1d080 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1d090 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1d0a0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1d0b0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1d0c0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1d0d0 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1d0e0 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1d0f0 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1d100 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1d110 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1d120 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1d130 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1d140 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1d150 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1d160 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1d170 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1d180 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1d190 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20  ning is subject 
1d1a0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
1d1b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a   constraints:.**
1d1c0 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1d1d0 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1d1e0 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1d1f0 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1d200 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
1d210 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1d220 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d230 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
1d240 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1d250 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1d260 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1d270 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1d280 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1d290 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32  as:.**        (2
1d2a0 29 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  ) If the subquer
1d2b0 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  y is an aggregat
1d2c0 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  e then.**       
1d2d0 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20   (2a) the outer 
1d2e0 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62  query must not b
1d2f0 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20  e a join and.** 
1d300 20 20 20 20 20 20 20 28 32 62 29 20 74 68 65 20         (2b) the 
1d310 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73 74  outer query must
1d320 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72   not use subquer
1d330 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ies.**          
1d340 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68     other than th
1d350 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73  e one FROM-claus
1d360 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  e subquery that 
1d370 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a  is a candidate.*
1d380 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  *             fo
1d390 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28  r flattening.  (
1d3a0 54 68 69 73 20 69 73 20 64 75 65 20 74 6f 20 74  This is due to t
1d3b0 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33  icket [2f7170d73
1d3c0 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20  bf9abf80].**    
1d3d0 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30           from 20
1d3e0 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a  15-02-09.).**.**
1d3f0 20 20 20 28 33 29 20 20 49 66 20 74 68 65 20 73     (3)  If the s
1d400 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1d410 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1d420 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e  a LEFT JOIN then
1d430 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61 29 20  .**        (3a) 
1d440 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1d450 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61   not be a join a
1d460 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62  nd.**        (3b
1d470 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  ) the FROM claus
1d480 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1d490 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69  y may not contai
1d4a0 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20  n a virtual.**  
1d4b0 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
1d4c0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1d4d0 33 63 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  3c) the outer qu
1d4e0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
1d4f0 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a  n aggregate..**.
1d500 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
1d510 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62  bquery can not b
1d520 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  e DISTINCT..**.*
1d530 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
1d540 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
1d550 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
1d560 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
1d570 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
1d580 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
1d590 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
1d5a0 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
1d5b0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
1d5c0 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
1d5d0 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
1d5e0 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
1d5f0 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
1d600 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
1d610 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1d620 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74   We no longer at
1d630 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e  tempt to flatten
1d640 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
1d650 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20  eries.  Was:.** 
1d660 20 20 20 20 20 20 20 49 66 20 74 68 65 20 73 75         If the su
1d670 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67  bquery is aggreg
1d680 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71  ate, the outer q
1d690 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1d6a0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1d6b0 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
1d6c0 65 72 79 20 6d 75 73 74 20 68 61 76 65 20 61 20  ery must have a 
1d6d0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f  FROM clause.  TO
1d6e0 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72  DO:  For subquer
1d6f0 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20  ies without.**  
1d700 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61        A FROM cla
1d710 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64  use, consider ad
1d720 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75  ding a FROM clau
1d730 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63  se with the spec
1d740 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  ial.**        ta
1d750 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20  ble sqlite_once 
1d760 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
1d770 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f   a single row co
1d780 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20  ntaining a.**   
1d790 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c       single NULL
1d7a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49  ..**.**   (8)  I
1d7b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1d7c0 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74  ses LIMIT then t
1d7d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1d7e0 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1d7f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49  ..**.**   (9)  I
1d800 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1d810 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74  ses LIMIT then t
1d820 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1d830 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67  ay not be aggreg
1d840 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ate..**.**  (**)
1d850 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1d860 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1d870 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1d880 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1d890 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1d8a0 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1d8b0 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1d8c0 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1d8d0 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1d8e0 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61  *        constra
1d8f0 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73 75 62  int: "If the sub
1d900 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61  query is aggrega
1d910 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  te then the oute
1d920 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20  r query .**     
1d930 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c     may not use L
1d940 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31  IMIT.".**.**  (1
1d950 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1d960 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1d970 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74  uery may not bot
1d980 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1d990 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1d9a0 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1d9b0 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1d9c0 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1d9d0 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1d9e0 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1d9f0 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1da00 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1da10 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1da20 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1da30 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1da40 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1da50 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1da60 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1da70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1da80 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  ay not use OFFSE
1da90 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1daa0 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
1dab0 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  ry is part of a 
1dac0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1dad0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20   then the.**    
1dae0 20 20 20 20 73 75 62 71 75 65 72 79 20 6d 61 79      subquery may
1daf0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a   not use LIMIT..
1db00 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
1db10 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20  icket #2339 and 
1db20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64  ticket [02a8e81d
1db30 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36  44])..**.**  (16
1db40 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  )  If the outer 
1db50 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61  query is aggrega
1db60 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  te, then the sub
1db70 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
1db80 20 20 20 20 20 20 20 20 75 73 65 20 4f 52 44 45          use ORDE
1db90 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
1dba0 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
1dbb0 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
1dbc0 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
1dbd0 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
1dbe0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
1dbf0 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
1dc00 2a 20 20 28 31 37 29 20 20 49 66 20 74 68 65 20  *  (17)  If the 
1dc10 73 75 62 71 75 65 72 79 20 69 73 20 61 20 63 6f  subquery is a co
1dc20 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1dc30 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31  hen.**        (1
1dc40 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64  7a) all compound
1dc50 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20   operators must 
1dc60 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  be a UNION ALL, 
1dc70 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31  and.**        (1
1dc80 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74  7b) no terms wit
1dc90 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hin the subquery
1dca0 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65   compound may be
1dcb0 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20   aggregate.**   
1dcc0 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 44 49             or DI
1dcd0 53 54 49 4e 54 2c 20 61 6e 64 0a 2a 2a 20 20 20  STINT, and.**   
1dce0 20 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79       (17c) every
1dcf0 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65   term within the
1dd00 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75   subquery compou
1dd10 6e 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46  nd must have a F
1dd20 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ROM clause.**   
1dd30 20 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f       (17d) the o
1dd40 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1dd50 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  ot be.**        
1dd60 20 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67        (17d1) agg
1dd70 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20  regate, or.**   
1dd80 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32             (17d2
1dd90 29 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a  ) DISTINCT, or.*
1dda0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  *              (
1ddb0 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  17d3) a join..**
1ddc0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70  .**        The p
1ddd0 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75  arent and sub-qu
1dde0 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ery may contain 
1ddf0 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53  WHERE clauses. S
1de00 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20  ubject to.**    
1de10 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20      rules (11), 
1de20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74  (13) and (14), t
1de30 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  hey may also con
1de40 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a  tain ORDER BY,.*
1de50 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61  *        LIMIT a
1de60 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
1de70 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79  s.  The subquery
1de80 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20   cannot use any 
1de90 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1dea0 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65     operator othe
1deb0 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
1dec0 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65   because all the
1ded0 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a   other compound.
1dee0 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1def0 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c  ors have an impl
1df00 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69  ied DISTINCT whi
1df10 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  ch is disallowed
1df20 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65   by.**        re
1df30 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a  striction (4)..*
1df40 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f  *.**        Also
1df50 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74  , each component
1df60 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1df70 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68  y must return th
1df80 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
1df90 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c          of resul
1dfa0 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20  t columns. This 
1dfb0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65  is actually a re
1dfc0 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e  quirement for an
1dfd0 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1dfe0 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74       SELECT stat
1dff0 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74  ement, but all t
1e000 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65  he code here doe
1e010 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74  s is make sure t
1e020 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20  hat no.**       
1e030 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20   such (illegal) 
1e040 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61  sub-query is fla
1e050 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  ttened. The call
1e060 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74  er will detect t
1e070 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e  he.**        syn
1e080 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65  tax error and re
1e090 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20  turn a detailed 
1e0a0 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20  message..**.**  
1e0b0 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
1e0c0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1e0d0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1e0e0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1e0f0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
1e100 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  ER BY clause of 
1e110 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
1e120 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
1e130 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
1e140 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
1e150 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
1e160 2a 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65  **  (19)  If the
1e170 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1e180 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1e190 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1e1a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
1e1b0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
1e1c0 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
1e1d0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1e1e0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1e1f0 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
1e200 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
1e210 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
1e220 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
1e230 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
1e240 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
1e250 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
1e260 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
1e270 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
1e280 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1e290 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
1e2a0 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
1e2b0 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
1e2c0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
1e2d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1e2e0 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
1e2f0 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
1e300 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
1e310 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
1e320 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
1e330 2a 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20  *  (21)  If the 
1e340 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1e350 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1e360 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1e370 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49   be.**        DI
1e380 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
1e390 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
1e3a0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20  ])..**.**  (22) 
1e3b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   The subquery ma
1e3c0 79 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72  y not be a recur
1e3d0 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  sive CTE..**.** 
1e3e0 20 28 32 33 29 20 20 49 66 20 74 68 65 20 6f 75   (23)  If the ou
1e3f0 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20 72  ter query is a r
1e400 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74 68  ecursive CTE, th
1e410 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  en the sub-query
1e420 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20   may not be.**  
1e430 20 20 20 20 20 20 61 20 63 6f 6d 70 6f 75 6e 64        a compound
1e440 20 71 75 65 72 79 2e 20 54 68 69 73 20 72 65 73   query. This res
1e450 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61  triction is beca
1e460 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67  use transforming
1e470 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70   the.**        p
1e480 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f  arent to a compo
1e490 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73  und query confus
1e4a0 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  es the code that
1e4b0 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20   handles.**     
1e4c0 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65     recursive que
1e4d0 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c  ries in multiSel
1e4e0 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  ect()..**.**  (*
1e4f0 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1e500 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1e510 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1e520 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a  bqueries.  Was:.
1e530 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75  **        The su
1e540 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  bquery may not b
1e550 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74  e an aggregate t
1e560 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69  hat uses the bui
1e570 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a  lt-in min() or .
1e580 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78  **        or max
1e590 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28  () functions.  (
1e5a0 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73  Without this res
1e5b0 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72  triction, a quer
1e5c0 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20  y like:.**      
1e5d0 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d    "SELECT x FROM
1e5e0 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c   (SELECT max(y),
1e5f0 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75   x FROM t1)" wou
1e600 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  ld not necessari
1e610 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74  ly.**        ret
1e620 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20  urn the value X 
1e630 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20  for which Y was 
1e640 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a  maximal.).**.**.
1e650 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
1e660 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
1e670 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
1e680 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
1e690 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
1e6a0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
1e6b0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
1e6c0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1e6d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
1e6e0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
1e6f0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
1e700 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
1e710 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
1e720 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1e730 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
1e740 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1e750 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
1e760 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1e770 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
1e780 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1e790 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
1e7a0 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
1e7b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
1e7c0 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
1e7d0 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
1e7e0 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
1e7f0 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
1e800 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
1e810 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1e820 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1e830 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1e840 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
1e850 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
1e860 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
1e870 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
1e880 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
1e890 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
1e8a0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
1e8b0 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
1e8c0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20  */.  int isAgg  
1e8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e8e0 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
1e8f0 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
1e900 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
1e910 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e920 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1e930 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
1e940 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63  Context;.  Selec
1e950 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f  t *pParent;    /
1e960 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20  * Current UNION 
1e970 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ALL term of the 
1e980 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  other query */. 
1e990 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
1e9a0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
1e9b0 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
1e9c0 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
1e9d0 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
1e9e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
1e9f0 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
1ea00 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
1ea10 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
1ea20 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
1ea30 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1ea40 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1ea50 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
1ea60 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
1ea70 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1ea80 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
1ea90 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
1eaa0 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1eab0 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
1eac0 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
1ead0 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
1eae0 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d  int iNewParent =
1eaf0 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65   -1;/* Replaceme
1eb00 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61  nt table for iPa
1eb10 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rent */.  int is
1eb20 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a  LeftJoin = 0; /*
1eb30 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73   True if pSub is
1eb40 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
1eb50 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  of a LEFT JOIN *
1eb60 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20  /    .  int i;  
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1eb80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1eb90 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1ebc0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1ebd0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1ebe0 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
1ebf0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1ec00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1ec10 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
1ec20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1ec30 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1ec40 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
1ec50 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
1ec60 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
1ec70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1ec80 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69  pPrior==0 );.  i
1ec90 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
1eca0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1ecb0 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
1ecc0 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  r) ) return 0;. 
1ecd0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1ece0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
1ecf0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
1ed00 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
1ed10 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
1ed20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
1ed30 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
1ed40 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
1ed50 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
1ed60 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
1ed70 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
1ed80 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ..  pSubSrc = pS
1ed90 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
1eda0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
1edb0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
1edc0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
1edd0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1ede0 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
1edf0 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
1ee00 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
1ee10 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
1ee20 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
1ee30 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
1ee40 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
1ee50 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
1ee60 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1ee70 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
1ee80 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
1ee90 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
1eea0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
1eeb0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
1eec0 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
1eed0 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
1eee0 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
1eef0 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
1ef00 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1ef10 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
1ef20 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ef30 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ef40 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
1ef50 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  Sub->pOffset ) r
1ef60 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ef90 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28   (14) */.  if( (
1efa0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1efb0 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26  _Compound)!=0 &&
1efc0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
1efd0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1f010 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
1f020 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
1f030 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
1f040 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f060 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
1f070 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1f080 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1f090 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
1f0a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1f0b0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   Restriction (4)
1f0c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1f0d0 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
1f0e0 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
1f0f0 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
1f100 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
1f110 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
1f120 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
1f130 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
1f140 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1f150 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f190 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
1f1a0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
1f1b0 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
1f1c0 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f1e0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f1f0 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
1f200 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
1f210 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
1f220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1f230 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f240 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
1f250 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
1f260 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1f270 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
1f280 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1f290 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1f2a0 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
1f2b0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1f2c0 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
1f2d0 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74  sive) ){.    ret
1f2e0 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1f2f0 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20  ctions (22) */. 
1f300 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1f310 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1f320 73 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70  sive) && pSub->p
1f330 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
1f340 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1f350 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20  ction (23) */.  
1f360 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
1f370 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f380 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1f390 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
1f3a0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
1f3b0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1f3c0 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c   be a join itsel
1f3d0 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20  f (3a). Example 
1f3e0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1f3f0 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a  ot.  ** allowed:
1f400 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1f410 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
1f420 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
1f430 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
1f440 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
1f450 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
1f460 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
1f470 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
1f480 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
1f490 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
1f4a0 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
1f4b0 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
1f4c0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  g..  **.  ** If 
1f4d0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f4e0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1f4f0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
1f500 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  , then the outer
1f510 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e  .  ** query cann
1f520 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
1f530 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69  te. (3c)  This i
1f540 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66  s an artifact of
1f550 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67   the way.  ** ag
1f560 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f  gregates are pro
1f570 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69  cessed - there i
1f580 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74  s no mechanism t
1f590 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20  o determine if. 
1f5a0 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   ** the LEFT JOI
1f5b0 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  N table should b
1f5c0 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a  e all-NULL..  **
1f5d0 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  .  ** See also t
1f5e0 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35  ickets #306, #35
1f5f0 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20  0, and #3300..  
1f600 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74  */.  if( (pSubit
1f610 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
1f620 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
1f630 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e  {.    isLeftJoin
1f640 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53   = 1;.    if( pS
1f650 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  ubSrc->nSrc>1 ||
1f660 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74   isAgg || IsVirt
1f670 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30  ual(pSubSrc->a[0
1f680 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ].pTab) ){.     
1f690 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20   /*  (3a)       
1f6a0 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28        (3c)     (
1f6b0 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  3b) */.      ret
1f6c0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
1f6d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f6e0 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20  XTRA_IFNULLROW. 
1f6f0 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e   else if( iFrom>
1f700 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20  0 && !isAgg ){. 
1f710 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73     /* Setting is
1f720 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63  LeftJoin to -1 c
1f730 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52  auses OP_IfNullR
1f740 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  ow opcodes to be
1f750 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20   generated for. 
1f760 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65     ** every refe
1f770 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73  rence to any res
1f780 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  ult column from 
1f790 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f  subquery in a jo
1f7a0 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20  in, even.    ** 
1f7b0 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20  though they are 
1f7c0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
1f7d0 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73  This will stress
1f7e0 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e  -test the OP_IfN
1f7f0 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f  ullRow .    ** o
1f800 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73  pcode. */.    is
1f810 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20  LeftJoin = -1;. 
1f820 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1f830 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29  Restriction (17)
1f840 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1f850 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1f860 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1f870 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1f880 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1f890 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1f8a0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1f8b0 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1f8c0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1f8d0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1f8e0 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1f8f0 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1f900 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1f910 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1f920 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1f930 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1f940 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1f950 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f960 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1f970 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d  on (20) */.    }
1f980 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
1f990 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1f9a0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1f9b0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
1f9c0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
1f9d0 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20  n 0; /* (17d1), 
1f9e0 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33  (17d2), or (17d3
1f9f0 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) */.    }.    f
1fa00 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
1fa10 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
1fa20 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
1fa30 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1fa40 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1fa50 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1fa60 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
1fa70 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
1fa80 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1fa90 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1faa0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1fab0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
1fac0 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
1fad0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1fae0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
1faf0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
1fb00 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
1fb10 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
1fb20 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
1fb30 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1fb40 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1fb50 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
1fb60 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a      /* (17b) */.
1fb70 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
1fb80 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
1fb90 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20  1->op!=TK_ALL)  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fbb0 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20  * (17a) */.     
1fbc0 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
1fbd0 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20  ->nSrc<1        
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37            /* (17
1fc00 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20  c) */.      ){. 
1fc10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1fc20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1fc30 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1fc40 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1fc50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1fc60 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20  striction (18). 
1fc70 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
1fc80 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1fc90 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
1fca0 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
1fcb0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
1fcc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1fcd0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
1fce0 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
1fcf0 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
1fd00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1fd10 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  }.  }..  /***** 
1fd20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1fd30 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
1fd40 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1fd50 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54   *****/.  SELECT
1fd60 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
1fd70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70  ,("flatten %s.%p
1fd80 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22   from term %d\n"
1fd90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fda0 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e       pSub->zSelN
1fdb0 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  ame, pSub, iFrom
1fdc0 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
1fdd0 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
1fde0 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
1fdf0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
1fe00 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
1fe10 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
1fe20 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1fe30 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
1fe40 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
1fe50 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
1fe60 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
1fe70 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1fe80 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
1fe90 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
1fea0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1feb0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1fec0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1fed0 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
1fee0 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
1fef0 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
1ff00 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
1ff10 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
1ff20 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
1ff30 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
1ff40 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
1ff50 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
1ff60 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
1ff70 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
1ff80 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
1ff90 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
1ffa0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
1ffb0 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
1ffc0 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
1ffd0 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
1ffe0 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
1fff0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
20000 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
20010 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
20020 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
20030 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
20040 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
20050 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
20060 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
20070 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
20080 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
20090 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
200a0 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
200b0 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
200c0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
200d0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
200e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
200f0 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
20100 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
20110 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
20120 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
20130 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
20140 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
20150 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
20160 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
20170 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
20180 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
20190 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
201a0 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
201b0 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
201c0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
201d0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
201e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
201f0 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
20200 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
20210 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
20220 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
20230 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
20240 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
20250 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
20260 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
20270 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
20280 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
20290 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
202a0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
202b0 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
202c0 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
202d0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
202e0 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
202f0 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
20300 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
20310 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
20320 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
20330 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
20340 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
20350 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
20360 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
20370 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  mit;.    Expr *p
20380 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
20390 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  set;.    Select 
203a0 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
203b0 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
203c0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
203d0 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
203e0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
203f0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
20400 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
20410 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
20420 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
20430 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
20440 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
20450 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d  Name(pNew, pSub-
20460 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  >zSelName);.    
20470 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
20480 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  fset;.    p->pLi
20490 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
204a0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
204b0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
204c0 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
204d0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
204e0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
204f0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50  0 ){.      p->pP
20500 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
20510 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20520 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
20530 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
20540 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
20550 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
20560 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
20570 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e  t = p;.      p->
20580 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
20590 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
205a0 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20  (2,pParse,p,.   
205b0 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64        ("compound
205c0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
205d0 6e 65 72 20 63 72 65 61 74 65 73 20 25 73 2e 25  ner creates %s.%
205e0 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20  p as peer\n",.  
205f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65         pNew->zSe
20600 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20  lName, pNew));. 
20610 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
20620 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
20630 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
20640 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
20650 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
20660 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
20670 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
20680 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
20690 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
206a0 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
206b0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
206c0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
206d0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
206e0 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
206f0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
20700 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
20710 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20720 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
20730 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
20740 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
20750 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
20760 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20770 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
20780 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
20790 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
207a0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
207b0 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
207c0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
207d0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
207e0 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
207f0 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
20800 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
20810 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20820 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
20830 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
20840 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
20850 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
20860 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
20870 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
20880 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
20890 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
208a0 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
208b0 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
208c0 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
208d0 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d  **.  ** pSubitem
208e0 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73  ->pTab is always
208f0 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73   non-NULL by tes
20900 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61  t restrictions a
20910 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a  nd tests above..
20920 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59    */.  if( ALWAY
20930 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  S(pSubitem->pTab
20940 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c  !=0) ){.    Tabl
20950 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
20960 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
20970 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
20980 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a  ->nTabRef==1 ){.
20990 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f        Parse *pTo
209a0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
209b0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
209c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61  arse);.      pTa
209d0 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d  bToDel->pNextZom
209e0 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d  bie = pToplevel-
209f0 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20  >pZombieTab;.   
20a00 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a     pToplevel->pZ
20a10 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54  ombieTab = pTabT
20a20 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oDel;.    }else{
20a30 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
20a40 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20  ->nTabRef--;.   
20a50 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d   }.    pSubitem-
20a60 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >pTab = 0;.  }..
20a70 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
20a80 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  ng loop runs onc
20a90 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
20aa0 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  in a compound-su
20ab0 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74  bquery.  ** flat
20ac0 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72  tening (as descr
20ad0 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66  ibed above).  If
20ae0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
20af0 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20  different kind. 
20b00 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e   ** of flattenin
20b10 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67  g - a flattening
20b20 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
20b30 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
20b40 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a  flattening -.  *
20b50 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70  * then this loop
20b60 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e   only runs once.
20b70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
20b80 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f  loop moves all o
20b90 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
20ba0 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
20bb0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
20bc0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
20bd0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
20be0 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
20bf0 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
20c00 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
20c10 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
20c20 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
20c30 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
20c40 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
20c50 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
20c60 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
20c70 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
20c80 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
20c90 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
20ca0 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
20cb0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
20cc0 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
20cd0 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
20ce0 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
20cf0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
20d00 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
20d10 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
20d20 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
20d30 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
20d40 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  ..  */.  for(pPa
20d50 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b  rent=p; pParent;
20d60 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74   pParent=pParent
20d70 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70  ->pPrior, pSub=p
20d80 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
20d90 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20    int nSubSrc;. 
20da0 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d     u8 jointype =
20db0 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20   0;.    pSubSrc 
20dc0 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20  = pSub->pSrc;   
20dd0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
20de0 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a   of subquery */.
20df0 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53      nSubSrc = pS
20e00 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a  ubSrc->nSrc;  /*
20e10 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
20e20 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f   in subquery FRO
20e30 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
20e40 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
20e50 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
20e60 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
20e70 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a  outer query */..
20e80 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a      if( pSrc ){.
20e90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20ea0 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20  arent==p );  /* 
20eb0 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75  First time throu
20ec0 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
20ed0 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20       jointype = 
20ee0 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69  pSubitem->fg.joi
20ef0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
20f00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20f10 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
20f20 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
20f30 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
20f40 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
20f50 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
20f60 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
20f70 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
20f80 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
20f90 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
20fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
20fb0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
20fc0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
20fd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
20fe0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
20ff0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
21000 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
21010 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
21020 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
21030 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
21040 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
21050 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
21060 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
21070 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
21080 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
21090 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
210a0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
210b0 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
210c0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
210d0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
210e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
210f0 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
21100 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
21110 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
21120 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
21130 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
21140 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
21150 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
21160 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
21170 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
21180 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
21190 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
211a0 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
211b0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
211c0 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
211d0 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
211e0 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
211f0 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
21200 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
21210 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20   to 4 slots..   
21220 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73   ** The middle s
21230 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20  lot is expanded 
21240 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20  to two slots in 
21250 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70  order to make sp
21260 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ace.    ** for t
21270 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  he two elements 
21280 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
21290 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
212a0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
212b0 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
212c0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
212d0 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c  Src = pSrc = sql
212e0 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
212f0 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75  ge(db, pSrc, nSu
21300 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b  bSrc-1,iFrom+1);
21310 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
21320 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
21330 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21340 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21350 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
21360 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
21370 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71  ms from the subq
21380 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
21390 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
213a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
213b0 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
213c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
213d0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
213e0 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69  (db, pSrc->a[i+i
213f0 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  From].pUsing);. 
21400 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
21410 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67  c->a[i+iFrom].fg
21420 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
21430 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
21440 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
21450 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  c->a[i];.      i
21460 4e 65 77 50 61 72 65 6e 74 20 3d 20 70 53 75 62  NewParent = pSub
21470 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
21480 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  r;.      memset(
21490 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
214a0 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
214b0 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
214c0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
214d0 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om].fg.jointype 
214e0 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
214f0 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
21500 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
21510 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
21520 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
21530 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
21540 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
21550 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
21560 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
21570 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
21580 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
21590 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
215a0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
215b0 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
215c0 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
215d0 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
21600 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
21610 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
21620 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
21630 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21640 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
21650 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21660 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
21670 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
21680 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
21690 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
216a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
216b0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
216c0 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
216d0 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
216e0 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
216f0 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
21700 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
21710 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  0"..    */.    i
21720 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
21730 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74  y ){.      /* At
21740 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79   this point, any
21750 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72   non-zero iOrder
21760 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64  ByCol values ind
21770 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  icate that the. 
21780 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
21790 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
217a0 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20  on is identical 
217b0 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43  to the iOrderByC
217c0 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65  ol'th.      ** e
217d0 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e  xpression return
217e0 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61  ed by SELECT sta
217f0 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e  tement pSub. Sin
21800 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a  ce these values.
21810 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20        ** do not 
21820 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72  necessarily corr
21830 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e  espond to column
21840 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74  s in SELECT stat
21850 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20  ement pParent,. 
21860 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65       ** zero the
21870 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65  m before transfe
21880 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ring the ORDER B
21890 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
218a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20  **.      ** Not 
218b0 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63  doing this may c
218c0 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66  ause an error if
218d0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
218e0 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
218f0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74   ** function att
21900 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
21910 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d   a compound sub-
21920 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65  query into pPare
21930 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65  nt.      ** (the
21940 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63   only way this c
21950 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20  an happen is if 
21960 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
21970 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20  -query is.      
21980 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72  ** currently par
21990 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29  t of pSub->pSrc)
219a0 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31  . See ticket [d1
219b0 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20  1a6e908f].  */. 
219c0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
219d0 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
219e0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
219f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
21a00 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
21a10 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  {.        pOrder
21a20 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
21a30 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
21a40 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
21a50 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
21a60 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
21a70 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
21a80 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
21a90 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
21aa0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
21ab0 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
21ac0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
21ad0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
21ae0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
21af0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
21b00 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66  );.    if( isLef
21b10 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20 20 20  tJoin>0 ){.     
21b20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68   setJoinExpr(pWh
21b30 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e 74 29  ere, iNewParent)
21b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
21b50 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ent->pWhere = sq
21b60 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
21b70 20 70 57 68 65 72 65 2c 20 70 50 61 72 65 6e 74   pWhere, pParent
21b80 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69  ->pWhere);.    i
21b90 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
21ba0 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  led==0 ){.      
21bb0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a  SubstContext x;.
21bc0 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
21bd0 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
21be0 2e 69 54 61 62 6c 65 20 3d 20 69 50 61 72 65 6e  .iTable = iParen
21bf0 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54  t;.      x.iNewT
21c00 61 62 6c 65 20 3d 20 69 4e 65 77 50 61 72 65 6e  able = iNewParen
21c10 74 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66  t;.      x.isLef
21c20 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f  tJoin = isLeftJo
21c30 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69  in;.      x.pELi
21c40 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73  st = pSub->pELis
21c50 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  t;.      substSe
21c60 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65 6e 74  lect(&x, pParent
21c70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
21c80 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
21c90 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
21ca0 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
21cb0 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
21cc0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
21cd0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
21ce0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
21cf0 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
21d00 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
21d10 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
21d20 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
21d30 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
21d40 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
21d50 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
21d60 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
21d70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
21d80 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
21d90 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
21da0 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
21db0 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
21dc0 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
21dd0 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
21de0 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
21df0 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
21e00 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
21e10 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
21e20 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
21e30 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
21e40 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
21e50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
21e60 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
21e70 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
21e80 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
21e90 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
21ea0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
21eb0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
21ec0 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
21ed0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
21ee0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
21ef0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
21f00 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
21f10 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
21f20 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
21f30 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  After flattening
21f40 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
21f50 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
21f60 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
21f70 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
21f80 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
21f90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21fa0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
21fb0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
21fc0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
21fd0 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
21fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21ff0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
22000 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
22010 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63  EW)./*.** Make c
22020 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e  opies of relevan
22030 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  t WHERE clause t
22040 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65  erms of the oute
22050 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20  r query into.** 
22060 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
22070 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45   of subquery.  E
22080 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
22090 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
220a0 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
220b0 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29  -d AS y FROM t1)
220c0 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
220d0 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  =10;.**.** Trans
220e0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a  formed into:.**.
220f0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
22100 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
22110 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
22120 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41  M t1 WHERE a=5 A
22130 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20  ND c-d=10).**   
22140 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20    WHERE x=5 AND 
22150 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  y=10;.**.** The 
22160 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65  hope is that the
22170 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20   terms added to 
22180 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
22190 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72  will make it mor
221a0 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a  e.** efficient..
221b0 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  **.** Do not att
221c0 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69  empt this optimi
221d0 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  zation if:.**.**
221e0 20 20 20 28 31 29 20 28 2a 2a 20 54 68 69 73 20     (1) (** This 
221f0 72 65 73 74 72 69 63 74 69 6f 6e 20 77 61 73 20  restriction was 
22200 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30 31 37 2d  removed on 2017-
22210 30 39 2d 32 39 2e 20 20 57 65 20 75 73 65 64 20  09-29.  We used 
22220 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
22230 64 69 73 61 6c 6c 6f 77 20 74 68 69 73 20 6f 70  disallow this op
22240 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 61  timization for a
22250 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
22260 69 65 73 2c 20 62 75 74 20 6e 6f 77 0a 2a 2a 20  ies, but now.** 
22270 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
22280 61 6c 6c 6f 77 65 64 20 62 79 20 70 75 74 74 69  allowed by putti
22290 6e 67 20 74 68 65 20 65 78 74 72 61 20 74 65 72  ng the extra ter
222a0 6d 73 20 6f 6e 20 74 68 65 20 48 41 56 49 4e 47  ms on the HAVING
222b0 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
222c0 20 20 20 20 20 20 54 68 65 20 61 64 64 65 64 20        The added 
222d0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
222e0 20 70 6f 69 6e 74 6c 65 73 73 20 69 66 20 74 68   pointless if th
222f0 65 20 73 75 62 71 75 65 72 79 20 6c 61 63 6b 73  e subquery lacks
22300 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 20  .**           a 
22310 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
22320 20 20 42 75 74 20 73 75 63 68 20 61 20 48 41 56    But such a HAV
22330 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 61 6c  ING clause is al
22340 73 6f 20 68 61 72 6d 6c 65 73 73 0a 2a 2a 20 20  so harmless.**  
22350 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 65 72           so ther
22360 65 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  e does not appea
22370 72 20 74 6f 20 62 65 20 61 6e 79 20 72 65 61 73  r to be any reas
22380 6f 6e 20 74 6f 20 61 64 64 20 65 78 74 72 61 20  on to add extra 
22390 6c 6f 67 69 63 0a 2a 2a 20 20 20 20 20 20 20 20  logic.**        
223a0 20 20 20 74 6f 20 73 75 70 70 72 65 73 73 20 69     to suppress i
223b0 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28  t. **).**.**   (
223c0 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  2) The inner que
223d0 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73  ry is the recurs
223e0 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f  ive part of a co
223f0 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
22400 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  ssion..**.**   (
22410 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  3) The inner que
22420 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63  ry has a LIMIT c
22430 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65  lause (since the
22440 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
22450 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63  WHERE.**       c
22460 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67  lose would chang
22470 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66  e the meaning of
22480 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a   the LIMIT)..**.
22490 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e  **   (4) The inn
224a0 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
224b0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
224c0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28   a LEFT JOIN.  (
224d0 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  The caller.**   
224e0 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69      enforces thi
224f0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69  s restriction si
22500 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
22510 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65   does not have e
22520 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69  nough.**       i
22530 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e  nformation to kn
22540 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  ow.).**.**   (5)
22550 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
22560 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
22570 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f  ginates in the O
22580 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
22590 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20  e.**       of a 
225a0 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a  LEFT JOIN..**.**
225b0 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20   Return 0 if no 
225c0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
225d0 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   and non-zero if
225e0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
225f0 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72  RE clause.** ter
22600 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ms are duplicate
22610 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75  d into the subqu
22620 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
22630 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  nt pushDownWhere
22640 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
22650 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
22660 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
22670 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  (for malloc() an
22680 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  d error reportin
22690 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  g) */.  Select *
226a0 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a  pSubq,        /*
226b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77 68   The subquery wh
226c0 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ose WHERE clause
226d0 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e   is to be augmen
226e0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ted */.  Expr *p
226f0 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
22700 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
22710 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
22720 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
22730 43 75 72 73 6f 72 20 20 20 20 20 20 20 20 20 20  Cursor          
22740 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
22750 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  r of the subquer
22760 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  y */.){.  Expr *
22770 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  pNew;.  int nChn
22780 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68  g = 0;.  if( pWh
22790 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ere==0 ) return 
227a0 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  0;.  if( pSubq->
227b0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
227c0 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e  cursive ) return
227d0 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74   0;  /* restrict
227e0 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 64  ion (2) */..#ifd
227f0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
22800 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69    /* Only the fi
22810 72 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f  rst term of a co
22820 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20  mpound can have 
22830 61 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20  a WITH clause.  
22840 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  But make.  ** su
22850 72 65 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d  re no other term
22860 73 20 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f  s are marked SF_
22870 52 65 63 75 72 73 69 76 65 20 69 6e 20 63 61 73  Recursive in cas
22880 65 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e  e something chan
22890 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ges.  ** in the 
228a0 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b  future..  */.  {
228b0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  .    Select *pX;
228c0 20 20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53    .    for(pX=pS
228d0 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  ubq; pX; pX=pX->
228e0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61  pPrior){.      a
228f0 73 73 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46  ssert( (pX->selF
22900 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
22910 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20  sive))==0 );.   
22920 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
22930 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d   if( pSubq->pLim
22940 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  it!=0 ){.    ret
22950 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
22960 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d  ction (3) */.  }
22970 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65  .  while( pWhere
22980 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
22990 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73      nChng += pus
229a0 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
229b0 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70  pParse, pSubq, p
229c0 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20 69  Where->pRight, i
229d0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57 68  Cursor);.    pWh
229e0 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
229f0 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45  eft;.  }.  if( E
22a00 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22a10 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69  Where,EP_FromJoi
22a20 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  n) ) return 0; /
22a30 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * restriction (5
22a40 29 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  ) */.  if( sqlit
22a50 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
22a60 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
22a70 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
22a80 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
22a90 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
22aa0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b   SubstContext x;
22ab0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
22ac0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
22ad0 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c  rse->db, pWhere,
22ae0 20 30 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61   0);.      x.pPa
22af0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
22b00 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
22b10 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e  Cursor;.      x.
22b20 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72  iNewTable = iCur
22b30 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c  sor;.      x.isL
22b40 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20  eftJoin = 0;.   
22b50 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
22b60 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ubq->pEList;.   
22b70 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45     pNew = substE
22b80 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20  xpr(&x, pNew);. 
22b90 20 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e       if( pSubq->
22ba0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
22bb0 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20  gregate ){.     
22bc0 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e     pSubq->pHavin
22bd0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
22be0 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
22bf0 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70  Subq->pHaving, p
22c00 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  New);.      }els
22c10 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  e{.        pSubq
22c20 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
22c30 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
22c40 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68  ->db, pSubq->pWh
22c50 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
22c60 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71 20    }.      pSubq 
22c70 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b  = pSubq->pPrior;
22c80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22c90 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e  urn nChng;.}.#en
22ca0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
22cb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
22cc0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
22cd0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
22ce0 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61  EW) */../*.** Ba
22cf0 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
22d00 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e  nts of the AggIn
22d10 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  fo structure ind
22d20 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
22d30 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
22d40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
22d50 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c  hecks if the fol
22d60 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
22d70 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
22d80 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a  query contains j
22d90 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ust a single agg
22da0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
22db0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67  .**    * the agg
22dc0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
22dd0 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20  is either min() 
22de0 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a  or max(), and.**
22df0 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65      * the argume
22e00 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  nt to the aggreg
22e10 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
22e20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a  a column value..
22e30 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  **.** If all of 
22e40 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72  the above are tr
22e50 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f  ue, then WHERE_O
22e60 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
22e70 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a  ERE_ORDERBY_MAX.
22e80 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
22e90 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41  s appropriate. A
22ea0 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  lso, *ppMinMax i
22eb0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22ec0 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f  o the .** list o
22ed0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
22ee0 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ed to the aggreg
22ef0 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ate before retur
22f00 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ning..**.** Or, 
22f10 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  if the condition
22f20 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20  s above are not 
22f30 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  met, *ppMinMax i
22f40 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
22f50 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
22f60 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e  NORMAL is return
22f70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ed..*/.static u8
22f80 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67   minMaxQuery(Agg
22f90 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20  Info *pAggInfo, 
22fa0 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
22fb0 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
22fc0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
22fd0 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20  _NORMAL;        
22fe0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
22ff0 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61  e */..  *ppMinMa
23000 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67  x = 0;.  if( pAg
23010 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20  gInfo->nFunc==1 
23020 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
23030 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  pr = pAggInfo->a
23040 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f  Func[0].pExpr; /
23050 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63  * Aggregate func
23060 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
23070 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
23080 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
23090 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
230a0 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
230b0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
230c0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
230d0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
230e0 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
230f0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
23100 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
23110 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
23120 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
23130 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23140 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75  zFunc = pExpr->u
23150 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69  .zToken;.      i
23160 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
23170 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
23180 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
23190 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
231a0 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
231b0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
231c0 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  st;.      }else 
231d0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
231e0 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
231f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
23200 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
23210 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20  RBY_MAX;.       
23220 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
23230 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
23240 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
23250 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  ( *ppMinMax==0 |
23260 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e  | (*ppMinMax)->n
23270 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Expr==1 );.  ret
23280 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
23290 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
232a0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
232b0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
232c0 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
232d0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
232e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
232f0 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
23300 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
23310 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
23320 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
23330 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
23340 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
23350 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
23360 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
23370 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
23380 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
23390 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
233a0 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
233b0 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
233c0 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
233d0 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
233e0 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
233f0 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
23400 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
23410 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
23420 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
23430 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
23440 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
23450 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
23460 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
23470 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
23480 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
23490 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
234a0 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
234b0 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
234c0 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
234d0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
234e0 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
234f0 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
23500 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
23510 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
23520 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
23530 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
23540 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
23550 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
23560 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
23570 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
23580 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
23590 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
235a0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
235b0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
235c0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
235d0 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
235e0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
235f0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
23600 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
23610 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
23620 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
23630 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
23640 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
23650 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
23660 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
23670 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
23680 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
23690 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
236a0 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
236b0 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
236c0 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
236d0 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
236e0 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
236f0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
23700 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
23710 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
23720 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
23730 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
23740 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
23750 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
23760 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
23770 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
23780 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
23790 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
237a0 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
237b0 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
237c0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
237d0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
237e0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
237f0 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
23800 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
23810 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
23820 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
23830 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73   && pFrom->fg.is
23840 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20  IndexedBy ){.   
23850 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
23860 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
23870 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79  char *zIndexedBy
23880 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e   = pFrom->u1.zIn
23890 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
238a0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
238b0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
238c0 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
238d0 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
238e0 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
238f0 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
23900 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
23910 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
23920 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
23930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
23940 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23950 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
23960 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
23970 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
23980 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
23990 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
239a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
239b0 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
239c0 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  IBIndex = pIdx;.
239d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
239e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
239f0 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
23a00 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
23a10 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
23a20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
23a30 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
23a40 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
23a50 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
23a60 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
23a70 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
23a80 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
23a90 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
23aa0 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
23ab0 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
23ac0 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
23ad0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
23ae0 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
23af0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
23b00 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
23b10 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
23b20 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
23b30 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
23b40 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
23b50 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
23b60 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
23b70 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
23b80 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
23b90 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
23ba0 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
23bb0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
23bc0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
23bd0 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
23be0 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
23bf0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
23c00 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
23c10 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
23c20 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
23c30 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
23c40 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
23c50 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
23c60 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
23c70 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
23c80 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
23c90 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
23ca0 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
23cb0 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
23cc0 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
23cd0 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
23ce0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
23cf0 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
23d00 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
23d10 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
23d20 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
23d30 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
23d40 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
23d50 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
23d60 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
23d70 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
23d80 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
23d90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
23da0 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
23db0 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
23dc0 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
23dd0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
23de0 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
23df0 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
23e00 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
23e10 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
23e20 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
23e30 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23e40 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
23e50 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
23e60 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
23e70 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
23e80 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
23e90 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
23ea0 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
23eb0 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
23ec0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23ed0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
23ee0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
23ef0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
23f00 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
23f10 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
23f20 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
23f30 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
23f40 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
23f50 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
23f60 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23f70 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
23f80 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
23f90 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
23fa0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
23fb0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
23fc0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
23fd0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
23fe0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
23ff0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
24000 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
24010 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
24020 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
24030 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
24040 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
24050 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
24060 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
24070 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
24080 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
24090 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
240a0 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
240b0 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
240c0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
240d0 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
240e0 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
240f0 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
24100 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
24110 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
24120 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
24130 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  b, TK_ASTERISK, 
24140 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
24150 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
24160 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
24170 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
24180 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
24190 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
241a0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
241b0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
241c0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
241d0 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70  ->pWith = 0;.  p
241e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
241f0 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73  F_Compound;.  as
24200 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
24210 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65  gs & SF_Converte
24220 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65  d)==0 );.  p->se
24230 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e  lFlags |= SF_Con
24240 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74  verted;.  assert
24250 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d  ( pNew->pPrior!=
24260 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  0 );.  pNew->pPr
24270 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
24280 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  w;.  pNew->pLimi
24290 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  t = 0;.  pNew->p
242a0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65  Offset = 0;.  re
242b0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
242c0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e;.}../*.** Chec
242d0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
242e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
242f0 20 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65   pFrom has table
24300 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e  -valued function
24310 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  .** arguments.  
24320 49 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76  If it does, leav
24330 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
24340 67 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ge in pParse and
24350 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
24360 65 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d  ero, since pFrom
24370 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
24380 74 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61  to be a table-va
24390 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  lued function..*
243a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e  /.static int can
243b0 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61  notBeFunction(Pa
243c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
243d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
243e0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
243f0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pFrom->fg.isTabF
24400 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unc ){.    sqlit
24410 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
24420 65 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20  e, "'%s' is not 
24430 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72  a function", pFr
24440 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  om->zName);.    
24450 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
24460 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
24470 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24480 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  _CTE./*.** Argum
24490 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68  ent pWith (which
244a0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f   may be NULL) po
244b0 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64  ints to a linked
244c0 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20   list of nested 
244d0 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74  .** WITH context
244e0 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f  s, from inner to
244f0 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74   outermost. If t
24500 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
24510 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20  ied by .** FROM 
24520 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70  clause element p
24530 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61  Item is really a
24540 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78   common-table-ex
24550 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a  pression (CTE) .
24560 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  ** then return a
24570 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24580 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66  CTE definition f
24590 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f  or that table. O
245a0 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75  therwise.** retu
245b0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
245c0 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  f a non-NULL val
245d0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ue is returned, 
245e0 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74  set *ppContext t
245f0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57  o point to the W
24600 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ith.** object th
24610 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
24620 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  CTE belongs to..
24630 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
24640 20 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68   Cte *searchWith
24650 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  (.  With *pWith,
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24670 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69      /* Current i
24680 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c  nnermost WITH cl
24690 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
246a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
246b0 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f  Item,     /* FRO
246c0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
246d0 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20   to resolve */. 
246e0 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78   With **ppContex
246f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
24700 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c   /* OUT: WITH cl
24710 61 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75  ause return valu
24720 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
24730 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
24740 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49  *zName;.  if( pI
24750 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
24760 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49  0 && (zName = pI
24770 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  tem->zName)!=0 )
24780 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20  {.    With *p;. 
24790 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20     for(p=pWith; 
247a0 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b  p; p=p->pOuter){
247b0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
247c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
247d0 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
247e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
247f0 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
24800 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  p->a[i].zName)==
24810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
24820 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20  ppContext = p;. 
24830 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
24840 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  &p->a[i];.      
24850 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24860 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
24870 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65  ;.}../* The code
24880 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74   generator maint
24890 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20  ains a stack of 
248a0 61 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75  active WITH clau
248b0 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ses.** with the 
248c0 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20  inner-most WITH 
248d0 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20  clause being at 
248e0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
248f0 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
24900 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20   routine pushes 
24910 74 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20  the WITH clause 
24920 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
24930 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
24940 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66   onto the top of
24950 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61   the stack. If a
24960 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73  rgument bFree is
24970 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73   true, then this
24980 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20  .** WITH clause 
24990 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f  will never be po
249a0 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
249b0 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
249c0 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  e it.** should b
249d0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
249e0 74 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  th the Parse obj
249f0 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61  ect. In other ca
24a00 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72  ses, when.** bFr
24a10 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20  ee==0, the With 
24a20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66  object will be f
24a30 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
24a40 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73  the SELECT .** s
24a50 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68  tatement with wh
24a60 69 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69  ich it is associ
24a70 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
24a80 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61  lite3WithPush(Pa
24a90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74  rse *pParse, Wit
24aa0 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72  h *pWith, u8 bFr
24ab0 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62  ee){.  assert( b
24ac0 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72  Free==0 || (pPar
24ad0 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20  se->pWith==0 && 
24ae0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
24af0 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  ree==0) );.  if(
24b00 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73   pWith ){.    as
24b10 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
24b20 69 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith!=pWith );.  
24b30 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20    pWith->pOuter 
24b40 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
24b50 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
24b60 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
24b70 69 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72  if( bFree ) pPar
24b80 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20  se->pWithToFree 
24b90 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a  = pWith;.  }.}..
24ba0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24bb0 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72  ion checks if ar
24bc0 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66  gument pFrom ref
24bd0 65 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63  ers to a CTE dec
24be0 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57  lared by .** a W
24bf0 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ITH clause on th
24c00 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c  e stack currentl
24c10 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  y maintained by 
24c20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c  the parser. And,
24c30 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79  .** if currently
24c40 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54   processing a CT
24c50 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66  E expression, if
24c60 20 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69   it is a recursi
24c70 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ve.** reference 
24c80 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43  to the current C
24c90 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  TE..**.** If pFr
24ca0 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69  om falls into ei
24cb0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
24cc0 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65  categories above
24cd0 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a  , pFrom->pTab.**
24ce0 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
24cf0 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
24d00 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65  accordingly. The
24d10 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63   caller should c
24d20 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e  heck.** (pFrom->
24d30 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65  pTab!=0) to dete
24d40 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
24d50 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75   not a successfu
24d60 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66  l match.** was f
24d70 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ound..**.** Whet
24d80 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74  her or not a mat
24d90 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c  ch is found, SQL
24da0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
24db0 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a  ed if no error.*
24dc0 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  * occurs. If an 
24dd0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
24de0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
24df0 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
24e00 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e  the.** parser an
24e10 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64  d some error cod
24e20 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
24e30 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
24e40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
24e50 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c  ithExpand(.  Wal
24e60 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20  ker *pWalker, . 
24e70 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
24e80 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20  item *pFrom.){. 
24e90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
24ea0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
24eb0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
24ec0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24ed0 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
24ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24ef0 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28  /* Matched CTE (
24f00 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61  or NULL if no ma
24f10 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a  tch) */.  With *
24f20 70 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  pWith;          
24f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54            /* WIT
24f40 48 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43  H clause that pC
24f50 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  te belongs to */
24f60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f  ..  assert( pFro
24f70 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20  m->pTab==0 );.. 
24f80 20 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69   pCte = searchWi
24f90 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  th(pParse->pWith
24fa0 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29  , pFrom, &pWith)
24fb0 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a  ;.  if( pCte ){.
24fc0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
24fd0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
24fe0 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63  EList;.    Selec
24ff0 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c  t *pSel;.    Sel
25000 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  ect *pLeft;     
25010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
25020 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ft-most SELECT s
25030 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
25040 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76  int bMayRecursiv
25050 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
25060 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e   True if compoun
25070 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f  d joined by UNIO
25080 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57  N [ALL] */.    W
25090 69 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b  ith *pSavedWith;
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
250b0 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
250c0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a   pParse->pWith *
250d0 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74  /..    /* If pCt
250e0 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f  e->zCteErr is no
250f0 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70  n-NULL at this p
25100 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  oint, then this 
25110 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20  is an illegal.  
25120 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72    ** recursive r
25130 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20  eference to CTE 
25140 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65  pCte. Leave an e
25150 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61  rror in pParse a
25160 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
25170 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d   early. If pCte-
25180 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c  >zCteErr is NULL
25190 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e  , then this is n
251a0 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72  ot a recursive r
251b0 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a  eference..    **
251c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70   In this case, p
251d0 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20  roceed.  */.    
251e0 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72  if( pCte->zCteEr
251f0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
25200 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25210 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  e, pCte->zCteErr
25220 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
25230 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25240 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
25250 0a 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42  .    if( cannotB
25260 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  eFunction(pParse
25270 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
25280 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25290 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
252a0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
252b0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
252c0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
252d0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
252e0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
252f0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
25300 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
25310 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54  rt;.    pTab->nT
25320 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  abRef = 1;.    p
25330 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
25340 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
25350 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
25360 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
25370 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
25380 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
25390 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
253a0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
253b0 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62  576) );.    pTab
253c0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
253d0 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f  _Ephemeral | TF_
253e0 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
253f0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
25400 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
25410 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  ctDup(db, pCte->
25420 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
25430 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25440 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
25450 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
25460 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
25470 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  rom->pSelect );.
25480 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
25490 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72   this is a recur
254a0 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20  sive CTE. */.   
254b0 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70   pSel = pFrom->p
254c0 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79  Select;.    bMay
254d0 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53  Recursive = ( pS
254e0 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  el->op==TK_ALL |
254f0 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55  | pSel->op==TK_U
25500 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  NION );.    if( 
25510 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
25520 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
25530 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
25540 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  c = pFrom->pSele
25550 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  ct->pSrc;.      
25560 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
25570 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
25580 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
25590 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
255a0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  = &pSrc->a[i];. 
255b0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
255c0 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a  ->zDatabase==0 .
255d0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65           && pIte
255e0 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20  m->zName!=0 .   
255f0 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
25600 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d  te3StrICmp(pItem
25610 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a  ->zName, pCte->z
25620 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20  Name).          
25630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
25640 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  em->pTab = pTab;
25650 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
25660 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
25670 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
25680 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b  pTab->nTabRef++;
25690 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d  .          pSel-
256a0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
256b0 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20  Recursive;.     
256c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
256d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
256e0 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65  one recursive re
256f0 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69  ference is permi
25700 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66  tted. */ .    if
25710 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e  ( pTab->nTabRef>
25720 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
25730 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20  e3ErrorMsg(.    
25740 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d        pParse, "m
25750 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63  ultiple referenc
25760 65 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20  es to recursive 
25770 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65  table: %s", pCte
25780 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
25790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
257a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
257b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  }.    assert( pT
257c0 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c  ab->nTabRef==1 |
257d0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  | .            (
257e0 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26  (pSel->selFlags&
257f0 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26  SF_Recursive) &&
25800 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d   pTab->nTabRef==
25810 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d  2 ));..    pCte-
25820 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63  >zCteErr = "circ
25830 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20  ular reference: 
25840 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57  %s";.    pSavedW
25850 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ith = pParse->pW
25860 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
25870 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
25880 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
25890 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53  rsive ){.      S
258a0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
258b0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
258c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
258d0 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a  or->pWith==0 );.
258e0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57        pPrior->pW
258f0 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74  ith = pSel->pWit
25900 68 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  h;.      sqlite3
25910 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
25920 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20  er, pPrior);.   
25930 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68     pPrior->pWith
25940 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
25950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
25960 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
25970 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pSel);.    }. 
25980 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
25990 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66   = pWith;..    f
259a0 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70  or(pLeft=pSel; p
259b0 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c  Left->pPrior; pL
259c0 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f  eft=pLeft->pPrio
259d0 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  r);.    pEList =
259e0 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a   pLeft->pEList;.
259f0 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43      if( pCte->pC
25a00 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ols ){.      if(
25a10 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
25a20 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e  t->nExpr!=pCte->
25a30 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a  pCols->nExpr ){.
25a40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
25a50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
25a60 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64  "table %s has %d
25a70 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63   values for %d c
25a80 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20  olumns",.       
25a90 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65       pCte->zName
25aa0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
25ab0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45   pCte->pCols->nE
25ac0 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  xpr.        );. 
25ad0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
25ae0 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74  With = pSavedWit
25af0 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  h;.        retur
25b00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45        }.      pE
25b20 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f  List = pCte->pCo
25b30 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ls;.    }..    s
25b40 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
25b50 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
25b60 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  , pEList, &pTab-
25b70 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
25b80 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  ol);.    if( bMa
25b90 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
25ba0 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65      if( pSel->se
25bb0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
25bc0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20  rsive ){.       
25bd0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
25be0 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72   "multiple recur
25bf0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a  sive references:
25c00 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73   %s";.      }els
25c10 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  e{.        pCte-
25c20 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75  >zCteErr = "recu
25c30 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
25c40 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25  in a subquery: %
25c50 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s";.      }.    
25c60 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
25c70 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
25c80 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  l);.    }.    pC
25c90 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b  te->zCteErr = 0;
25ca0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
25cb0 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
25cc0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
25cd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
25ce0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
25cf0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
25d00 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
25d10 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
25d20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61  cond argument ha
25d30 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20  s an associated 
25d40 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c  WITH .** clause,
25d50 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65   pop it from the
25d60 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73   stack stored as
25d70 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72   part of the Par
25d80 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  se object..**.**
25d90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25da0 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53  s used as the xS
25db0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29  electCallback2()
25dc0 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20   callback by.** 
25dd0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
25de0 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69  and() when walki
25df0 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65  ng a SELECT tree
25e00 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c   to resolve tabl
25e10 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f  e.** names and o
25e20 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
25e30 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73   elements. .*/.s
25e40 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
25e50 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20  tPopWith(Walker 
25e60 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
25e70 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
25e80 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
25e90 3e 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70  >pParse;.  if( p
25ea0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 26 26 20  Parse->pWith && 
25eb0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  p->pPrior==0 ){.
25ec0 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68 20      With *pWith 
25ed0 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28  = findRightmost(
25ee0 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69  p)->pWith;.    i
25ef0 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20  f( pWith!=0 ){. 
25f00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
25f10 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74  rse->pWith==pWit
25f20 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  h );.      pPars
25f30 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
25f40 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a  ->pOuter;.    }.
25f50 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
25f60 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74  ine selectPopWit
25f70 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  h 0.#endif../*.*
25f80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25f90 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  s a Walker callb
25fa0 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69  ack for "expandi
25fb0 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ng" a SELECT sta
25fc0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61  tement..** "Expa
25fd0 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20  nding" means to 
25fe0 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
25ff0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
26000 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
26010 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
26020 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
26030 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
26040 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
26050 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
26060 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
26070 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
26080 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
26090 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
260a0 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
260b0 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
260c0 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
260d0 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
260e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
260f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
26100 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
26110 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
26120 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
26130 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
26140 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
26150 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
26160 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
26170 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
26180 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
26190 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
261a0 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
261b0 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
261c0 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
261d0 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
261e0 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
261f0 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
26200 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72   persistent repr
26210 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
26220 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
26230 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
26240 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
26250 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26260 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68  o accommodate th
26270 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
26280 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
26290 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
262a0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
262b0 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
262c0 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
262d0 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
262e0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
262f0 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
26300 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
26310 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
26320 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
26330 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
26340 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
26350 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
26360 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
26370 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
26380 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
26390 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
263a0 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
263b0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
263c0 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
263d0 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
263e0 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
263f0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
26400 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
26410 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
26420 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
26430 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
26440 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
26450 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
26460 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
26470 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
26480 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
26490 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
264a0 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70  *pE, *pRight, *p
264b0 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46  Expr;.  u16 selF
264c0 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
264d0 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  gs;..  p->selFla
264e0 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
264f0 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  d;.  if( db->mal
26500 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
26510 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
26520 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45  rt;.  }.  if( NE
26530 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20  VER(p->pSrc==0) 
26540 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53  || (selFlags & S
26550 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
26560 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
26570 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54  _Prune;.  }.  pT
26580 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
26590 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
265a0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 2d  pEList;.  if( p-
265b0 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71  >pWith ){.    sq
265c0 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50  lite3WithPush(pP
265d0 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20  arse, p->pWith, 
265e0 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  0);.  }..  /* Ma
265f0 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
26600 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
26610 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
26620 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
26630 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
26640 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
26650 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
26660 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
26670 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
26680 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
26690 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
266a0 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
266b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
266c0 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
266d0 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
266e0 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
266f0 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
26700 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
26710 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
26720 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
26730 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
26740 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
26750 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
26760 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
26770 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
26780 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
26790 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
267a0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
267b0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
267c0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
267d0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d  fg.isRecursive==
267e0 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  0 || pFrom->pTab
267f0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
26800 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
26810 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sive ) continue;
26820 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
26830 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23  om->pTab==0 );.#
26840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26850 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77  IT_CTE.    if( w
26860 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65  ithExpand(pWalke
26870 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75  r, pFrom) ) retu
26880 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26890 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
268a0 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64  b ) {} else.#end
268b0 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  if.    if( pFrom
268c0 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
268d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
268e0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
268f0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
26900 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
26910 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
26920 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
26930 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
26940 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
26950 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a  ert( pSel!=0 );.
26960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
26970 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
26980 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26990 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
269a0 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74  ker, pSel) ) ret
269b0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
269c0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
269d0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
269e0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
269f0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
26a00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
26a10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
26a20 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
26a30 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
26a40 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
26a50 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
26a60 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
26a70 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
26a80 70 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c  p(db, pFrom->zAl
26a90 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ias);.      }els
26aa0 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e{.        pTab-
26ab0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
26ac0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 75 62  MPrintf(db, "sub
26ad0 71 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69 64  query_%p", (void
26ae0 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  *)pTab);.      }
26af0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
26b00 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
26b10 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
26b20 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  r; }.      sqlit
26b30 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
26b40 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
26b50 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62  el->pEList,&pTab
26b60 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43  ->nCol,&pTab->aC
26b70 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
26b80 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
26b90 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
26ba0 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
26bb0 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
26bc0 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
26bd0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
26be0 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
26bf0 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20  emeral;.#endif. 
26c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26c10 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
26c20 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
26c30 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
26c40 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
26c50 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
26c60 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
26c70 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
26c80 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
26c90 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
26ca0 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
26cb0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
26cc0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26cd0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
26ce0 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66  b->nTabRef>=0xff
26cf0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
26d00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
26d10 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
26d20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
26d30 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
26d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
26d50 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
26d60 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
26d70 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
26d80 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26d90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
26da0 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20  ->nTabRef++;.   
26db0 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61     if( !IsVirtua
26dc0 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f  l(pTab) && canno
26dd0 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
26de0 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
26df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
26e00 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
26e10 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
26e20 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
26e30 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
26e40 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
26e50 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
26e60 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
26e70 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
26e80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20   ){.        i16 
26e90 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  nCol;.        if
26ea0 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
26eb0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
26ec0 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
26ed0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
26ef0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
26f00 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
26f10 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
26f20 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
26f30 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
26f40 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
26f50 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
26f60 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pFrom->pSelect,
26f70 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
26f80 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54         nCol = pT
26f90 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
26fa0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d    pTab->nCol = -
26fb0 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
26fc0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
26fd0 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
26fe0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  lect);.        p
26ff0 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Tab->nCol = nCol
27000 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
27010 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
27020 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
27030 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
27040 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
27050 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
27060 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
27070 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
27080 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
27090 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
270a0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
270b0 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
270c0 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
270d0 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
270e0 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
270f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
27100 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
27110 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
27120 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
27130 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
27140 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
27150 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
27160 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
27170 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
27180 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
27190 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
271a0 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
271b0 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
271c0 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
271d0 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
271e0 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
271f0 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
27200 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
27210 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
27220 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
27230 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72  TK_ASTERISK oper
27240 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
27250 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
27260 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  in the column.  
27270 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f  ** list.  The fo
27280 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
27290 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
272a0 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a  the TK_ASTERISK.
272b0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
272c0 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68   and expand each
272d0 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
272e0 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
272f0 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c  in.  ** all tabl
27300 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
27310 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
27320 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
27330 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
27340 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
27350 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
27360 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
27370 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
27380 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
27390 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
273a0 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
273b0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
273c0 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b  ASTERISK ) break
273d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
273e0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
273f0 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pE->pRight!=0 );
27400 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
27410 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28  >op!=TK_DOT || (
27420 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20  pE->pLeft!=0 && 
27430 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
27440 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28  K_ID) );.    if(
27450 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
27460 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
27470 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29  p==TK_ASTERISK )
27480 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
27490 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
274a0 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
274b0 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
274c0 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
274d0 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
274e0 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
274f0 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
27500 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
27510 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
27520 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
27530 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
27540 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
27550 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
27560 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
27570 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
27580 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
27590 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
275a0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
275b0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
275c0 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
275d0 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
275e0 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
275f0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
27600 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
27610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27620 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
27630 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
27640 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
27650 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
27660 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
27670 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b  {.      pE = a[k
27680 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ].pExpr;.      p
27690 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
276a0 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
276b0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
276c0 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
276d0 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
276e0 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  p!=TK_ASTERISK. 
276f0 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70        && (pE->op
27700 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
27710 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  ht->op!=TK_ASTER
27720 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ISK).      ){.  
27730 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
27740 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
27750 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
27760 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
27770 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27780 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
27790 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
277a0 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
277b0 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
277c0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
277d0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
277e0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
277f0 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
27800 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
27810 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
27820 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
27830 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
27840 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
27850 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
27860 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
27870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27880 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
27890 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
278a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
278b0 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
278c0 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
278d0 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
278e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
278f0 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
27900 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
27910 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
27920 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
27930 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
27940 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
27950 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
27960 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
27970 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
27980 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
27990 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
279a0 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
279b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
279c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
279d0 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
279e0 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
279f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
27a00 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
27a10 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
27a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
27a30 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
27a40 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
27a50 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
27a60 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
27a70 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
27a80 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
27a90 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
27aa0 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
27ab0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
27ac0 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
27ad0 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
27ae0 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
27af0 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
27b00 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
27b10 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
27b20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
27b30 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
27b40 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
27b50 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
27b60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27b70 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
27b80 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
27b90 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
27ba0 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
27bb0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
27bc0 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
27bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
27be0 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
27bf0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
27c00 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
27c10 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
27c20 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
27c30 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
27c40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
27c50 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
27c60 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
27c70 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
27c80 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
27c90 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
27ca0 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
27cb0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
27cc0 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
27cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27ce0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
27cf0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
27d00 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
27d10 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
27d20 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
27d30 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
27d40 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
27d50 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
27d60 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
27d70 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
27d80 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
27d90 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
27da0 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
27db0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
27dc0 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
27dd0 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
27de0 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
27df0 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
27e00 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
27e10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
27e20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
27e30 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
27e40 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
27e50 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
27e60 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
27e70 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
27e80 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
27e90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27ea0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27eb0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
27ec0 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
27ed0 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
27ee0 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20   'hidden', omit 
27ef0 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61  it from the expa
27f00 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
27f10 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
27f20 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53  ist unless the S
27f30 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46  ELECT has the SF
27f40 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20  _IncludeHidden. 
27f50 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69             ** bi
27f60 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20  t set..         
27f70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
27f80 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
27f90 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48  gs & SF_IncludeH
27fa0 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20  idden)==0.      
27fb0 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64         && IsHidd
27fc0 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
27fd0 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20  aCol[j]) .      
27fe0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27ff0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
28000 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28010 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
28020 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
28030 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
28040 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
28060 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pFrom->fg.join
28070 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
28080 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
28090 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
280a0 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
280b0 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
280c0 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
280d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
280e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
280f0 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
28100 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
28110 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
28130 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
28140 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
28150 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
28160 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
28170 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28180 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
28190 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
281a0 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
281b0 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
281d0 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
281e0 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
281f0 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
28200 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
28210 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
28220 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
28230 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
28240 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28250 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28260 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28270 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28280 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
28290 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
282a0 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
282b0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
282c0 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
282d0 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
282e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
282f0 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
28300 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
28310 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
28320 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
28330 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
28340 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
28350 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
28360 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
28370 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
28380 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
28390 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
283a0 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
283b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
283c0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
283e0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
283f0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
28400 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
28410 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
28420 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
28430 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
28440 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a   pLeft, pExpr);.
28450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
28460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
28470 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
28490 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
284a0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
284b0 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
284c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
284d0 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
284e0 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
284f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28500 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
28520 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
28530 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28540 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
28550 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
28560 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
28570 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
28580 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
28590 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65  enInit(&sColname
285a0 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
285b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
285c0 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
285d0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
285e0 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
285f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
28600 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
28610 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
28620 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
28630 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
28640 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
28650 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
28660 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
28670 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
28680 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
28690 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
286a0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
286b0 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
286c0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286e0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
286f0 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
28700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28720 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
28730 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
28740 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
28780 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
28790 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
287a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
287b0 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
287c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
287d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
287e0 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
287f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
28800 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28810 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
28820 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
28830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28840 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
28850 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
28860 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
28870 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28880 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28890 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
288a0 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
288b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
288c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
288d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
288e0 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
288f0 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
28900 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28910 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28920 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
28930 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
28940 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
28950 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
28960 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
28970 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
28980 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
28990 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
289a0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
289b0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
289c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
289d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
289e0 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
289f0 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
28a00 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
28a10 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  Abort;.  }.#endi
28a20 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  f.  return WRC_C
28a30 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
28a40 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
28a50 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
28a60 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a  ee walker..**.**
28a70 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
28a80 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72  ne is the Walker
28a90 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
28aa0 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  hen expression t
28ab0 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b  rees.** are walk
28ac0 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61  ed without any a
28ad0 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b  ctions being tak
28ae0 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e  en at each node.
28af0 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a    Presumably,.**
28b00 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
28b10 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57  ne is used for W
28b20 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
28b30 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c  ack then .** Wal
28b40 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
28b50 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f  ack is set to do
28b60 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75   something usefu
28b70 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20  l for every .** 
28b80 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
28b90 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
28ba0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 57  int sqlite3ExprW
28bb0 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
28bc0 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e  NotUsed, Expr *N
28bd0 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
28be0 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
28bf0 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
28c00 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
28c10 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
28c20 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
28c30 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
28c40 65 65 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45  ee walker for SE
28c50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
28c60 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20  .** subquery in 
28c70 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e  the parser tree.
28c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
28c90 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61  electWalkNoop(Wa
28ca0 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53  lker *NotUsed, S
28cb0 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29  elect *NotUsed2)
28cc0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
28cd0 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
28ce0 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
28cf0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28d00 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
28d10 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79  EBUG./*.** Alway
28d20 73 20 61 73 73 65 72 74 2e 20 20 54 68 69 73 20  s assert.  This 
28d30 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
28d40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28d50 70 72 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a  proves that the.
28d60 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  ** xSelectCallba
28d70 63 6b 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76  ck2 is never inv
28d80 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oked..*/.void sq
28d90 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41  lite3SelectWalkA
28da0 73 73 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e  ssert2(Walker *N
28db0 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a  otUsed, Select *
28dc0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
28dd0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
28de0 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
28df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  );.  assert( 0 )
28e00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a  ;.}.#endif./*.**
28e10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65   This routine "e
28e20 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54  xpands" a SELECT
28e30 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61   statement and a
28e40 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65  ll of its subque
28e50 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64  ries..** For add
28e60 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
28e70 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d  ion on what it m
28e80 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22  eans to "expand"
28e90 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61   a SELECT.** sta
28ea0 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20  tement, see the 
28eb0 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73  comment on the s
28ec0 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b  electExpand work
28ed0 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76  er callback abov
28ee0 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69  e..**.** Expandi
28ef0 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ng a SELECT stat
28f00 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ement is the fir
28f10 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65  st step in proce
28f20 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43  ssing a.** SELEC
28f30 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
28f40 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
28f50 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e  nt must be expan
28f60 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61  ded before.** na
28f70 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  me resolution is
28f80 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a   performed..**.*
28f90 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
28fa0 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72  es wrong, an err
28fb0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
28fc0 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73  itten into pPars
28fd0 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  e..** The callin
28fe0 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64  g function can d
28ff0 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65  etect the proble
29000 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  m by looking at 
29010 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20  pParse->nErr.** 
29020 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64  and/or pParse->d
29030 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
29040 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29050 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
29060 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  and(Parse *pPars
29070 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
29080 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ct){.  Walker w;
29090 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
290a0 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
290b0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
290c0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
290d0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73   if( pParse->has
290e0 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20  Compound ){.    
290f0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
29100 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  k = convertCompo
29110 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
29120 65 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65  ery;.    w.xSele
29130 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
29140 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
29150 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
29160 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65  ct);.  }.  w.xSe
29170 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
29180 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
29190 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
291a0 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57  ck2 = selectPopW
291b0 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ith;.  sqlite3Wa
291c0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
291d0 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  lect);.}...#ifnd
291e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
291f0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
29200 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78  is is a Walker.x
29210 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63  SelectCallback c
29220 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
29230 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70  sqlite3SelectTyp
29240 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72  eInfo().** inter
29250 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  face..**.** For 
29260 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65  each FROM-clause
29270 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43   subquery, add C
29280 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20  olumn.zType and 
29290 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20  Column.zColl.** 
292a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
292b0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
292c0 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
292d0 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
292e0 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62  t.** of that sub
292f0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
29300 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
29310 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
29320 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
29330 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
29340 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61  ** by selectExpa
29350 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74  nder() but the t
29360 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
29370 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61  n information wa
29380 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20  s omitted.** at 
29390 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75  that point becau
293a0 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68  se identifiers h
293b0 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ad not yet been 
293c0 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a  resolved.  This.
293d0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
293e0 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74  lled after ident
293f0 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e  ifier resolution
29400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29410 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
29420 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
29430 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
29440 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
29450 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
29460 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
29470 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
29480 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
29490 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
294a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
294b0 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61  _Resolved );.  a
294c0 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
294d0 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
294e0 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  Info)==0 );.  p-
294f0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
29500 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70  HasTypeInfo;.  p
29510 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
29520 3e 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c  >pParse;.  pTabL
29530 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
29540 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
29550 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
29560 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
29570 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
29580 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
29590 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
295a0 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
295b0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61   );.    if( (pTa
295c0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
295d0 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29  _Ephemeral)!=0 )
295e0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  {.      /* A sub
295f0 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
29600 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
29610 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53  ELECT */.      S
29620 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
29630 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
29640 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a      if( pSel ){.
29650 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
29660 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  Sel->pPrior ) pS
29670 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
29680 72 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  r;.        sqlit
29690 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
296a0 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
296b0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
296c0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSel);.      }. 
296d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
296e0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
296f0 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
29700 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
29710 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
29720 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
29730 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
29740 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
29750 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
29760 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
29770 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
29780 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
29790 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
297a0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
297b0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
297c0 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
297d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
297e0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
297f0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
29800 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
29810 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
29820 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
29830 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
29840 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
29850 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
29860 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
29870 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
29880 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
29890 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
298a0 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
298b0 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
298c0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
298d0 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
298e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
298f0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
29900 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
29910 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
29920 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
29930 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
29940 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
29950 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
29960 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
29970 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
29980 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
29990 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
299a0 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
299b0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
299c0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
299d0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
299e0 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
299f0 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
29a00 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
29a10 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
29a20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
29a30 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
29a40 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
29a50 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
29a60 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
29a70 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
29a80 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
29a90 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
29aa0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
29ab0 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
29ac0 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
29ad0 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
29ae0 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
29af0 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
29b00 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
29b10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
29b20 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
29b30 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
29b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29b50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29b60 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
29b70 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
29b80 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
29b90 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
29ba0 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
29bb0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
29bc0 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
29bd0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
29be0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
29bf0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
29c00 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
29c10 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
29c20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
29c30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
29c40 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
29c50 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
29c60 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
29c70 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
29c80 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
29c90 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
29ca0 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
29cb0 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
29cc0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
29cd0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
29ce0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
29cf0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
29d00 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
29d10 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
29d20 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
29d30 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
29d40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
29d50 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
29d60 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
29d70 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
29d80 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
29d90 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
29da0 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
29db0 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
29dc0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
29dd0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
29de0 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
29df0 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
29e00 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
29e10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
29e20 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
29e30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
29e40 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
29e50 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
29e60 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
29e70 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
29e80 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
29e90 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
29ea0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
29eb0 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
29ec0 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
29ed0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
29ee0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
29ef0 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
29f00 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
29f10 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
29f20 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
29f30 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
29f40 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
29f50 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
29f60 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
29f70 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
29f80 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
29f90 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
29fa0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
29fb0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
29fc0 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
29fd0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
29fe0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
29ff0 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2a000 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2a010 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2a020 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
2a030 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2a040 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
2a050 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2a060 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2a070 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2a080 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2a090 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2a0a0 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2a0b0 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2a0c0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2a0d0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2a0e0 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
2a0f0 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
2a100 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
2a110 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
2a120 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
2a130 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2a140 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
2a150 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
2a160 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
2a170 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2a180 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
2a190 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2a1a0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2a1b0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2a1c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
2a1d0 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
2a1e0 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
2a1f0 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
2a200 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2a210 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2a220 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
2a230 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
2a240 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
2a250 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
2a260 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
2a270 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2a280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a290 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2a2a0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2a2b0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2a2c0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c   pE->x.pList, 0,
2a2d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
2a2e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2a2f0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2a300 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
2a310 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
2a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a330 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
2a340 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2a350 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
2a360 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
2a370 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
2a380 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
2a390 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
2a3a0 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
2a3b0 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
2a3c0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2a3d0 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
2a3e0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
2a3f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2a400 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2a410 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2a420 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2a430 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2a440 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
2a450 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
2a460 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
2a470 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2a480 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
2a490 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
2a4a0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
2a4b0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
2a4c0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a4d0 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
2a4e0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2a4f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a500 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
2a510 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
2a520 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
2a530 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
2a540 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
2a550 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
2a560 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
2a570 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
2a580 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
2a590 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
2a5a0 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
2a5b0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
2a5c0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2a5d0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
2a5e0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
2a5f0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2a600 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
2a610 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
2a620 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2a630 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2a640 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
2a650 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
2a660 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
2a670 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2a680 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
2a690 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
2a6a0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
2a6b0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
2a6c0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
2a6d0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
2a6e0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2a6f0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
2a700 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
2a710 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
2a720 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
2a730 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2a740 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
2a750 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
2a760 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2a770 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
2a780 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2a790 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
2a7a0 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
2a7b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
2a7c0 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
2a7d0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2a7e0 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
2a7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a800 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2a810 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
2a820 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45  Agg, 0, SQLITE_E
2a830 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
2a840 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
2a850 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
2a860 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
2a870 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
2a880 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
2a890 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
2a8a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2a8b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2a8c0 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f  e( nArg==0 );  /
2a8d0 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  * Error conditio
2a8e0 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  n */.      testc
2a8f0 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20  ase( nArg>1 );  
2a900 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f   /* Also an erro
2a910 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44  r */.      codeD
2a920 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
2a930 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
2a940 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
2a950 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
2a960 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
2a970 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
2a980 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
2a990 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
2a9a0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
2a9b0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2a9c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2a9d0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
2a9e0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
2a9f0 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
2aa00 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
2aa10 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
2aa20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
2aa30 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
2aa40 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
2aa50 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
2aa60 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2aa70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2aa80 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
2aa90 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
2aaa0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
2aab0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
2aac0 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
2aad0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2aae0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2aaf0 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
2ab00 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2ab10 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
2ab20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ab30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ab40 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
2ab50 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
2ab60 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
2ab70 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
2ab80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ab90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2aba0 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65  _AggStep0, 0, re
2abb0 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2abc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2abd0 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2abe0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2abf0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2ac00 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2ac10 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2ac20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
2ac30 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
2ac40 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2ac50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
2ac60 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2ac70 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2ac80 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
2ac90 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
2aca0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2acb0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2acc0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
2acd0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2ace0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2acf0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
2ad00 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
2ad10 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
2ad20 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
2ad30 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
2ad40 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
2ad50 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
2ad60 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
2ad70 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
2ad80 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
2ad90 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
2ada0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
2adb0 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
2adc0 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
2add0 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
2ade0 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
2adf0 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
2ae00 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
2ae10 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
2ae20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
2ae30 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
2ae40 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
2ae50 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
2ae60 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
2ae70 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
2ae80 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
2ae90 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
2aea0 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
2aeb0 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
2aec0 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
2aed0 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
2aee0 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
2aef0 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
2af00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
2af10 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
2af20 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
2af30 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2af40 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
2af50 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2af60 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
2af70 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2af80 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
2af90 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
2afa0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
2afb0 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
2afc0 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
2afd0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2afe0 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
2aff0 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
2b000 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2b010 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
2b020 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2b030 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
2b040 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
2b050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2b060 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
2b070 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
2b080 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
2b090 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
2b0a0 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
2b0b0 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
2b0c0 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
2b0d0 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
2b0e0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2b0f0 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
2b100 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b110 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
2b120 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
2b130 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
2b140 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2b150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b160 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
2b170 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b190 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2b1a0 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
2b1b0 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b1d0 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
2b1e0 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
2b1f0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
2b200 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
2b210 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
2b220 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
2b230 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
2b240 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
2b250 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
2b260 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ));.    char *zE
2b270 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
2b280 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
2b290 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
2b2a0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
2b2b0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
2b2c0 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
2b2d0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
2b2e0 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
2b2f0 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
2b300 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
2b310 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2b320 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
2b330 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
2b340 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
2b350 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2b360 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
2b370 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
2b380 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
2b390 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
2b3a0 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
2b3b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  dif../*.** Conte
2b3c0 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 68 61  xt object for ha
2b3d0 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43  vingToWhereExprC
2b3e0 62 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 48  b()..*/.struct H
2b3f0 61 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20  avingToWhereCtx 
2b400 7b 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65  {.  Expr **ppWhe
2b410 72 65 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  re;.  ExprList *
2b420 70 47 72 6f 75 70 42 79 3b 0a 7d 3b 0a 0a 2f 2a  pGroupBy;.};../*
2b430 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
2b440 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
2b450 73 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57  sed by havingToW
2b460 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  here()..**.** If
2b470 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64   the node passed
2b480 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
2b490 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64   is a TK_AND nod
2b4a0 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52  e, return .** WR
2b4b0 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65  C_Continue to te
2b4c0 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ll sqlite3WalkEx
2b4d0 70 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20  pr() to iterate 
2b4e0 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f  through child no
2b4f0 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  des..**.** Other
2b500 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43  wise, return WRC
2b510 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20  _Prune. In this 
2b520 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b  case, also check
2b530 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
2b540 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68  expression match
2b550 65 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20  es the criteria 
2b560 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  for being moved 
2b570 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
2b580 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61  clause. If so, a
2b590 64 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45  dd it to the WHE
2b5a0 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65  RE clause and re
2b5b0 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78  place the sub-ex
2b5c0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68  pression.** with
2b5d0 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  in the HAVING ex
2b5e0 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20  pression with a 
2b5f0 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f  constant "1"..*/
2b600 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69  .static int havi
2b610 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28  ngToWhereExprCb(
2b620 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2b630 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2b640 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
2b650 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 73 74  TK_AND ){.    st
2b660 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68 65  ruct HavingToWhe
2b670 72 65 43 74 78 20 2a 70 20 3d 20 70 57 61 6c 6b  reCtx *p = pWalk
2b680 65 72 2d 3e 75 2e 70 48 61 76 69 6e 67 43 74 78  er->u.pHavingCtx
2b690 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2b6a0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
2b6b0 72 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72  rGroupBy(pWalker
2b6c0 2d 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  ->pParse, pExpr,
2b6d0 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b   p->pGroupBy) ){
2b6e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
2b6f0 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  db = pWalker->pP
2b700 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
2b710 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
2b720 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
2b730 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
2b740 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
2b750 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
2b760 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
2b770 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d    Expr *pWhere =
2b780 20 2a 28 70 2d 3e 70 70 57 68 65 72 65 29 3b 0a   *(p->ppWhere);.
2b790 20 20 20 20 20 20 20 20 53 57 41 50 28 45 78 70          SWAP(Exp
2b7a0 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72  r, *pNew, *pExpr
2b7b0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  );.        pNew 
2b7c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2b7d0 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 4e 65  (db, pWhere, pNe
2b7e0 77 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 70 2d  w);.        *(p-
2b7f0 3e 70 70 57 68 65 72 65 29 20 3d 20 70 4e 65 77  >ppWhere) = pNew
2b800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b810 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2b820 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rune;.  }.  retu
2b830 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2b840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
2b850 65 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d  er eligible term
2b860 73 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e  s from the HAVIN
2b870 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75  G clause of a qu
2b880 65 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a  ery, which is.**
2b890 20 70 72 6f 63 65 73 73 65 64 20 61 66 74 65 72   processed after
2b8a0 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68   grouping, to th
2b8b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
2b8c0 77 68 69 63 68 20 69 73 20 70 72 6f 63 65 73 73  which is process
2b8d0 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f  ed before.** gro
2b8e0 75 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70  uping. For examp
2b8f0 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a  le, the query:.*
2b900 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
2b910 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48  FROM <tables> WH
2b920 45 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59  ERE a=? GROUP BY
2b930 20 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e   b HAVING b=? AN
2b940 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20  D c=?.**.** can 
2b950 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a  be rewritten as:
2b960 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
2b970 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20  * FROM <tables> 
2b980 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d  WHERE a=? AND b=
2b990 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56  ? GROUP BY b HAV
2b9a0 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20  ING c=?.**.** A 
2b9b0 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49  term of the HAVI
2b9c0 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  NG expression is
2b9d0 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72   eligible for tr
2b9e0 61 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e  ansfer if it con
2b9f0 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c  sists.** entirel
2ba00 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61  y of constants a
2ba10 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  nd expressions t
2ba20 68 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f  hat are also GRO
2ba30 55 50 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  UP BY terms that
2ba40 0a 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e  .** use the "BIN
2ba50 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ARY" collation s
2ba60 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
2ba70 69 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f  ic void havingTo
2ba80 57 68 65 72 65 28 0a 20 20 50 61 72 73 65 20 2a  Where(.  Parse *
2ba90 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
2baa0 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 0a 20 20  st *pGroupBy,.  
2bab0 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 0a  Expr *pHaving, .
2bac0 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2bad0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 48 61 76  .){.  struct Hav
2bae0 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20 73 43  ingToWhereCtx sC
2baf0 74 78 3b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  tx;.  Walker sWa
2bb00 6c 6b 65 72 3b 0a 0a 20 20 73 43 74 78 2e 70 70  lker;..  sCtx.pp
2bb10 57 68 65 72 65 20 3d 20 70 70 57 68 65 72 65 3b  Where = ppWhere;
2bb20 0a 20 20 73 43 74 78 2e 70 47 72 6f 75 70 42 79  .  sCtx.pGroupBy
2bb30 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 0a 20 20   = pGroupBy;..  
2bb40 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c  memset(&sWalker,
2bb50 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b   0, sizeof(sWalk
2bb60 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  er));.  sWalker.
2bb70 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2bb80 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72  .  sWalker.xExpr
2bb90 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e  Callback = havin
2bba0 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a  gToWhereExprCb;.
2bbb0 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 48 61 76    sWalker.u.pHav
2bbc0 69 6e 67 43 74 78 20 3d 20 26 73 43 74 78 3b 0a  ingCtx = &sCtx;.
2bbd0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2bbe0 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 48 61 76  r(&sWalker, pHav
2bbf0 69 6e 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ing);.}../*.** C
2bc00 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2bc10 68 65 20 70 54 68 69 73 20 65 6e 74 72 79 20 6f  he pThis entry o
2bc20 66 20 70 54 61 62 4c 69 73 74 20 69 73 20 61 20  f pTabList is a 
2bc30 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70  self-join of a p
2bc40 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66  rior view..** If
2bc50 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72 65 74   it is, then ret
2bc60 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73 74 5f  urn the SrcList_
2bc70 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70 72 69  item for the pri
2bc80 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69 74 20  or view.  If it 
2bc90 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20  is not,.** then 
2bca0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
2bcb0 74 69 63 20 73 74 72 75 63 74 20 53 72 63 4c 69  tic struct SrcLi
2bcc0 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a  st_item *isSelfJ
2bcd0 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63 4c 69  oinView(.  SrcLi
2bce0 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
2bcf0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
2bd00 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73  h for self-joins
2bd10 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20 63 6c   in this FROM cl
2bd20 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
2bd30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2bd40 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72 63 68  This   /* Search
2bd50 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66 65 72   for prior refer
2bd60 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73 75 62  ence to this sub
2bd70 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74  query */.){.  st
2bd80 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2bd90 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28  m *pItem;.  for(
2bda0 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74  pItem = pTabList
2bdb0 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68 69 73  ->a; pItem<pThis
2bdc0 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  ; pItem++){.    
2bdd0 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
2bde0 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ct==0 ) continue
2bdf0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
2be00 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2be10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2be20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
2be30 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
2be40 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2be50 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e  _stricmp(pItem->
2be60 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68 69 73  zDatabase, pThis
2be70 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d 30 20  ->zDatabase)!=0 
2be80 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2be90 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2bea0 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  cmp(pItem->zName
2beb0 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21  , pThis->zName)!
2bec0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2bed0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2bee0 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a 20 20  prCompare(0, .  
2bef0 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70          pThis->p
2bf00 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20  Select->pWhere, 
2bf10 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
2bf20 70 57 68 65 72 65 2c 20 2d 31 29 20 0a 20 20 20  pWhere, -1) .   
2bf30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2bf40 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69   view was modifi
2bf50 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72  ed by some other
2bf60 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75   optimization su
2bf70 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70  ch as.      ** p
2bf80 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
2bf90 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  s() */.      con
2bfa0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
2bfb0 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20   return pItem;. 
2bfc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2bfd0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2bfe0 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49  COUNTOFVIEW_OPTI
2bff0 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41  MIZATION./*.** A
2c000 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 66  ttempt to transf
2c010 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66 20 74  orm a query of t
2c020 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
2c030 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
2c040 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
2c050 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c  FROM t1 UNION AL
2c060 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20  L SELECT y FROM 
2c070 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74  t2).**.** Into t
2c080 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2c090 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 75  LECT (SELECT cou
2c0a0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28  nt(*) FROM t1)+(
2c0b0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2c0c0 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54  FROM t2).**.** T
2c0d0 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  he transformatio
2c0e0 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  n only works if 
2c0f0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
2c100 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
2c110 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75  *.**   *  The su
2c120 62 71 75 65 72 79 20 69 73 20 61 20 55 4e 49 4f  bquery is a UNIO
2c130 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20  N ALL of two or 
2c140 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20  more terms.**   
2c150 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57  *  There is no W
2c160 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59  HERE or GROUP BY
2c170 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73   or HAVING claus
2c180 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65  es on the subque
2c190 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65  ries.**   *  The
2c1a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
2c1b0 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a  a simple count(*
2c1c0 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ).**.** Return T
2c1d0 52 55 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d  RUE if the optim
2c1e0 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72  ization is under
2c1f0 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  taken..*/.static
2c200 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77   int countOfView
2c210 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72  Optimization(Par
2c220 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
2c230 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
2c240 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b   *pSub, *pPrior;
2c250 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
2c260 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a    Expr *pCount;.
2c270 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2c280 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
2c290 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2c2a0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
2c2b0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
2c2c0 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
2c2d0 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
2c2e0 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
2c2f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2c300 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75    /* Single resu
2c310 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70  lt column */.  p
2c320 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
2c330 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
2c340 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
2c350 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
2c360 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2c370 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61    /* Result is a
2c380 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
2c390 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2c3a0 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  icmp(pExpr->u.zT
2c3b0 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20  oken,"count") ) 
2c3c0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73  return 0;  /* Is
2c3d0 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66   count() */.  if
2c3e0 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
2c3f0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=0 ) return 0; 
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c410 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74  /* Must be count
2c420 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  (*) */.  if( p->
2c430 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
2c440 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2c450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2c460 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20  e table in FROM 
2c470 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   */.  pSub = p->
2c480 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
2c490 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d  ct;.  if( pSub==
2c4a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
2c4d0 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72  ROM is a subquer
2c4e0 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  y */.  if( pSub-
2c4f0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
2c500 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2c510 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
2c520 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72   be a compound r
2c530 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69  y */.  do{.    i
2c540 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f  f( pSub->op!=TK_
2c550 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72  ALL && pSub->pPr
2c560 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
2c570 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f   /* Must be UNIO
2c580 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28  N ALL */.    if(
2c590 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20   pSub->pWhere ) 
2c5a0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c5c0 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  * No WHERE claus
2c5d0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  e */.    if( pSu
2c5e0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2c5f0 5f 41 67 67 72 65 67 61 74 65 20 29 20 72 65 74  _Aggregate ) ret
2c600 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f  urn 0;     /* No
2c610 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  t an aggregate *
2c620 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53 75  /.    pSub = pSu
2c630 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20 20  b->pPrior;      
2c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c650 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65 61          /* Repea
2c660 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20  t over compound 
2c670 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53 75  */.  }while( pSu
2c680 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  b );..  /* If we
2c690 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
2c6a0 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20  t then it is OK 
2c6b0 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74  to perform the t
2c6c0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  ransformation */
2c6d0 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
2c6e0 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20  >db;.  pCount = 
2c6f0 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d  pExpr;.  pExpr =
2c700 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   0;.  pSub = p->
2c710 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
2c720 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61  ct;.  p->pSrc->a
2c730 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b  [0].pSelect = 0;
2c740 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
2c750 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
2c760 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20  Src);.  p->pSrc 
2c770 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2c780 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
2c790 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72  , sizeof(*p->pSr
2c7a0 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  c));.  while( pS
2c7b0 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  ub ){.    Expr *
2c7c0 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f  pTerm;.    pPrio
2c7d0 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  r = pSub->pPrior
2c7e0 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69  ;.    pSub->pPri
2c7f0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  or = 0;.    pSub
2c800 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
2c810 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
2c820 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
2c830 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c  .    pSub->selFl
2c840 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
2c850 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e  und;.    pSub->n
2c860 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
2c870 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2c880 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  stDelete(db, pSu
2c890 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
2c8a0 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f  pTerm = pPrior ?
2c8b0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
2c8c0 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a  db, pCount, 0) :
2c8d0 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75   pCount;.    pSu
2c8e0 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  b->pEList = sqli
2c8f0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2c900 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65  d(pParse, 0, pTe
2c910 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
2c920 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2c930 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c  arse, TK_SELECT,
2c940 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
2c950 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
2c960 74 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  t(pParse, pTerm,
2c970 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20   pSub);.    if( 
2c980 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
2c990 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 3b    pExpr = pTerm;
2c9a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c9b0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
2c9c0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2c9d0 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70  K_PLUS, pTerm, p
2c9e0 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
2c9f0 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a   pSub = pPrior;.
2ca00 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d    }.  p->pEList-
2ca10 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45  >a[0].pExpr = pE
2ca20 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  xpr;.  p->selFla
2ca30 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67  gs &= ~SF_Aggreg
2ca40 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  ate;..#if SELECT
2ca50 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2ca60 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2ca70 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
2ca80 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2ca90 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
2caa0 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f  ,("After count-o
2cab0 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74  f-view optimizat
2cac0 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ion:\n"));.    s
2cad0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2cae0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2caf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2cb00 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
2cb10 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  * SQLITE_COUNTOF
2cb20 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
2cb30 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  N */../*.** Gene
2cb40 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
2cb50 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2cb60 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
2cb70 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
2cb80 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
2cb90 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63  are returned acc
2cba0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65  ording to the Se
2cbb0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
2cbc0 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  re..** See comme
2cbd0 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  nts in sqliteInt
2cbe0 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69  .h for further i
2cbf0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
2cc00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2cc10 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
2cc20 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
2cc30 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
2cc40 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
2cc50 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
2cc60 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
2cc70 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
2cc80 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2cc90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2cca0 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
2ccb0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
2ccc0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
2ccd0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
2cce0 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
2ccf0 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
2cd00 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
2cd10 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
2cd20 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
2cd30 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2cd40 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2cd50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2cd60 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2cd70 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
2cd80 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
2cd90 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
2cda0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
2cdb0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
2cdc0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
2cdd0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2cde0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2cdf0 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
2ce00 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
2ce10 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
2ce20 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2ce30 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ce50 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
2ce60 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
2ce70 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
2ce80 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
2ce90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2cea0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
2ceb0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
2cec0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
2ced0 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73  ist = 0;  /* Lis
2cee0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
2cef0 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
2cf00 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
2cf10 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
2cf20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
2cf30 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
2cf40 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
2cf50 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2cf60 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2cf70 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
2cf80 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
2cf90 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
2cfa0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
2cfb0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
2cfc0 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
2cfd0 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
2cfe0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2cff0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ULL */.  int rc 
2d000 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2d010 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
2d020 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
2d030 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69  ction */.  Disti
2d040 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74  nctCtx sDistinct
2d050 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77  ; /* Info on how
2d060 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53   to code the DIS
2d070 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f  TINCT keyword */
2d080 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74  .  SortCtx sSort
2d090 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  ;         /* Inf
2d0a0 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
2d0b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2d0c0 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66  ause */.  AggInf
2d0d0 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
2d0e0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
2d0f0 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
2d100 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
2d110 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
2d120 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
2d130 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
2d140 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
2d150 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
2d160 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2d170 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2d180 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2d190 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
2d1a0 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65    int iRestoreSe
2d1b0 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
2d1c0 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50  >iSelectId;.  pP
2d1d0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20  arse->iSelectId 
2d1e0 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  = pParse->iNextS
2d1f0 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69  electId++;.#endi
2d200 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
2d210 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
2d220 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
2d230 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
2d240 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
2d250 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2d260 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
2d270 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
2d280 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
2d290 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
2d2a0 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
2d2b0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
2d2c0 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43  nfo));.#if SELEC
2d2d0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2d2e0 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
2d2f0 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45  Indent++;.  SELE
2d300 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
2d310 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63  ,p, ("begin proc
2d320 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20  essing:\n"));.  
2d330 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2d340 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2d350 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
2d360 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2d370 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2d380 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
2d390 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2d3a0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2d3b0 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73  DistFifo );.  as
2d3c0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
2d3d0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
2d3e0 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29  Dest!=SRT_Fifo )
2d3f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2d400 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2d410 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2d420 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61  DistQueue );.  a
2d430 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2d440 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2d450 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65  eDest!=SRT_Queue
2d460 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   );.  if( Ignora
2d470 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
2d480 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
2d490 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2d4a0 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
2d4b0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
2d4c0 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
2d4d0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
2d4e0 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
2d4f0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d500 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20  _Discard ||.    
2d510 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2d520 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20  est==SRT_Queue  
2d530 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2d540 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c  =SRT_DistFifo ||
2d550 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
2d560 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
2d570 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74  stQueue || pDest
2d580 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ->eDest==SRT_Fif
2d590 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  o);.    /* If OR
2d5a0 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
2d5b0 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
2d5c0 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
2d5d0 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
2d5e0 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
2d5f0 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
2d600 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
2d610 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2d620 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
2d630 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
2d640 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
2d650 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
2d660 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
2d670 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
2d680 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
2d690 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74  .  memset(&sSort
2d6a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72  , 0, sizeof(sSor
2d6b0 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72  t));.  sSort.pOr
2d6c0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
2d6d0 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rBy;.  pTabList 
2d6e0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28  = p->pSrc;.  if(
2d6f0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2d700 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2d710 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  d ){.    goto se
2d720 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
2d730 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
2d740 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20  t!=0 );.  isAgg 
2d750 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
2d760 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
2d770 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  0;.#if SELECTTRA
2d780 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
2d790 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2d7a0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2d7b0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2d7c0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28  x100,pParse,p, (
2d7d0 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f  "after name reso
2d7e0 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  lution:\n"));.  
2d7f0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2d800 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2d810 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2d820 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
2d830 20 74 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   the VDBE under 
2d840 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c  construction, al
2d850 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 56  locating a new V
2d860 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  DBE if one.  ** 
2d870 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
2d880 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20   exist */.  v = 
2d890 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
2d8a0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
2d8b0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2d8c0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 44 65 73  _end;.  if( pDes
2d8d0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
2d8e0 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
2d8f0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
2d900 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
2d910 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c 61  .  /* Try to fla
2d920 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
2d930 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2d940 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d  se up into the m
2d950 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23  ain query.  */.#
2d960 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2d970 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2d980 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
2d990 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
2d9a0 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
2d9b0 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
2d9c0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
2d9d0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2d9e0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
2d9f0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
2da00 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ];.    Select *p
2da10 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
2da20 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20  lect;.    Table 
2da30 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
2da40 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 53 75  Tab;.    if( pSu
2da50 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2da60 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d  ..    /* Catch m
2da70 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64  ismatch in the d
2da80 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20  eclared columns 
2da90 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  of a view and th
2daa0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
2dab0 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ** columns in th
2dac0 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20  e SELECT on the 
2dad0 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  RHS */.    if( p
2dae0 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d  Tab->nCol!=pSub-
2daf0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
2db00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2db10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2db20 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c  "expected %d col
2db30 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75  umns for '%s' bu
2db40 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20  t got %d",.     
2db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db60 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
2db70 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e  b->zName, pSub->
2db80 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2db90 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
2dba0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
2dbb0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20    /* Do not try 
2dbc0 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67  to flatten an ag
2dbd0 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79  gregate subquery
2dbe0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2dbf0 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67  Flattening an ag
2dc00 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79  gregate subquery
2dc10 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
2dc20 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
2dc30 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e  uery.    ** is n
2dc40 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20  ot a join.  But 
2dc50 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
2dc60 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
2dc70 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
2dc80 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  ery.    ** will 
2dc90 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  be implemented a
2dca0 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61  s a co-routine a
2dcb0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61  nd there is no a
2dcc0 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20  dvantage to.    
2dcd0 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ** flattening in
2dce0 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
2dcf0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75 62  */.    if( (pSub
2dd00 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2dd10 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 20  Aggregate)!=0 ) 
2dd20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
2dd30 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f  sert( pSub->pGro
2dd40 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  upBy==0 );..    
2dd50 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
2dd60 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f  ry contains an O
2dd70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
2dd80 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20  nd if.    ** it 
2dd90 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e  will be implemen
2dda0 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
2ddb0 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ine, then do not
2ddc0 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a   flatten.  This.
2ddd0 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69      ** restricti
2dde0 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f  on allows SQL co
2ddf0 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68  nstructs like th
2de00 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
2de10 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73  *  SELECT expens
2de20 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a  ive_function(x).
2de30 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28      **    FROM (
2de40 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
2de50 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d  b ORDER BY y LIM
2de60 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20  IT 10);.    **. 
2de70 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73     ** The expens
2de80 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69  ive_function() i
2de90 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20  s only computed 
2dea0 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74  on the 10 rows t
2deb0 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f  hat.    ** are o
2dec0 75 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68  utput, rather th
2ded0 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20  an every row of 
2dee0 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
2def0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
2df00 70 4f 72 64 65 72 42 79 21 3d 30 0a 20 20 20 20  pOrderBy!=0.    
2df10 20 26 26 20 69 3d 3d 30 0a 20 20 20 20 20 26 26   && i==0.     &&
2df20 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63   (pTabList->nSrc
2df30 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
2df40 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e  (pTabList->a[1].
2df50 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f  fg.jointype&(JT_
2df60 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
2df70 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
2df80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2df90 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ..    if( flatte
2dfa0 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
2dfb0 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29  , p, i, isAgg) )
2dfc0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2dfd0 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
2dfe0 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74  absorbed into it
2dff0 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  s parent. */.   
2e000 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
2e010 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
2e020 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
2e030 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2e040 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2e050 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67  end;.    if( !Ig
2e060 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
2e070 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73  Dest) ){.      s
2e080 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2e090 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
2e0a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
2e0b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e0c0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
2e0d0 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63  CT.  /* Handle c
2e0e0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
2e0f0 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20  tatements using 
2e100 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c  the separate mul
2e110 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20  tiSelect().  ** 
2e120 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a  procedure..  */.
2e130 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
2e140 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
2e150 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
2e160 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
2e170 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2e180 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
2e190 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
2e1a0 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43  ctId);.#if SELEC
2e1b0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2e1c0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
2e1d0 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20  ,pParse,p,("end 
2e1e0 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
2e1f0 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b  processing\n"));
2e200 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  .    pParse->nSe
2e210 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65  lectIndent--;.#e
2e220 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
2e230 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
2e240 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65    /* For each te
2e250 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
2e260 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68  lause, do two th
2e270 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41  ings:.  ** (1) A
2e280 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65  uthorized unrefe
2e290 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20  renced tables.  
2e2a0 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65 20  ** (2) Generate 
2e2b0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
2e2c0 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20  -queries.  */.  
2e2d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
2e2e0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
2e2f0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2e300 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
2e310 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
2e320 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
2e330 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
2e340 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21 64  ct *pSub;.#if !d
2e350 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2e360 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
2e370 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2e380 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 63  OMIT_VIEW).    c
2e390 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
2e3a0 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65  dAuthContext;.#e
2e3b0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73  ndif..    /* Iss
2e3c0 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61  ue SQLITE_READ a
2e3d0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69  uthorizations wi
2e3e0 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e  th a fake column
2e3f0 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20   name for any.  
2e400 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74    ** tables that
2e410 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 20   are referenced 
2e420 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20 6e  but from which n
2e430 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 74  o values are ext
2e440 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45  racted..    ** E
2e450 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65  xamples of where
2e460 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20   these kinds of 
2e470 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41 44  null SQLITE_READ
2e480 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a   authorizations.
2e490 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63      ** would occ
2e4a0 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ur:.    **.    *
2e4b0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  *     SELECT cou
2e4c0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20  nt(*) FROM t1;  
2e4d0 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
2e4e0 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20  t1."".    **    
2e4f0 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f   SELECT t1.* FRO
2e500 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53  M t1, t2;   -- S
2e510 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22  QLITE_READ t2.""
2e520 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2e530 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
2e540 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ame is an empty 
2e550 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70  string.  It is p
2e560 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61  ossible for a ta
2e570 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61  ble to.    ** ha
2e580 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ve a column name
2e590 64 20 62 79 20 74 68 65 20 65 6d 70 74 79 20 73  d by the empty s
2e5a0 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20  tring, in which 
2e5b0 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
2e5c0 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64   way to.    ** d
2e5d0 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65  istinguish betwe
2e5e0 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63  en an unreferenc
2e5f0 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20  ed table and an 
2e600 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65  actual reference
2e610 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22   to the.    ** "
2e620 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72  " column. The or
2e630 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77 61  iginal design wa
2e640 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63  s for the fake c
2e650 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65  olumn name to be
2e660 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20   a NULL,.    ** 
2e670 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 75  which would be u
2e680 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75 74  nambiguous.  But
2e690 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69 7a   legacy authoriz
2e6a0 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20  ation callbacks 
2e6b0 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73 73  might.    ** ass
2e6c0 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ume the column n
2e6d0 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  ame is non-NULL 
2e6e0 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20 54  and segfault.  T
2e6f0 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d 70  he use of an emp
2e700 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ty.    ** string
2e710 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f   for the fake co
2e720 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20  lumn name seems 
2e730 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  safer..    */.  
2e740 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c    if( pItem->col
2e750 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Used==0 ){.     
2e760 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
2e770 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
2e780 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e  _READ, pItem->zN
2e790 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e  ame, "", pItem->
2e7a0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
2e7b0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
2e7c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2e7d0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
2e7e0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2e7f0 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  EW).    /* Gener
2e800 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
2e810 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
2e820 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
2e830 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 20      */.    pSub 
2e840 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
2e850 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ;.    if( pSub==
2e860 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
2e870 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20     /* Sometimes 
2e880 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  the code for a s
2e890 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20  ubquery will be 
2e8a0 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74  generated more t
2e8b0 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c  han.    ** once,
2e8c0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
2e8d0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2e8e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
2e8f0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20  a LEFT JOIN,.   
2e900 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e   ** for example.
2e910 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
2e920 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74  do not regenerat
2e930 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61  e the code to ma
2e940 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20  nifest.    ** a 
2e950 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72  view or the co-r
2e960 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d  outine to implem
2e970 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65  ent a view.  The
2e980 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a   first instance.
2e990 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63      ** is suffic
2e9a0 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65  ient, though the
2e9b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
2e9c0 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77  anifest the view
2e9d0 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a   does need.    *
2e9e0 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  * to be invoked 
2e9f0 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  again. */.    if
2ea00 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
2ea10 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66  lSub ){.      if
2ea20 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  ( pItem->fg.viaC
2ea30 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20  oroutine==0 ){. 
2ea40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
2ea50 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61  broutine that ma
2ea60 6e 69 66 65 73 74 73 20 74 68 65 20 76 69 65 77  nifests the view
2ea70 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e 65 2d   might be a one-
2ea80 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20  time routine,.  
2ea90 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d        ** or it m
2eaa0 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
2eab0 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20 69 74  rerun on each it
2eac0 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20  eration because 
2ead0 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e  it.        ** en
2eae0 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c 61 74  codes a correlat
2eaf0 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a  ed subquery. */.
2eb00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2eb10 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
2eb20 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64  Op(v, pItem->add
2eb30 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64  rFillSub)->opcod
2eb40 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20  e==OP_Once );.  
2eb50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2eb60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2eb70 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  sub, pItem->regR
2eb80 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64  eturn, pItem->ad
2eb90 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
2eba0 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
2ebb0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
2ebc0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
2ebd0 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
2ebe0 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
2ebf0 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
2ec00 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
2ec10 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69  ferred to by thi
2ec20 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
2ec30 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
2ec40 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
2ec50 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
2ec60 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
2ec70 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
2ec80 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
2ec90 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
2eca0 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
2ecb0 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
2ecc0 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
2ecd0 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
2ece0 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
2ecf0 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
2ed00 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
2ed10 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
2ed20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
2ed30 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
2ed40 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
2ed50 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63  ;..    /* Make c
2ed60 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e  opies of constan
2ed70 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74  t WHERE-clause t
2ed80 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65  erms in the oute
2ed90 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20  r query down.   
2eda0 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73   ** inside the s
2edb0 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63  ubquery.  This c
2edc0 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71  an help the subq
2edd0 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65  uery to run more
2ede0 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20   efficiently..  
2edf0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49    */.    if( (pI
2ee00 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
2ee10 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a   & JT_OUTER)==0.
2ee20 20 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e       && pushDown
2ee30 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
2ee40 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65  e, pSub, p->pWhe
2ee50 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  re, pItem->iCurs
2ee60 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53  or).    ){.#if S
2ee70 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2ee80 45 44 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ED.      if( sql
2ee90 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2eea0 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20  & 0x100 ){.     
2eeb0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2eec0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
2eed0 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75  After WHERE-clau
2eee0 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22  se push-down:\n"
2eef0 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
2ef00 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2ef10 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
2ef20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2ef30 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75 74 68  ..    zSavedAuth
2ef40 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
2ef50 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
2ef60 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
2ef70 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d  hContext = pItem
2ef80 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  ->zName;..    /*
2ef90 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
2efa0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2efb0 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a  subquery.    **.
2efc0 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75      ** The subqu
2efd0 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ery is implement
2efe0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
2eff0 6e 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ne if the subque
2f000 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67 75 61  ry is.    ** gua
2f010 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68  ranteed to be th
2f020 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f  e outer loop (so
2f030 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
2f040 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 20  t need to be.   
2f050 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72   ** computed mor
2f060 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20  e than once).   
2f070 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a   **.    ** TODO:
2f080 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65 72   Are there other
2f090 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20   reasons beside 
2f0a0 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d  (1) to use a co-
2f0b0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
2f0c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20  mplementation?. 
2f0d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d     */.    if( i=
2f0e0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62  =0.     && (pTab
2f0f0 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20  List->nSrc==1.  
2f100 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
2f110 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e  abList->a[1].fg.
2f120 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46  jointype&(JT_LEF
2f130 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29  T|JT_CROSS))!=0)
2f140 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
2f150 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
2f160 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
2f170 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
2f180 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
2f190 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
2f1a0 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
2f1b0 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
2f1c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2f1d0 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
2f1e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2f1f0 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 0a  ddr(v)+1;.     .
2f200 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
2f210 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
2f220 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2f230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2f240 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
2f250 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2f260 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54  Return, 0, addrT
2f270 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
2f280 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
2f290 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2f2a0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ame));.      pIt
2f2b0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2f2c0 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  = addrTop;.     
2f2d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2f2e0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
2f2f0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
2f300 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2f310 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2f320 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2f330 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2f340 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2f350 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
2f360 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
2f370 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
2f380 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
2f390 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2f3a0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2f3b0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
2f3c0 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
2f3d0 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   1;.      pItem-
2f3e0 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73  >regResult = des
2f3f0 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73  t.iSdst;.      s
2f400 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
2f410 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d  outine(v, pItem-
2f420 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2f430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2f440 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
2f450 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p-1);.      sqli
2f460 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
2f470 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
2f480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2f490 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
2f4a0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2f4b0 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65  l fill an epheme
2f4c0 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20  ral table with. 
2f4d0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74       ** the cont
2f4e0 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71  ent of this subq
2f4f0 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64  uery.  pItem->ad
2f500 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70  drFillSub will p
2f510 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f  oint.      ** to
2f520 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2f530 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75  the generated su
2f540 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d  broutine.  pItem
2f550 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20  ->regReturn.    
2f560 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74    ** is a regist
2f570 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  er allocated to 
2f580 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74  hold the subrout
2f590 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  ine return addre
2f5a0 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ss.      */.    
2f5b0 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20    int topAddr;. 
2f5c0 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64       int onceAdd
2f5d0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
2f5e0 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20   retAddr;.      
2f5f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2f600 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20  tem *pPrior;..  
2f610 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2f620 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
2f630 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
2f640 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
2f650 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2f660 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
2f670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f680 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2f690 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2f6a0 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
2f6b0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2f6c0 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
2f6d0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
2f6e0 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
2f6f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2f700 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
2f710 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
2f720 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
2f730 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
2f740 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
2f750 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
2f760 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
2f770 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
2f780 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
2f790 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
2f7a0 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
2f7b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
2f7c0 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
2f7d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2f7e0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2f7f0 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
2f800 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
2f810 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2f820 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2f830 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
2f840 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
2f850 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
2f860 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2f870 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
2f880 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69        pPrior = i
2f890 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54  sSelfJoinView(pT
2f8a0 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a  abList, pItem);.
2f8b0 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
2f8c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f8d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f8e0 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74   OP_OpenDup, pIt
2f8f0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72  em->iCursor, pPr
2f900 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ior->iCursor);. 
2f910 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65         explainSe
2f920 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2f930 69 53 65 6c 65 63 74 49 64 2c 20 70 50 72 69 6f  iSelectId, pPrio
2f940 72 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20  r->iSelectId);. 
2f950 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f960 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d  Prior->pSelect!=
2f970 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75  0 );.        pSu
2f980 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  b->nSelectRow = 
2f990 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d  pPrior->pSelect-
2f9a0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
2f9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f9c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2f9d0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2f9e0 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
2f9f0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2fa00 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2fa10 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2fa20 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2fa30 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2fa40 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tId);.        sq
2fa50 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2fa60 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2fa70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2fa80 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
2fa90 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e  wLogEst = pSub->
2faa0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
2fab0 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
2fac0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2fad0 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
2fae0 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
2faf0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2fb00 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2fb10 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
2fb20 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
2fb30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
2fb40 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
2fb50 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2fb60 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2fb70 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
2fb80 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
2fb90 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
2fba0 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
2fbb0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2fbc0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2fbd0 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2fbe0 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65  _end;.    pParse
2fbf0 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
2fc00 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
2fc10 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61  ight(p);.    pPa
2fc20 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
2fc30 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
2fc40 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20  ntext;.#endif.  
2fc50 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  }..  /* Various 
2fc60 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
2fc70 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e  SELECT copied in
2fc80 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  to local variabl
2fc90 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76  es for.  ** conv
2fca0 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c  enience */.  pEL
2fcb0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
2fcc0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
2fcd0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
2fce0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
2fcf0 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
2fd00 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
2fd10 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
2fd20 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2fd30 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
2fd40 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2fd50 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2fd60 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2fd70 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
2fd80 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
2fd90 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
2fda0 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
2fdb0 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
2fdc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2fdd0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2fde0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2fdf0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2fe00 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49  COUNTOFVIEW_OPTI
2fe10 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f  MIZATION.  if( O
2fe20 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2fe30 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
2fe40 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c  eryFlattener|SQL
2fe50 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29  ITE_CountOfView)
2fe60 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56 69  .   && countOfVi
2fe70 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70  ewOptimization(p
2fe80 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20  Parse, p).  ){. 
2fe90 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2fea0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2feb0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70  elect_end;.    p
2fec0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
2fed0 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  t;.    pTabList 
2fee0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23  = p->pSrc;.  }.#
2fef0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
2ff00 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
2ff10 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
2ff20 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
2ff30 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
2ff40 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
2ff50 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
2ff60 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
2ff70 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
2ff80 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
2ff90 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
2ffa0 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
2ffb0 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
2ffc0 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
2ffd0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
2ffe0 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
2fff0 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
30000 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
30010 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
30020 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
30030 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
30040 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44  GROUP BY xyz ORD
30050 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
30060 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
30070 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
30080 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
30090 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
300a0 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
300b0 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
300c0 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
300d0 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
300e0 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
300f0 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
30100 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
30110 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
30120 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
30130 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
30140 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
30150 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
30160 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
30170 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
30180 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
30190 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
301a0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
301b0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
301c0 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
301d0 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
301e0 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
301f0 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c  OrderBy, pEList,
30200 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20   -1)==0.  ){.   
30210 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
30220 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
30230 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
30240 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
30250 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
30260 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
30270 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
30280 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
30290 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
302a0 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
302b0 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
302c0 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
302d0 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
302e0 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
302f0 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
30300 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
30310 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
30320 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
30330 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
30340 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
30350 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
30360 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
30370 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
30380 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
30390 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
303a0 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
303b0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
303c0 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
303d0 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53  ,("Transform DIS
303e0 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50  TINCT into GROUP
303f0 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20   BY:\n"));.     
30400 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
30410 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
30420 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
30430 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
30440 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
30450 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65  clause, then cre
30460 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
30470 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64   index to.  ** d
30480 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20  o the sorting.  
30490 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67  But this sorting
304a0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
304b0 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20   might end up.  
304c0 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  ** being unused 
304d0 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
304e0 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  be extracted in 
304f0 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
30500 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69  ..  ** If that i
30510 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
30520 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
30530 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
30540 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63  n will be.  ** c
30550 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
30560 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67  Noop once we fig
30570 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
30580 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
30590 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65  s.  ** not neede
305a0 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64  d.  The sSort.ad
305b0 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69  drSortIndex vari
305c0 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
305d0 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20  facilitate.  ** 
305e0 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
305f0 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
30600 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
30610 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
30620 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
30630 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
30640 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72  ist(pParse, sSor
30650 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70  t.pOrderBy, 0, p
30660 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
30670 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
30680 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
30690 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
306a0 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
306b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
306c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
306d0 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
306e0 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
306f0 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
30700 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
30710 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
30720 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
30730 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
30740 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
30750 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
30760 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
30770 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
30780 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
30790 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
307a0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
307b0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
307c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
307d0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
307e0 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
307f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30800 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
30810 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
30820 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
30830 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
30840 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
30850 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
30860 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
30870 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70 2d  el(v);.  if( (p-
30880 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
30890 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b  ixedLimit)==0 ){
308a0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
308b0 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
308c0 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
308d0 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d    }.  computeLim
308e0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
308f0 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
30900 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
30910 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f   && sSort.addrSo
30920 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
30930 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
30940 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f  ngeOpcode(v, sSo
30950 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
30960 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29  , OP_SorterOpen)
30970 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
30980 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
30990 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
309a0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65  ..  /* Open an e
309b0 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
309c0 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
309d0 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
309e0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
309f0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
30a00 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
30a10 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
30a20 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
30a30 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
30a40 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
30a50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
30a60 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
30a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a80 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
30a90 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
30aa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
30ac0 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f  char*)keyInfoFro
30ad0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
30ae0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29  , p->pEList,0,0)
30af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
30b10 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
30b20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
30b30 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
30b40 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69  RDERED);.    sDi
30b50 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
30b60 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
30b70 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d  T_UNORDERED;.  }
30b80 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69  else{.    sDisti
30b90 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
30ba0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
30bb0 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
30bc0 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
30bd0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
30be0 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  No aggregate fun
30bf0 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52  ctions and no GR
30c00 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
30c10 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c  .    u16 wctrlFl
30c20 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74  ags = (sDistinct
30c30 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f  .isTnct ? WHERE_
30c40 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20  WANT_DISTINCT : 
30c50 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
30c60 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d  WHERE_USE_LIMIT=
30c70 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29  =SF_FixedLimit )
30c80 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73  ;.    wctrlFlags
30c90 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20   |= p->selFlags 
30ca0 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b  & SF_FixedLimit;
30cb0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
30cc0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
30cd0 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20  . */.    pWInfo 
30ce0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
30cf0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
30d00 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
30d10 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
30d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
30d40 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
30d50 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  gs, p->nSelectRo
30d60 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  w);.    if( pWIn
30d70 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
30d80 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
30d90 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
30da0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
30db0 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
30dc0 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
30dd0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
30de0 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
30df0 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
30e00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
30e10 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
30e20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
30e30 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
30e40 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
30e50 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
30e60 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
30e70 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
30e80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
30e90 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
30ea0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
30eb0 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
30ec0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
30ed0 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
30ee0 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  .bOrderedInnerLo
30ef0 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  op = sqlite3Wher
30f00 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  eOrderedInnerLoo
30f10 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  p(pWInfo);.     
30f20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
30f30 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
30f40 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
30f50 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
30f60 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
30f70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
30f80 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
30f90 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
30fa0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
30fb0 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
30fc0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
30fd0 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
30fe0 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
30ff0 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
31000 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
31010 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
31020 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
31030 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
31040 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
31050 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
31060 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
31070 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
31080 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
31090 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
310a0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
310b0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
310c0 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  op. */.    asser
310d0 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45  t( p->pEList==pE
310e0 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65  List );.    sele
310f0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
31100 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
31110 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
31120 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
31130 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31140 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
31150 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
31160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31170 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
31180 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
31190 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
311a0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
311b0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
311c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
311d0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
311e0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
311f0 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
31200 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
31210 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
31220 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
31230 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
31240 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
31250 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
31260 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
31270 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
31280 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
31290 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
312a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
312b0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
312c0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
312d0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
312e0 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
312f0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
31300 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
31310 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
31320 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
31330 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
31340 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
31350 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
31360 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
31370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31380 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
31390 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
313a0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
313b0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
313c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313d0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
313e0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
313f0 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
31400 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
31410 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
31420 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
31430 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
31440 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
31450 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
31460 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
31470 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
31480 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
31490 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
314a0 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
314b0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
314c0 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
314d0 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
314e0 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
314f0 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
31500 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
31510 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
31520 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
31530 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
31540 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
31550 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
31560 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
31570 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
31580 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
31590 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
315a0 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
315b0 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
315c0 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
315d0 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
315e0 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
315f0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
31600 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
31610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31620 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
31630 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
31640 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
31650 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
31660 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
31670 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
31680 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
31690 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
316a0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
316b0 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
316c0 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
316d0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
316e0 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
316f0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
31700 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
31710 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
31720 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
31730 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
31740 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
31750 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
31760 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
31770 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
31780 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
31790 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
317a0 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
317b0 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
317c0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
317d0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
317e0 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
317f0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
31800 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
31810 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
31820 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
31830 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
31840 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
31850 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
31860 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
31870 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
31880 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
31890 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
318a0 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
318b0 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
318c0 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
318d0 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
318e0 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
318f0 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
31900 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
31910 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
31920 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
31930 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
31940 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
31950 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
31960 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
31970 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
31980 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
31990 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
319a0 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
319b0 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
319c0 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
319d0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
319e0 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
319f0 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
31a00 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
31a10 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
31a20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
31a30 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
31a40 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
31a50 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
31a60 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
31a70 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
31a80 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
31a90 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
31aa0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
31ab0 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
31ac0 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
31ad0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
31ae0 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
31af0 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
31b00 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
31b10 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
31b20 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
31b30 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
31b40 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
31b50 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
31b60 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
31b70 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
31b80 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
31b90 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
31ba0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
31bb0 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
31bc0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
31bd0 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
31be0 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
31bf0 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
31c00 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
31c10 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
31c20 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
31c30 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
31c40 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
31c50 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
31c60 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
31c70 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
31c80 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
31c90 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
31ca0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
31cb0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
31cc0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
31cd0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
31ce0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
31cf0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
31d00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  ){.      if( pGr
31d10 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
31d20 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d   assert( pWhere=
31d30 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20  =p->pWhere );.  
31d40 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68        havingToWh
31d50 65 72 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ere(pParse, pGro
31d60 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 26  upBy, pHaving, &
31d70 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
31d80 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
31d90 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a  pWhere;.      }.
31da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
31db0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
31dc0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
31dd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
31de0 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
31df0 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
31e00 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
31e10 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
31e20 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
31e30 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
31e40 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
31e50 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
31e60 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
31e70 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
31e80 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
31e90 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
31ea0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
31eb0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
31ec0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
31ed0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
31ee0 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
31ef0 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
31f00 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
31f10 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
31f20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
31f30 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
31f40 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
31f50 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
31f60 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
31f70 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
31f80 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
31f90 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
31fa0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
31fb0 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
31fc0 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
31fd0 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
31fe0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
31ff0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
32000 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
32010 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
32020 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
32030 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
32040 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
32050 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r1;          /* 
32060 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
32070 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
32080 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
32090 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
320a0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
320b0 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
320c0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
320d0 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
320e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
320f0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
32100 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
32110 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
32120 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
32130 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
32140 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
32150 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
32160 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
32170 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
32180 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
32190 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
321a0 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
321b0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
321c0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
321d0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
321e0 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
321f0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
32200 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
32210 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
32220 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
32230 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
32240 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
32250 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
32260 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
32270 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
32280 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
32290 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
322a0 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
322b0 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
322c0 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
322d0 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
322e0 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
322f0 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
32300 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
32310 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
32320 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
32330 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
32340 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
32350 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
32360 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
32370 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
32380 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
32390 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
323a0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
323b0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
323c0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
323d0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  se, pGroupBy, 0,
323e0 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
323f0 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  n);.      addrSo
32400 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
32410 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
32420 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a  OP_SorterOpen, .
32430 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
32440 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
32450 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
32460 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
32470 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
32480 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
32490 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  O);..      /* In
324a0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
324b0 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
324c0 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
324d0 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
324e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
324f0 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  UseFlag = ++pPar
32500 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
32510 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70  iAbortFlag = ++p
32520 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
32530 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
32540 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
32550 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
32560 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
32570 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
32580 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20  .      regReset 
32590 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
325a0 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65  ;.      addrRese
325b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
325c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
325d0 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
325e0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
325f0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
32600 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
32610 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
32620 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
32630 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
32640 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
32650 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
32660 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32670 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
32680 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
32690 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
326a0 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61  ent((v, "clear a
326b0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
326c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
326d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
326e0 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  ger, 0, iUseFlag
326f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
32700 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
32710 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
32720 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
32730 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
32740 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
32750 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72  iAMem, iAMem+pGr
32760 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
32770 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
32780 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
32790 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
327a0 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
327b0 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
327c0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
327d0 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
327e0 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
327f0 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
32800 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
32810 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
32820 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
32830 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
32840 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
32850 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
32860 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
32870 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
32880 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
32890 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
328a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
328b0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
328c0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
328d0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
328e0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
328f0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
32900 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20  , pGroupBy, 0,. 
32910 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47           WHERE_G
32920 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42  ROUPBY | (orderB
32930 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52  yGrp ? WHERE_SOR
32940 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30  TBYGROUP : 0), 0
32950 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
32960 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
32970 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
32980 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
32990 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
329a0 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70  (pWInfo)==pGroup
329b0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
329c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
329d0 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
329e0 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
329f0 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
32a00 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
32a10 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
32a20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
32a30 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
32a40 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
32a50 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
32a60 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
32a70 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
32a80 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
32a90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32aa0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
32ab0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
32ac0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
32ad0 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
32ae0 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
32af0 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
32b00 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
32b10 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
32b20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
32b30 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
32b40 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
32b50 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
32b60 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
32b70 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
32b80 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
32b90 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
32ba0 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
32bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32bc0 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
32bd0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
32be0 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
32bf0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
32c00 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
32c10 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70       explainTemp
32c20 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20  Table(pParse, . 
32c30 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73             (sDis
32c40 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
32c50 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  (p->selFlags&SF_
32c60 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a  Distinct)==0) ?.
32c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c80 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a      "DISTINCT" :
32c90 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20   "GROUP BY");.. 
32ca0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
32cb0 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
32cc0 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
32cd0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
32ce0 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
32cf0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  pBy;.        j =
32d00 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
32d10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
32d20 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
32d30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
32d40 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
32d50 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
32d60 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
32d70 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
32d80 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
32d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32da0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
32db0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
32dc0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
32dd0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
32de0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
32df0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
32e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
32e10 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
32e20 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
32e30 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29  , regBase, 0, 0)
32e40 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
32e50 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
32e60 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
32e70 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
32e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
32e90 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
32ea0 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
32eb0 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
32ec0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
32ed0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
32ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
32ef0 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
32f00 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
32f10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
32f20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70  GetColumnToReg(p
32f30 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
32f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f50 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
32f60 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
32f70 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
32f80 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
32f90 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
32fa0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32fb0 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
32fc0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
32fd0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
32fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32ff0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
33000 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
33010 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
33020 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
33030 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
33040 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
33050 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
33060 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
33070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33080 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
33090 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
330a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
330b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
330c0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
330d0 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
330e0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
330f0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
33100 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
33110 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f  tingIdxPTab = so
33120 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d  rtPTab = pParse-
33130 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
33140 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74   sortOut = sqlit
33150 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
33160 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
33170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
33180 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
33190 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74  , sortPTab, sort
331a0 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  Out, nCol);.    
331b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
331c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
331d0 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  erSort, sAggInfo
331e0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
331f0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
33200 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
33210 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
33220 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
33230 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
33240 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
33250 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  x = 1;.        s
33260 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
33270 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20  lear(pParse);.. 
33280 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
33290 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72   If the index or
332a0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
332b0 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f   used by the GRO
332c0 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20  UP BY sort.     
332d0 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c   ** will natural
332e0 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  ly deliver rows 
332f0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71  in the order req
33300 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44  uired by the ORD
33310 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63  ER BY.      ** c
33320 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68  lause, cancel th
33330 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
33340 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72  e open coded ear
33350 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lier..      **. 
33360 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
33370 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
33380 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  - the correct an
33390 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75  swer should resu
333a0 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  lt regardless.. 
333b0 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20       ** Use the 
333c0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
333d0 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
333e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
333f0 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20  TIMIZER to .    
33400 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69    ** disable thi
33410 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
33420 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
33430 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ses.  */.      i
33440 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26  f( orderByGrp &&
33450 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
33460 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
33470 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20  GroupByOrder) . 
33480 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42        && (groupB
33490 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33  ySort || sqlite3
334a0 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57  WhereIsSorted(pW
334b0 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a  Info)).      ){.
334c0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f          sSort.pO
334d0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
334e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
334f0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
33500 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
33510 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
33520 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
33530 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
33540 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
33550 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
33560 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
33570 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
33580 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
33590 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
335a0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
335b0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
335c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
335d0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
335e0 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
335f0 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
33600 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
33610 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
33620 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
33630 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
33640 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
33650 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
33660 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
33670 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33680 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
33690 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
336a0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
336b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
336c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
336d0 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
336e0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
336f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33700 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74              sort
33710 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a  Out, sortPTab);.
33720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
33730 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
33740 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
33750 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
33760 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
33770 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33780 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
33790 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
337a0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
337b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
337c0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
337d0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
337e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
337f0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
33800 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
33810 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
33820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33830 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
33840 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
33850 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
33860 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
33870 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
33880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33890 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
338a0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
338b0 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
338c0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
338d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
338e0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
338f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33900 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
33910 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72  addr1+1, 0, addr
33920 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
33930 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge(v);..      /*
33940 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
33950 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
33960 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
33970 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
33980 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
33990 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
339a0 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
339b0 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
339c0 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
339d0 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
339e0 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
339f0 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
33a00 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
33a10 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
33a20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
33a30 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
33a40 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
33a50 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
33a60 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
33a70 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
33a80 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
33a90 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
33aa0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
33ab0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
33ac0 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
33ad0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
33ae0 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
33af0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
33b00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
33b10 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
33b20 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
33b30 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
33b40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33b50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
33b60 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
33b70 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
33b80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
33b90 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
33ba0 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
33bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33bc0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
33bd0 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
33be0 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  rEnd); VdbeCover
33bf0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
33c00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
33c10 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
33c20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
33c30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
33c40 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
33c50 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
33c60 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
33c70 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
33c80 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
33c90 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
33ca0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
33cb0 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
33cc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
33cd0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
33ce0 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
33cf0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
33d00 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
33d10 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64  ddr1);.      upd
33d20 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
33d30 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
33d40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33d50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
33d60 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
33d70 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
33d80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
33d90 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
33da0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
33db0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
33dc0 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
33dd0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
33de0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
33df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33e00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
33e10 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
33e20 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
33e30 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
33e40 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
33e50 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
33e60 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
33e70 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
33e80 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
33e90 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
33ea0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
33eb0 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
33ec0 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
33ed0 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
33ee0 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
33ef0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
33f00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
33f10 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
33f20 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
33f30 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
33f40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
33f50 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
33f60 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
33f70 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
33f80 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
33f90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
33fa0 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  oto(v, addrEnd);
33fb0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
33fc0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
33fd0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
33fe0 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
33ff0 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
34000 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
34010 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
34020 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
34030 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
34040 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
34050 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
34060 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
34070 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
34080 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
34090 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
340a0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
340b0 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
340c0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
340d0 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
340e0 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
340f0 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
34100 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
34110 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
34120 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
34130 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
34140 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
34150 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
34160 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
34170 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
34180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34190 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
341a0 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  er, 1, iAbortFla
341b0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
341c0 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61  mment((v, "set a
341d0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
341e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
341f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
34200 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
34210 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34220 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
34230 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  (v, addrOutputRo
34240 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  w);.      addrOu
34250 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
34260 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
34270 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
34280 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
34290 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c  OP_IfPos, iUseFl
342a0 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
342b0 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
342c0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
342d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
342e0 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
342f0 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
34300 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
34310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34320 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
34330 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
34340 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
34350 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
34360 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
34370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
34380 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
34390 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
343a0 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
343b0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
343c0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
343d0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
343e0 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20   -1, &sSort,.   
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34400 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70     &sDistinct, p
34410 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
34420 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
34430 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
34440 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
34450 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34460 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
34470 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
34480 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
34490 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
344a0 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
344b0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
344c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
344d0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
344e0 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
344f0 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
34500 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
34510 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
34520 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
34530 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
34540 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
34550 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
34560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34570 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34580 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
34590 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
345a0 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
345b0 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
345c0 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
345d0 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
345e0 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
345f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
34600 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
34610 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
34620 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
34630 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
34640 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
34650 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
34660 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
34670 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
34680 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
34690 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
346a0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
346b0 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
346c0 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
346d0 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
346e0 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
346f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
34700 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
34710 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
34720 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
34730 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
34740 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
34750 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
34760 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
34770 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
34780 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
34790 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
347a0 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
347b0 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
347c0 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
347d0 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
347e0 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
347f0 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
34800 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
34810 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
34820 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
34830 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
34840 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
34850 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
34860 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
34870 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
34880 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
34890 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
348a0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
348b0 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
348c0 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
348d0 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
348e0 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
348f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
34900 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
34910 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
34920 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
34930 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
34940 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
34950 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
34960 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
34970 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
34980 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
34990 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
349a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349b0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
349c0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
349d0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
349e0 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
349f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
34a00 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
34a10 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
34a20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
34a30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
34a40 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
34a50 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
34a60 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
34a70 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
34a80 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
34a90 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
34aa0 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
34ab0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
34ac0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
34ad0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
34ae0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34af0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
34b00 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
34b10 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
34b20 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
34b30 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
34b40 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
34b50 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20  the lowest scan 
34b60 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  cost..        **
34b70 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
34b80 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20  1-04-15) Do not 
34b90 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f  do a full scan o
34ba0 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69  f an unordered i
34bb0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
34bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
34bd0 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20  3-10-03) Do not 
34be0 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65  count the entrie
34bf0 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69  s in a partial i
34c00 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
34c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70  .        ** In p
34c20 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49  ractice the KeyI
34c30 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69  nfo structure wi
34c40 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
34c50 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20  It is only .    
34c60 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f      ** passed to
34c70 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61   keep OP_OpenRea
34c80 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20  d happy..       
34c90 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
34ca0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
34cb0 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65  ) pBest = sqlite
34cc0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
34cd0 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
34ce0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
34cf0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
34d00 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
34d10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
34d20 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  dx->bUnordered==
34d30 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
34d40 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
34d50 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20  Tab->szTabRow.  
34d60 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
34d70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
34d80 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
34d90 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78   (!pBest || pIdx
34da0 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74  ->szIdxRow<pBest
34db0 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20  ->szIdxRow).    
34dc0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
34dd0 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
34de0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
34df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34e00 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
34e10 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
34e20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
34e30 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
34e40 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
34e50 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
34e60 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pBest);.        
34e70 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
34e80 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
34e90 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74  ursor, execute t
34ea0 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f  he OP_Count, clo
34eb0 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a  se the cursor. *
34ec0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
34ed0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
34ee0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
34ef0 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c  Csr, iRoot, iDb,
34f00 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
34f10 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
34f20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34f30 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
34f40 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
34f50 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
34f60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34f80 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
34f90 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
34fa0 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
34fb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34fc0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34fd0 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
34fe0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69         explainSi
34ff0 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65  mpleCount(pParse
35000 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a  , pTab, pBest);.
35010 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
35020 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
35030 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
35040 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
35050 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
35060 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
35070 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
35080 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
35090 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
350a0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
350b0 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
350c0 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
350d0 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
350e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
350f0 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
35100 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
35110 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
35120 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
35130 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
35140 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
35150 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
35160 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
35170 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
35180 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
35190 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
351a0 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
351b0 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
351c0 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
351d0 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
351e0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
351f0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
35200 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
35210 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
35220 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
35230 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
35240 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
35250 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
35260 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
35270 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
35280 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
35290 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
352a0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
352b0 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
352c0 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
352d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
352e0 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
352f0 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
35300 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
35310 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
35320 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
35330 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20  modify behavior 
35340 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
35350 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
35360 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
35370 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
35380 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
35390 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
353a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
353b0 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
353c0 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
353d0 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
353e0 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
353f0 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
35400 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
35410 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
35420 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
35430 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
35440 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
35450 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
35460 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
35470 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
35480 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
35490 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
354a0 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
354b0 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
354c0 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
354d0 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
354e0 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
354f0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
35500 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
35510 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
35520 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
35530 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
35540 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
35550 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
35560 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
35570 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
35580 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a  ORMAL;.        .
35590 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
355a0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
355b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
355c0 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  ( flag==0 );.   
355d0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
355e0 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ing==0 ){.      
355f0 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61      flag = minMa
35600 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f  xQuery(&sAggInfo
35610 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20  , &pMinMax);.   
35620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
35630 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c  ssert( flag==0 |
35640 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26  | (pMinMax!=0 &&
35650 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
35660 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  =1) );..        
35670 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
35680 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
35690 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
356a0 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20  up(db, pMinMax, 
356b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
356c0 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
356d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
356e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
356f0 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d 30 20 29   || pMinMax!=0 )
35700 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35710 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
35720 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
35730 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
35740 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
35750 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
35760 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
35770 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
35780 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
35790 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
357a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
357b0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
357c0 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
357d0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
357e0 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
357f0 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
35800 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
35810 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
35820 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
35830 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
35840 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
35850 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
35860 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
35870 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
35880 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
35890 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
358a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
358b0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
358c0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
358d0 6e 4d 61 78 2c 20 30 2c 66 6c 61 67 2c 30 29 3b  nMax, 0,flag,0);
358e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
358f0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
35900 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
35910 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
35920 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  el);.          g
35930 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
35940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35950 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
35960 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
35970 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
35980 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d  assert( pMinMax=
35990 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 || pMinMax->n
359a0 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
359b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
359c0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
359d0 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  nfo)>0 ){.      
359e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
359f0 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57 68  oto(v, sqlite3Wh
35a00 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
35a10 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Info));.        
35a20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
35a30 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
35a40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
35a50 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
35a60 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
35a70 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
35a80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
35a90 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
35aa0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
35ab0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
35ac0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
35ad0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
35ae0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
35af0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
35b00 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
35b10 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
35b20 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
35b30 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
35b40 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
35b50 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
35b60 70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20  p, -1, 0, 0, .  
35b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b80 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
35b90 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
35ba0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
35bb0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
35bc0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
35bd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
35be0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
35bf0 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
35c00 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
35c10 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
35c20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
35c30 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
35c40 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
35c50 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
35c60 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
35c70 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
35c80 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
35c90 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
35ca0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
35cb0 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
35cc0 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
35cd0 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
35ce0 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
35cf0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
35d00 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
35d10 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
35d20 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20  pTable(pParse,. 
35d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d40 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
35d50 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54  >0 ? "RIGHT PART
35d60 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f   OF ORDER BY":"O
35d70 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67  RDER BY");.    g
35d80 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
35d90 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72  pParse, p, &sSor
35da0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
35db0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
35dc0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
35dd0 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
35de0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
35df0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
35e00 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
35e10 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  The SELECT has b
35e20 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68  een coded. If th
35e30 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ere is an error 
35e40 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
35e50 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74  ucture,.  ** set
35e60 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
35e70 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65   to 1. Otherwise
35e80 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70   0. */.  rc = (p
35e90 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a  Parse->nErr>0);.
35ea0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
35eb0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
35ec0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
35ed0 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
35ee0 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
35ef0 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
35f00 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
35f10 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
35f20 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
35f30 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
35f40 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
35f50 63 74 49 64 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ctId);..  sqlite
35f60 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
35f70 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
35f80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
35f90 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
35fa0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
35fb0 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43  _ENABLED.  SELEC
35fc0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
35fd0 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73 69  p,("end processi
35fe0 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72 73  ng\n"));.  pPars
35ff0 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74  e->nSelectIndent
36000 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  --;.#endif.  ret
36010 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.