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

Artifact 4248b28ec9db68653d3ea5137b7c7f5bad52451486ccf1a2247cd39ca3b9e35c:


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 4f 4b 5f 49 46 5f 41  .    if( OK_IF_A
0b00: 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70 57  LWAYS_TRUE(p->pW
0b10: 69 74 68 29 20 29 20 73 71 6c 69 74 65 33 57 69  ith) ) sqlite3Wi
0b20: 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  thDelete(db, p->
0b30: 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66 28 20  pWith);.    if( 
0b40: 62 46 72 65 65 20 29 20 73 71 6c 69 74 65 33 44  bFree ) sqlite3D
0b50: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
0b60: 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a      p = pPrior;.
0b70: 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a 20      bFree = 1;. 
0b80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
0b90: 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74 44  ialize a SelectD
0ba0: 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
0bb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
0bc0: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65 6c  lectDestInit(Sel
0bd0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
0be0: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
0bf0: 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e  Parm){.  pDest->
0c00: 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65 73  eDest = (u8)eDes
0c10: 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44 50  t;.  pDest->iSDP
0c20: 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70  arm = iParm;.  p
0c30: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d  Dest->zAffSdst =
0c40: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
0c50: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0c60: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0c70: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0c80: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0c90: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0ca0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0cb0: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0cc0: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0cd0: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0ce0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0cf0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0d00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0d10: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0d20: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0d30: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0d40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0d50: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0d60: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0d70: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0d80: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0d90: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0da0: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0db0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0dc0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0dd0: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0de0: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0df0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0e00: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0e10: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0e20: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0e30: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0e40: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0e50: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33 32 20  clause */.  u32 
0e60: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0e70: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0e80: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0e90: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0ea0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0eb0: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0ec0: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0ed0: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0ee0: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0ef0: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0f00: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0f10: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0f20: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0f30: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0f40: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
0f50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
0f60: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
0f70: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
0f80: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
0f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
0fa0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
0fb0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0fc0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
0fd0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
0fe0: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
0ff0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1000: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1010: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1040: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
1050: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
1060: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
1070: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
1080: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1090: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
10a0: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
10b0: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
10c0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
10d0: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
10e0: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
10f0: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1100: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
1110: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
1120: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
1130: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1140: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
1150: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
1160: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
1170: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
1180: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1190: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
11a0: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
11b0: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
11c0: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
11d0: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
11e0: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
11f0: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
1200: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
1210: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
1220: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1230: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
1240: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
1250: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
1260: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1270: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
1280: 70 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d  pOffset;.  pNew-
1290: 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 61 73  >pWith = 0;.  as
12a0: 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30  sert( pOffset==0
12b0: 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c   || pLimit!=0 ||
12c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 0a   pParse->nErr>0.
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
12f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1300: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
1310: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1320: 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c  ailed ) {.    cl
1330: 65 61 72 53 65 6c 65 63 74 28 70 50 61 72 73 65  earSelect(pParse
1340: 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  ->db, pNew, pNew
1350: 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20  !=&standin);.   
1360: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c   pNew = 0;.  }el
1370: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1380: 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c  pNew->pSrc!=0 ||
1390: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
13a0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
13b0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20   pNew!=&standin 
13c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
13d0: 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  ;.}..#if SELECTT
13e0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
13f0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
1400: 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a 65  of a Select obje
1410: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
1420: 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
1430: 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74  Select *p, const
1440: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1450: 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65 20   if( p && zName 
1460: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1470: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
1480: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e  ->zSelName), p->
1490: 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20  zSelName, "%s", 
14a0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  zName);.  }.}.#e
14b0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  ndif.../*.** Del
14c0: 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65  ete the given Se
14d0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
14e0: 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
14f0: 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a  bstructures..*/.
1500: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1510: 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  ctDelete(sqlite3
1520: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29   *db, Select *p)
1530: 7b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  {.  if( OK_IF_AL
1540: 57 41 59 53 5f 54 52 55 45 28 70 29 20 29 20 63  WAYS_TRUE(p) ) c
1550: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
1560: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 1);.}../*.** R
1570: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1580: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
1590: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
15a0: 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  nt in a compound
15b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c 65  ..*/.static Sele
15c0: 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f 73  ct *findRightmos
15d0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
15e0: 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74 20  while( p->pNext 
15f0: 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ) p = p->pNext;.
1600: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1610: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
1620: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
1630: 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e  eceding the JOIN
1640: 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d   keyword, determ
1650: 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  ine the.** type 
1660: 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e  of join.  Return
1670: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
1680: 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65 73  tant that expres
1690: 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a  ses that type.**
16a0: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
16b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76   following bit v
16c0: 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
16d0: 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20   JT_INNER.**    
16e0: 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20   JT_CROSS.**    
16f0: 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20   JT_OUTER.**    
1700: 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20   JT_NATURAL.**  
1710: 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20     JT_LEFT.**   
1720: 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a    JT_RIGHT.**.**
1730: 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f   A full outer jo
1740: 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e  in is the combin
1750: 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54  ation of JT_LEFT
1760: 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a   and JT_RIGHT..*
1770: 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67  *.** If an illeg
1780: 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  al or unsupporte
1790: 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73  d join type is s
17a0: 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20  een, then still 
17b0: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e  return.** a join
17c0: 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20 61   type, but put a
17d0: 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70  n error in the p
17e0: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
17f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a  .*/.int sqlite3J
1800: 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  oinType(Parse *p
1810: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41  Parse, Token *pA
1820: 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b  , Token *pB, Tok
1830: 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a  en *pC){.  int j
1840: 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54  ointype = 0;.  T
1850: 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a  oken *apAll[3];.
1860: 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20    Token *p;.    
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 30 31           /*   01
1890: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
18a0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
18b0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
18c0: 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65 78 74  st char zKeyText
18d0: 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65 66 74  [] = "naturaleft
18e0: 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e  outerightfullinn
18f0: 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74 61 74  ercross";.  stat
1900: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
1910: 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20 20 20  {.    u8 i;     
1920: 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
1930: 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78 74 20  of keyword text 
1940: 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f  in zKeyText[] */
1950: 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 20 20  .    u8 nChar;  
1960: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1970: 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20 63 68  he keyword in ch
1980: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20  aracters */.    
1990: 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20  u8 code;     /* 
19a0: 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a  Join type mask *
19b0: 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d  /.  } aKeyword[]
19c0: 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75   = {.    /* natu
19d0: 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20  ral */ { 0,  7, 
19e0: 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20 20 20  JT_NATURAL      
19f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1a00: 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b   /* left    */ {
1a10: 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   6,  4, JT_LEFT|
1a20: 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20  JT_OUTER        
1a30: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65    },.    /* oute
1a40: 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20  r   */ { 10, 5, 
1a50: 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20  JT_OUTER        
1a60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1a70: 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f 20 7b   /* right   */ {
1a80: 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54   14, 5, JT_RIGHT
1a90: 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20  |JT_OUTER       
1aa0: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c    },.    /* full
1ab0: 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20      */ { 19, 4, 
1ac0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
1ad0: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
1ae0: 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b   /* inner   */ {
1af0: 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   23, 5, JT_INNER
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73    },.    /* cros
1b20: 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20  s   */ { 28, 5, 
1b30: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53  JT_INNER|JT_CROS
1b40: 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  S         },.  }
1b50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
1b60: 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20  apAll[0] = pA;. 
1b70: 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a   apAll[1] = pB;.
1b80: 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b    apAll[2] = pC;
1b90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20  .  for(i=0; i<3 
1ba0: 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b  && apAll[i]; i++
1bb0: 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c  ){.    p = apAll
1bc0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  [i];.    for(j=0
1bd0: 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 4b  ; j<ArraySize(aK
1be0: 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20  eyword); j++){. 
1bf0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61       if( p->n==a
1c00: 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72  Keyword[j].nChar
1c10: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73   .          && s
1c20: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
1c30: 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65  char*)p->z, &zKe
1c40: 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a  yText[aKeyword[j
1c50: 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29  ].i], p->n)==0 )
1c60: 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79  {.        jointy
1c70: 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a  pe |= aKeyword[j
1c80: 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].code;.        
1c90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1ca0: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
1cb0: 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20  e( j==0 || j==1 
1cc0: 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20  || j==2 || j==3 
1cd0: 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20  || j==4 || j==5 
1ce0: 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69  || j==6 );.    i
1cf0: 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28  f( j>=ArraySize(
1d00: 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20 20 20  aKeyword) ){.   
1d10: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a     jointype |= J
1d20: 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  T_ERROR;.      b
1d30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1d40: 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e    if(.     (join
1d50: 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52  type & (JT_INNER
1d60: 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54  |JT_OUTER))==(JT
1d70: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
1d80: 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79   ||.     (jointy
1d90: 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d  pe & JT_ERROR)!=
1da0: 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  0.  ){.    const
1db0: 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22   char *zSp = " "
1dc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1dd0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
1de0: 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d  C==0 ){ zSp++; }
1df0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1e00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1e10: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
1e20: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
1e30: 22 0a 20 20 20 20 20 20 20 22 25 54 20 25 54 25  ".       "%T %T%
1e40: 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53  s%T", pA, pB, zS
1e50: 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  p, pC);.    join
1e60: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
1e70: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f  .  }else if( (jo
1e80: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1e90: 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  R)!=0 .         
1ea0: 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28  && (jointype & (
1eb0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
1ec0: 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  ))!=JT_LEFT ){. 
1ed0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ee0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
1ef0: 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c    "RIGHT and FUL
1f00: 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72  L OUTER JOINs ar
1f10: 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  e not currently 
1f20: 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20  supported");.   
1f30: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
1f40: 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NNER;.  }.  retu
1f50: 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a  rn jointype;.}..
1f60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1f70: 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75   index of a colu
1f80: 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20  mn in a table.  
1f90: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
1fa0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f   column.** is no
1fb0: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
1fc0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
1fd0: 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e  tic int columnIn
1fe0: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  dex(Table *pTab,
1ff0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2000: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
2010: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
2020: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2030: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2040: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  mp(pTab->aCol[i]
2050: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
2060: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
2070: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
2080: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
2090: 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c 65 73  e first N tables
20a0: 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c   in pSrc, from l
20b0: 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f  eft to right, lo
20c0: 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74  oking for a.** t
20d0: 61 62 6c 65 20 74 68 61 74 20 68 61 73 20 61 20  able that has a 
20e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f  column named zCo
20f0: 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  l.  .**.** When 
2100: 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69 54 61  found, set *piTa
2110: 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20  b and *piCol to 
2120: 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65 78 20  the table index 
2130: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  and column index
2140: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68  .** of the match
2150: 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72  ing column and r
2160: 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a  eturn TRUE..**.*
2170: 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  * If not found, 
2180: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
2190: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61 62 6c  .static int tabl
21a0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
21b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
21c0: 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ,       /* Array
21d0: 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
21e0: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  arch */.  int N,
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2200: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  * Number of tabl
2210: 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  es in pSrc->a[] 
2220: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63  to search */.  c
2230: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
2240: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2250: 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65  he column we are
2260: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
2270: 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20 20 20    int *piTab,   
2280: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2290: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
22a0: 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  [] here */.  int
22b0: 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20 20 20   *piCol         
22c0: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
22d0: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54   of pSrc->a[*piT
22e0: 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d  ab].pTab->aCol[]
22f0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2300: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2310: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
2320: 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
2330: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2340: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2350: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
2360: 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c  mn matching zCol
2370: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
2380: 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f  piTab==0)==(piCo
2390: 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74  l==0) );  /* Bot
23a0: 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61 72 65  h or neither are
23b0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69   NULL */.  for(i
23c0: 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<N; i++){. 
23d0: 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e     iCol = column
23e0: 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d  Index(pSrc->a[i]
23f0: 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20  .pTab, zCol);.  
2400: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
2410: 0a 20 20 20 20 20 20 69 66 28 20 70 69 54 61 62  .      if( piTab
2420: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 54   ){.        *piT
2430: 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ab = i;.        
2440: 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20  *piCol = iCol;. 
2450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2460: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
2470: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2480: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2490: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
24a0: 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69 65 64  dd terms implied
24b0: 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20   by JOIN syntax 
24c0: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
24d0: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
24e0: 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  n of a SELECT st
24f0: 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77  atement. The new
2500: 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20   term, which.** 
2510: 69 73 20 41 4e 44 65 64 20 77 69 74 68 20 74 68  is ANDed with th
2520: 65 20 65 78 69 73 74 69 6e 67 20 57 48 45 52 45  e existing WHERE
2530: 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66 20 74   clause, is of t
2540: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
2550: 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74    (tab1.col1 = t
2560: 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20  ab2.col2).**.** 
2570: 77 68 65 72 65 20 74 61 62 31 20 69 73 20 74 68  where tab1 is th
2580: 65 20 69 53 72 63 27 74 68 20 74 61 62 6c 65 20  e iSrc'th table 
2590: 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63 20  in SrcList pSrc 
25a0: 61 6e 64 20 74 61 62 32 20 69 73 20 74 68 65 20  and tab2 is the 
25b0: 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74 68 2e  .** (iSrc+1)'th.
25c0: 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20   Column col1 is 
25d0: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20  column iColLeft 
25e0: 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c  of tab1, and col
25f0: 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69  2 is.** column i
2600: 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61 62 32  ColRight of tab2
2610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2620: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
2630: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
2660: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
2670: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2690: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 46 52   of tables in FR
26a0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
26b0: 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20 20 20  nt iLeft,       
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
26e0: 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69   table to join i
26f0: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2700: 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20 20  iColLeft,       
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2720: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
2730: 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  n first table */
2740: 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c 20 20  .  int iRight,  
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
2770: 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20 70  econd table in p
2780: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
2790: 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  lRight,         
27a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
27b0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73  x of column in s
27c0: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
27d0: 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e   int isOuterJoin
27e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2800: 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69   is an OUTER joi
2810: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
2820: 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20  Where           
2830: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2840: 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  : The WHERE clau
2850: 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a  se to add to */.
2860: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2870: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2880: 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20 45 78   Expr *pE1;.  Ex
2890: 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70 72 20  pr *pE2;.  Expr 
28a0: 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pEq;..  assert(
28b0: 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20 29 3b   iLeft<iRight );
28c0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
28d0: 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29 3b 0a  >nSrc>iRight );.
28e0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
28f0: 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b  a[iLeft].pTab );
2900: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
2910: 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61 62 20  >a[iRight].pTab 
2920: 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c 69  );..  pE1 = sqli
2930: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
2940: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 4c  xpr(db, pSrc, iL
2950: 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a  eft, iColLeft);.
2960: 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65 33 43    pE2 = sqlite3C
2970: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2980: 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67 68 74  db, pSrc, iRight
2990: 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20  , iColRight);.. 
29a0: 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45   pEq = sqlite3PE
29b0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45  xpr(pParse, TK_E
29c0: 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a 20 20  Q, pE1, pE2);.  
29d0: 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74  if( pEq && isOut
29e0: 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78  erJoin ){.    Ex
29f0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
2a00: 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  q, EP_FromJoin);
2a10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
2a20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2a30: 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  q, EP_TokenOnly|
2a40: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2a50: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2a60: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f  perty(pEq, EP_No
2a70: 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45 71  Reduce);.    pEq
2a80: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2a90: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2aa0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2ab0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2ac0: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
2ad0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
2ae0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
2af0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2b00: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
2b10: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
2b20: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2b30: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2b40: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2b50: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2b60: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2b70: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2b80: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2b90: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2ba0: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2bb0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2bc0: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
2bd0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
2be0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
2bf0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
2c00: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
2c10: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
2c20: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2c30: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2c40: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2c50: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2c60: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2c70: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2c80: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2c90: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2ca0: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2cb0: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2cc0: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
2cd0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
2ce0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
2cf0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2d00: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
2d10: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
2d20: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
2d30: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
2d40: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
2d50: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2d60: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
2d70: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
2d80: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
2d90: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
2da0: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
2db0: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
2dc0: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
2dd0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
2de0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
2df0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
2e00: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2e10: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
2e20: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
2e30: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
2e40: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
2e50: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
2e60: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2e70: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
2e80: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
2e90: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
2ea0: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
2eb0: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
2ec0: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
2ed0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
2ee0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
2ef0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
2f00: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
2f10: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
2f20: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2f30: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2f40: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2f50: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2f60: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2f70: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2f80: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2f90: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2fa0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2fb0: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
2fc0: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
2fd0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
2fe0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
2ff0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
3000: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
3010: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
3020: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
3030: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
3040: 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
3050: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
3060: 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67  ce);.    p->iRig
3070: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
3080: 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69  16)iTable;.    i
3090: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  f( p->op==TK_FUN
30a0: 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c  CTION && p->x.pL
30b0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
30c0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
30d0: 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  0; i<p->x.pList-
30e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
30f0: 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
3100: 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  r(p->x.pList->a[
3110: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
3120: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3130: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
3140: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
3150: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
3160: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
3170: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3180: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
3190: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
31a0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
31b0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
31c0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
31d0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
31e0: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
31f0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3200: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
3210: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
3220: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
3230: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
3240: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
3250: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
3260: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
3270: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
3280: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
3290: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
32a0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
32b0: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
32c0: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
32d0: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
32e0: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
32f0: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
3300: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
3310: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
3320: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
3330: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
3340: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
3350: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
3360: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
3370: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
3380: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3390: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
33a0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
33b0: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
33c0: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
33d0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
33e0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
33f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
3400: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
3410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
3420: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
3430: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
3440: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
3450: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3470: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
3480: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3490: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
34c0: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
34d0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
34e0: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
34f0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3500: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
3510: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
3520: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
3530: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3540: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
3550: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
3560: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
3570: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
3580: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
3590: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
35a0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
35b0: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
35c0: 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62  Table *pRightTab
35d0: 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b   = pRight->pTab;
35e0: 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72  .    int isOuter
35f0: 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  ;..    if( NEVER
3600: 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30 20  (pLeft->pTab==0 
3610: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
3620: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3630: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
3640: 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  ht->fg.jointype 
3650: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a  & JT_OUTER)!=0;.
3660: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
3670: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
3680: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
3690: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
36a0: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
36b0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
36c0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
36d0: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
36e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
36f0: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3700: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
3710: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
3720: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
3730: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3750: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
3760: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
3770: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
3780: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
3790: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
37a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
37b0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
37c0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
37d0: 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b  pRightTab->nCol;
37e0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
37f0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
3800: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20   Name of column 
3810: 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  in the right tab
3820: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3830: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  t iLeft;     /* 
3840: 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61  Matching left ta
3850: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
3860: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a  nt iLeftCol;  /*
3870: 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   Matching column
3880: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
3890: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  le */..        z
38a0: 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62  Name = pRightTab
38b0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
38c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62  .        if( tab
38d0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
38e0: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
38f0: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
3900: 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  tCol) ){.       
3910: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
3920: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
3930: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
3940: 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20  +1, j,.         
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
3960: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
3970: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
3980: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3990: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
39a0: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
39b0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
39c0: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
39d0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
39e0: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
39f0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
3a00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3a10: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
3a20: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
3a30: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
3a40: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3a50: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
3a60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3a70: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
3a80: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
3a90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
3aa0: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
3ab0: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
3ac0: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
3ad0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3ae0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
3af0: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
3b00: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
3b10: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
3b20: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
3b30: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
3b40: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
3b50: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57  Parse->db, p->pW
3b60: 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f  here, pRight->pO
3b70: 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  n);.      pRight
3b80: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
3b90: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
3ba0: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
3bb0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3bc0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
3bd0: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
3be0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3bf0: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
3c00: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
3c10: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
3c20: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
3c30: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
3c40: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
3c50: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
3c60: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
3c70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
3c80: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
3c90: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
3ca0: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
3cb0: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
3cc0: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
3cd0: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
3ce0: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
3cf0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
3d00: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
3d10: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
3d20: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3d30: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
3d40: 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74     IdList *pList
3d50: 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e   = pRight->pUsin
3d60: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
3d70: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
3d80: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
3d90: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
3da0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65  * Name of the te
3db0: 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  rm in the USING 
3dc0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
3dd0: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
3de0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74     /* Table on t
3df0: 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74  he left with mat
3e00: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
3e10: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3e20: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a   iLeftCol;    /*
3e30: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3e40: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
3e50: 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  n on the left */
3e60: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69  .        int iRi
3e70: 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c  ghtCol;   /* Col
3e80: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3e90: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3ea0: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20   the right */.. 
3eb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
3ec0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
3ed0: 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74  ;.        iRight
3ee0: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
3ef0: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
3f00: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
3f10: 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20   iRightCol<0.   
3f20: 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41        || !tableA
3f30: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  ndColumnIndex(pS
3f40: 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20  rc, i+1, zName, 
3f50: 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f  &iLeft, &iLeftCo
3f60: 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  l).        ){.  
3f70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3f80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3f90: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
3fa0: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
3fb0: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
3fc0: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
3fd0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
3fe0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
3ff0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4010: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
4020: 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  rse, pSrc, iLeft
4030: 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c  , iLeftCol, i+1,
4040: 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20   iRightCol,.    
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
4070: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
4080: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4090: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n 0;.}../* Forwa
40a0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
40b0: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
40c0: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
40d0: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
40e0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
40f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
4100: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
4110: 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d  ist,     /* Form
4120: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
4130: 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78  ect from this Ex
4140: 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  prList */.  int 
4150: 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
4160: 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74   /* Begin with t
4170: 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c  his column of pL
4180: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
4190: 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tra           /*
41a0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65   Add this many e
41b0: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  xtra columns to 
41c0: 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f  the end */.);../
41d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
41e0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
41f0: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4200: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4210: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4220: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4230: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4240: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4250: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4260: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4270: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4280: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4290: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
42a0: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
42b0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
42c0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
42d0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
42e0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
42f0: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4300: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4310: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4320: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4330: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4340: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4350: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4360: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4370: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4380: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4390: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
43a0: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
43b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
43c0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
43d0: 65 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a  e data array */.
43e0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
43f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
4400: 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20  of reg prior to 
4410: 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c  regData availabl
4420: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a  e for use */.){.
4430: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4440: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72     /* Stmt under
4470: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
4480: 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28  .  int bSeq = ((
4490: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
44a0: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
44b0: 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e  orter)==0);.  in
44c0: 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d  t nExpr = pSort-
44d0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
44e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
44f0: 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42  * No. of ORDER B
4500: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  Y terms */.  int
4510: 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b   nBase = nExpr +
4520: 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20   bSeq + nData;  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4540: 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65   Fields in sorte
4550: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4560: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
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 20 20 20 20 20 20 2f                 /
4590: 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65  * Regs for sorte
45a0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
45b0: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b  t regRecord = ++
45c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
45e0: 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74  * Assembled sort
45f0: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4600: 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72  nt nOBSat = pSor
4610: 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20  t->nOBSat;      
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
4640: 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69  s to skip */.  i
4650: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61    /* Opcode to a
4680: 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  dd sorter record
4690: 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20   to sorter */.  
46a0: 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20  int iLimit;     
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46c0: 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e     /* LIMIT coun
46d0: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
46e0: 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65  ( bSeq==0 || bSe
46f0: 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q==1 );.  assert
4700: 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65  ( nData==1 || re
4710: 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61  gData==regOrigDa
4720: 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74  ta || regOrigDat
4730: 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 50  a==0 );.  if( nP
4740: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
4750: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
4760: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
4770: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
4780: 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20  regData - nExpr 
4790: 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b  - bSeq;.  }else{
47a0: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
47b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
47c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
47d0: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
47e0: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
47f0: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
4800: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4810: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
4820: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
4830: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
4840: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
4850: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
4860: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
4870: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4880: 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74  abel(v);.  sqlit
4890: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
48a0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
48b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
48c0: 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61  ase, regOrigData
48d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
48f0: 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72  TE_ECEL_DUP | (r
4900: 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49  egOrigData? SQLI
4910: 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29  TE_ECEL_REF : 0)
4920: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
4930: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4940: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
4950: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
4960: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
4970: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
4980: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
4990: 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20  && nData>0 ){.  
49a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
49b0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
49c0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
49d0: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
49e0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
49f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4a00: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
4a10: 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61  Base+nOBSat, nBa
4a20: 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52 65  se-nOBSat, regRe
4a30: 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42  cord);.  if( nOB
4a40: 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Sat>0 ){.    int
4a50: 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f   regPrevKey;   /
4a60: 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53  * The first nOBS
4a70: 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  at columns of th
4a80: 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  e previous row *
4a90: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46 69  /.    int addrFi
4aa0: 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65  rst;    /* Addre
4ab0: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e  ss of the OP_IfN
4ac0: 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  ot opcode */.   
4ad0: 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20   int addrJmp;   
4ae0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
4af0: 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63   the OP_Jump opc
4b00: 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f  ode */.    VdbeO
4b10: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20  p *pOp;      /* 
4b20: 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e  Opcode that open
4b30: 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  s the sorter */.
4b40: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20      int nKey;   
4b50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4b60: 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63  of sorting key c
4b70: 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e  olumns, includin
4b80: 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f  g OP_Sequence */
4b90: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
4ba0: 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  I;     /* Origin
4bb0: 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68  al KeyInfo on th
4bc0: 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a  e sorter table *
4bd0: 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65  /..    regPrevKe
4be0: 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  y = pParse->nMem
4bf0: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
4c00: 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e  nMem += pSort->n
4c10: 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20  OBSat;.    nKey 
4c20: 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  = nExpr - pSort-
4c30: 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a  >nOBSat + bSeq;.
4c40: 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a      if( bSeq ){.
4c50: 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20        addrFirst 
4c60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4c70: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
4c80: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
4c90: 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20   .    }else{.   
4ca0: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
4cb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4cc0: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54  (v, OP_SequenceT
4cd0: 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  est, pSort->iECu
4ce0: 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rsor);.    }.   
4cf0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4d00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4d10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4d20: 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65  mpare, regPrevKe
4d30: 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72  y, regBase, pSor
4d40: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
4d50: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
4d60: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
4d70: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
4d80: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
4d90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4da0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
4db0: 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b  pOp->p2 = nKey +
4dc0: 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20   nData;.    pKI 
4dd0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
4de0: 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  fo;.    memset(p
4df0: 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  KI->aSortOrder, 
4e00: 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  0, pKI->nKeyFiel
4e10: 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f  d); /* Makes OP_
4e20: 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f  Jump testable */
4e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4e40: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
4e50: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
4e60: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
4e70: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c  tcase( pKI->nAll
4e80: 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65  Field > pKI->nKe
4e90: 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20  yField+2 );.    
4ea0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
4eb0: 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
4ec0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
4ed0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Sort->pOrderBy, 
4ee0: 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20 20  nOBSat,.        
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 20 20 20                  
4f10: 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c     pKI->nAllFiel
4f20: 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  d-pKI->nKeyField
4f30: 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70  -1);.    addrJmp
4f40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
4f50: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
4f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f70: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
4f80: 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64  addrJmp+1, 0, ad
4f90: 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f  drJmp+1); VdbeCo
4fa0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70  verage(v);.    p
4fb0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
4fc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4fd0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
4fe0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
4ff0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
5000: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
5010: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
5020: 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67  osub, pSort->reg
5030: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c  Return, pSort->l
5040: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
5050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5060: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
5070: 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ter, pSort->iECu
5080: 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69  rsor);.    if( i
5090: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73  Limit ){.      s
50a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
50b0: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c  (v, OP_IfNot, iL
50c0: 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  imit, pSort->lab
50d0: 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56  elDone);.      V
50e0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
50f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5100: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
5110: 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20   addrFirst);.   
5120: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5130: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
5140: 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79  Base, regPrevKey
5150: 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29  , pSort->nOBSat)
5160: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5170: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5180: 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rJmp);.  }.  if(
5190: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
51a0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
51b0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70  Sorter ){.    op
51c0: 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65   = OP_SorterInse
51d0: 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rt;.  }else{.   
51e0: 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65   op = OP_IdxInse
51f0: 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rt;.  }.  sqlite
5200: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5210: 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43  , op, pSort->iEC
5220: 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64  ursor, regRecord
5230: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5240: 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65           regBase
5250: 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e  +nOBSat, nBase-n
5260: 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69 4c  OBSat);.  if( iL
5270: 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  imit ){.    int 
5280: 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72 31  addr;.    int r1
5290: 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69 6c   = 0;.    /* Fil
52a0: 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e 74  l the sorter unt
52b0: 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 4c  il it contains L
52c0: 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74 72  IMIT+OFFSET entr
52d0: 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d 69  ies.  (The iLimi
52e0: 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65  t.    ** registe
52f0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
5300: 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20 4c   with value of L
5310: 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20 41  IMIT+OFFSET.)  A
5320: 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72 0a  fter the sorter.
5330: 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70 2c      ** fills up,
5340: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61 73   delete the leas
5350: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  t entry in the s
5360: 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63 68  orter after each
5370: 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a 20   insert..    ** 
5380: 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68 6f  Thus we never ho
5390: 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  ld more than the
53a0: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72 6f   LIMIT+OFFSET ro
53b0: 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74 20  ws in memory at 
53c0: 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64 72  once */.    addr
53d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
53e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
53f0: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56  Zero, iLimit); V
5400: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5410: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5420: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
5430: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
5440: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72  r);.    if( pSor
5450: 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  t->bOrderedInner
5460: 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72 31  Loop ){.      r1
5470: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
5480: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
5490: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
54a0: 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d 3e  _Column, pSort->
54b0: 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72 2c  iECursor, nExpr,
54c0: 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
54d0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 71  Comment((v, "seq
54e0: 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  "));.    }.    s
54f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5500: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
5510: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
5520: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
5530: 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
5540: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  p ){.      /* If
5550: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5560: 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e 20  is driven by an 
5570: 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74 20  index such that 
5580: 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20 20  values from.    
5590: 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 74    ** the same it
55a0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  eration of the i
55b0: 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69 6e  nner loop are in
55c0: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 74   sorted order, t
55d0: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  hen.      ** imm
55e0: 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74 6f  ediately jump to
55f0: 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
5600: 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72 20  ion of an inner 
5610: 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20 20  loop if the.    
5620: 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d 20    ** entry from 
5630: 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65 72  the current iter
5640: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 66  ation does not f
5650: 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70 0a  it into the top.
5660: 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b 4f        ** LIMIT+O
5670: 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f 66  FFSET entries of
5680: 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a   the sorter. */.
5690: 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20 3d        int iBrk =
56a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
56b0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a  entAddr(v) + 2;.
56c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
56d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
56e0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2c  , regBase+nExpr,
56f0: 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20   iBrk, r1);.    
5700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5710: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
5720: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
5730: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5740: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5750: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
5760: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   addr);.  }.}../
5770: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
5780: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
5790: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
57a0: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
57b0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
57c0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
57d0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
57e0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  VM */.  int iOff
57f0: 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67  set,      /* Reg
5800: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
5810: 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72  e offset counter
5820: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
5830: 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue     /* Jump 
5840: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
5850: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
5860: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66  */.){.  if( iOff
5870: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  set>0 ){.    sql
5880: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5890: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
58a0: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  set, iContinue, 
58b0: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
58c0: 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  (v);.    VdbeCom
58d0: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
58e0: 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  "));.  }.}../*.*
58f0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
5900: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
5910: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
5920: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
5930: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
5940: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
5950: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
5960: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
5970: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
5980: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
5990: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
59a0: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
59b0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
59c0: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
59d0: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
59e0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
59f0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
5a00: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
5a10: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
5a20: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
5a30: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
5a40: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
5a50: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
5a60: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
5a70: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
5a80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5a90: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
5aa0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5ab0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5ac0: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
5ad0: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
5ae0: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
5af0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
5b00: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
5b10: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
5b20: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
5b30: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
5b40: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
5b50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5b60: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
5b70: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
5b80: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
5b90: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
5ba0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
5bb0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
5bc0: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
5bd0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5be0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
5bf0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5c00: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
5c10: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
5c20: 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65  em, N); VdbeCove
5c30: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
5c40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5c50: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
5c60: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
5c70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5c80: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
5c90: 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69  ert, iTab, r1, i
5ca0: 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74  Mem, N);.  sqlit
5cb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
5cc0: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
5cd0: 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
5ce0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
5cf0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
5d00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5d10: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
5d20: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
5d30: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
5d40: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
5d50: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
5d60: 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74   srcTab is negat
5d70: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 2d  ive, then the p-
5d80: 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69  >pEList expressi
5d90: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
5da0: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
5db0: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
5dc0: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
5dd0: 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72  srcTab is.** zer
5de0: 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20  o or more, then 
5df0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
5e00: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
5e10: 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  ->pEList is used
5e20: 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74   only .** to get
5e30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
5e40: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 63  olumns and the c
5e50: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
5e60: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
5e70: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
5e80: 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  d selectInnerLoo
5e90: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
5ea0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
5eb0: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
5ec0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
5ed0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
5ee0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
5ef0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
5f00: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
5f10: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
5f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
5f30: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
5f40: 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65   table if non-ne
5f50: 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72 74  gative */.  Sort
5f60: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
5f70: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
5f80: 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20  LL, info on how 
5f90: 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52  to process ORDER
5fa0: 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63   BY */.  Distinc
5fb0: 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c  tCtx *pDistinct,
5fc0: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
5fd0: 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   info on how to 
5fe0: 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54  process DISTINCT
5ff0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
6000: 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
6010: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
6020: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
6030: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
6040: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
6050: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
6060: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
6070: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
6080: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
6090: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
60a0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
60b0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29   inner loop */.)
60c0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
60d0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
60e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
60f0: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
6100: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6110: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
6120: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
6130: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  /.  int eDest = 
6140: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20  pDest->eDest;   
6150: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
6160: 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a  e of results */.
6170: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
6180: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a  est->iSDParm; /*
6190: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
61a0: 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  to disposal meth
61b0: 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73  od */.  int nRes
61c0: 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  ultCol;         
61d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
61e0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
61f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
6200: 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
6210: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
6220: 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62 65  tra registers be
6230: 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20 2a  fore regResult *
6240: 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c  /..  /* Usually,
6250: 20 72 65 67 52 65 73 75 6c 74 20 69 73 20 74 68   regResult is th
6260: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20  e first cell in 
6270: 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f  an array of memo
6280: 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f  ry cells.  ** co
6290: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
62a0: 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e  rent result row.
62b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65   In this case re
62c0: 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20  gOrig is set to 
62d0: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61  the.  ** same va
62e0: 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  lue. However, if
62f0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
6300: 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74   being sent to t
6310: 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20  he sorter, the. 
6320: 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61   ** values for a
6330: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ny expressions t
6340: 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72  hat are also par
6350: 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65  t of the sort-ke
6360: 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20  y are omitted.  
6370: 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72  ** from this arr
6380: 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ay. In this case
6390: 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20   regOrig is set 
63a0: 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69  to zero.  */.  i
63b0: 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20  nt regResult;   
63c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
63d0: 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f  art of memory ho
63e0: 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65  lding current re
63f0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72  sults */.  int r
6400: 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20  egOrig;         
6410: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
6420: 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e  of memory holdin
6430: 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f  g full result (o
6440: 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72  r 0) */..  asser
6450: 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74  t( v );.  assert
6460: 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
6470: 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  ;.  hasDistinct 
6480: 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44  = pDistinct ? pD
6490: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
64a0: 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49  pe : WHERE_DISTI
64b0: 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20  NCT_NOOP;.  if( 
64c0: 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e  pSort && pSort->
64d0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53  pOrderBy==0 ) pS
64e0: 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ort = 0;.  if( p
64f0: 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44  Sort==0 && !hasD
6500: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61  istinct ){.    a
6510: 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65  ssert( iContinue
6520: 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f  !=0 );.    codeO
6530: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
6540: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
6550: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
6560: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
6570: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52  lumns..  */.  nR
6580: 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45  esultCol = p->pE
6590: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
65a0: 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
65b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
65c0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  Sort ){.      nP
65d0: 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74  refixReg = pSort
65e0: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
65f0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70  r;.      if( !(p
6600: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
6610: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
6620: 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52  rter) ) nPrefixR
6630: 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  eg++;.      pPar
6640: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65  se->nMem += nPre
6650: 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  fixReg;.    }.  
6660: 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
6670: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
6680: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
6690: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
66a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65  .  }else if( pDe
66b0: 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c  st->iSdst+nResul
66c0: 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e  tCol > pParse->n
66d0: 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Mem ){.    /* Th
66e0: 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63  is is an error c
66f0: 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61  ondition that ca
6700: 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78  n result, for ex
6710: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45  ample, when a SE
6720: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  LECT.    ** on t
6730: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
6740: 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20  de of an INSERT 
6750: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65  contains more re
6760: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
6770: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61  n.    ** there a
6780: 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  re columns in th
6790: 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  e table on the l
67a0: 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20  eft.  The error 
67b0: 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20  will be caught. 
67c0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74     ** and report
67d0: 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77  ed later.  But w
67e0: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
67f0: 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72  ure enough memor
6800: 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20  y is allocated. 
6810: 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f     ** to avoid o
6820: 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72  ther spurious er
6830: 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e  rors in the mean
6840: 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  time. */.    pPa
6850: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
6860: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70  sultCol;.  }.  p
6870: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52  Dest->nSdst = nR
6880: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f  esultCol;.  regO
6890: 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20  rig = regResult 
68a0: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
68b0: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
68c0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
68d0: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
68e0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
68f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6900: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
6910: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
6920: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
6930: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
6940: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ->pEList->a[i].z
6950: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
6960: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21  }else if( eDest!
6970: 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20  =SRT_Exists ){. 
6980: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
6990: 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45  tination is an E
69a0: 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65  XISTS(...) expre
69b0: 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61  ssion, the actua
69c0: 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  l.    ** values 
69d0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
69e0: 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72  SELECT are not r
69f0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
6a00: 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73      u8 ecelFlags
6a10: 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d  ;.    if( eDest=
6a20: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
6a30: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
6a40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
6a50: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65  utine ){.      e
6a60: 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  celFlags = SQLIT
6a70: 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20  E_ECEL_DUP;.    
6a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65  }else{.      ece
6a90: 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  lFlags = 0;.    
6aa0: 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  }.    if( pSort 
6ab0: 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d  && hasDistinct==
6ac0: 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f  0 && eDest!=SRT_
6ad0: 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65 73  EphemTab && eDes
6ae0: 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a  t!=SRT_Table ){.
6af0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63        /* For eac
6b00: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
6b10: 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20 69  p->pEList that i
6b20: 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65  s a copy of an e
6b30: 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20  xpression in.   
6b40: 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20     ** the ORDER 
6b50: 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74  BY clause (pSort
6b60: 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74  ->pOrderBy), set
6b70: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
6b80: 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72  .      ** iOrder
6b90: 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f  ByCol value to o
6ba0: 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  ne more than the
6bb0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52   index of the OR
6bc0: 44 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a  DER BY .      **
6bd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
6be0: 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  in the sort-key 
6bf0: 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72  that pushOntoSor
6c00: 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72  ter() will gener
6c10: 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ate..      ** Th
6c20: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 2d  is allows the p-
6c30: 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74 6f  >pEList field to
6c40: 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   be omitted from
6c50: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 63 6f   the sorted reco
6c60: 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76  rd,.      ** sav
6c70: 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43 50  ing space and CP
6c80: 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20  U cycles.  */.  
6c90: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d      ecelFlags |=
6ca0: 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d   (SQLITE_ECEL_OM
6cb0: 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43 45  ITREF|SQLITE_ECE
6cc0: 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20 20 66 6f  L_REF);.      fo
6cd0: 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r(i=pSort->nOBSa
6ce0: 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64  t; i<pSort->pOrd
6cf0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
6d00: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
6d10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6a  ;.        if( (j
6d20: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
6d30: 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
6d40: 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20  derByCol)>0 ){. 
6d50: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
6d60: 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69  st->a[j-1].u.x.i
6d70: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b 31  OrderByCol = i+1
6d80: 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a  -pSort->nOBSat;.
6d90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6da0: 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69 67 20  }.      regOrig 
6db0: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
6dc0: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  t( eDest==SRT_Se
6dd0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
6de0: 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20 20  Mem .           
6df0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6e00: 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74  routine || eDest
6e10: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
6e20: 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73 75 6c      }.    nResul
6e30: 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  tCol = sqlite3Ex
6e40: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
6e50: 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73 74 2c  Parse,p->pEList,
6e60: 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20  regResult,.     
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 20 20                  
6e90: 20 20 20 20 30 2c 65 63 65 6c 46 6c 61 67 73 29      0,ecelFlags)
6ea0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6eb0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
6ec0: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
6ed0: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
6ee0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
6ef0: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
6f00: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
6f10: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
6f20: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
6f30: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
6f40: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
6f50: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
6f60: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
6f70: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
6f80: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6f90: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
6fa0: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
6fb0: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
6fc0: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
6fd0: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
6fe0: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
6ff0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7000: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
7010: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
7020: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
7030: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
7040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
7050: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
7060: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
7070: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
7080: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
7090: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
70a0: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
70b0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
70c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
70d0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
70e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
70f0: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
7100: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
7110: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
7120: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
7130: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
7140: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
7150: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
7160: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
7170: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
7180: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
7190: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
71a0: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
71b0: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
71c0: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
71d0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
71e0: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
71f0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
7200: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
7210: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
7220: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7230: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
7240: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
7250: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
7260: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
7270: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
7280: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
7290: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
72a0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
72b0: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
72c0: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
72d0: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
72e0: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
72f0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
7300: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
7310: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
7320: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
7330: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
7340: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
7350: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
7360: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
7370: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
7380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
7390: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
73a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
73b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
73c0: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
73d0: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
73e0: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
73f0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
7400: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
7410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7430: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
7440: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
7450: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
7460: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
7470: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7480: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
7490: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
74a0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
74b0: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
74c0: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
74d0: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
74e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
74f0: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
7500: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
7510: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7520: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
7530: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
7540: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
7550: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
7560: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7570: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7580: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
7590: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
75a0: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
75b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
75c0: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
75d0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
75e0: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
75f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
7600: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
7610: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
7620: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7630: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
7640: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
7650: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
7660: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
7670: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
7680: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
7690: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
76a0: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
76b0: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
76c0: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
76d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
76e0: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
76f0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
7700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7710: 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30      if( pSort==0
7720: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
7730: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
7740: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
7750: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
7760: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
7770: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
7780: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
7790: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
77a0: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
77b0: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
77c0: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
77d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
77e0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
77f0: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
7800: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
7810: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
7820: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7830: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7850: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
7860: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
7870: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
7880: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
7890: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
78a0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
78b0: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67  , iParm, r1, reg
78c0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
78d0: 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ol);.      sqlit
78e0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
78f0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
7900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7910: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
7920: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
7930: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
7940: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
7950: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
7960: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
7970: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
7980: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
7990: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
79a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
79b0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
79c0: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
79d0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
79e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
79f0: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
7a00: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
7a10: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7a20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7a30: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7a40: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7a50: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
7a60: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
7a70: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
7a80: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
7a90: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7aa0: 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65  T_Fifo:.    case
7ab0: 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20   SRT_DistFifo:. 
7ac0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
7ad0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
7ae0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
7af0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
7b00: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
7b10: 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65  Parse, nPrefixRe
7b20: 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  g+1);.      test
7b30: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7b40: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
7b50: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7b60: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
7b70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7b80: 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f   eDest==SRT_Fifo
7b90: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7ba0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  se( eDest==SRT_D
7bb0: 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20  istFifo );.     
7bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7bd0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
7be0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
7bf0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e  nResultCol, r1+n
7c00: 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e  PrefixReg);.#ifn
7c10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7c20: 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65 44  CTE.      if( eD
7c30: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
7c40: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
7c50: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
7c60: 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20  on is DistFifo, 
7c70: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
7c80: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
7c90: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65        ** on an e
7ca0: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20  phemeral index. 
7cb0: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  If the current r
7cc0: 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  ow is already pr
7cd0: 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  esent.        **
7ce0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64   in the index, d
7cf0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74  o not write it t
7d00: 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66  o the output. If
7d10: 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20   not, add the.  
7d20: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
7d30: 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65   row to the inde
7d40: 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69  x and proceed wi
7d50: 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f  th writing it to
7d60: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7d70: 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73 20  output table as 
7d80: 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  well.  */.      
7d90: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
7da0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
7db0: 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20  ddr(v) + 4;.    
7dc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7dd0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
7de0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61  ound, iParm+1, a
7df0: 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ddr, r1, 0);.   
7e00: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
7e10: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
7e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7e30: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
7e40: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c  rt, iParm+1, r1,
7e50: 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c  regResult,nResul
7e60: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61  tCol);.        a
7e70: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
7e80: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
7e90: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
7ea0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
7eb0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
7ec0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31  se, pSort, p, r1
7ed0: 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67 52  +nPrefixReg,regR
7ee0: 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52  esult,1,nPrefixR
7ef0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
7f00: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
7f10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7f20: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7f50: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
7f60: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7f70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7f80: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
7f90: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
7fa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7fb0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
7fc0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
7fd0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7fe0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7ff0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
8000: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
8010: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
8020: 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52  se, r1, nPrefixR
8030: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65  eg+1);.      bre
8040: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
8050: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8060: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
8070: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
8080: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
8090: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
80a0: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
80b0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
80c0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
80d0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
80e0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
80f0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
8100: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
8110: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
8120: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
8130: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
8140: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8150: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
8160: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
8170: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
8180: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
8190: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
81a0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
81b0: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
81c0: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
81d0: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
81e0: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
81f0: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
8200: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
8210: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
8220: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
8230: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
8240: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
8250: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
8260: 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20  oSorter(.       
8270: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f       pParse, pSo
8280: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
8290: 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75  , regOrig, nResu
82a0: 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65  ltCol, nPrefixRe
82b0: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
82c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
82d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
82e0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
82f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
8300: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65  ite3Strlen30(pDe
8310: 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d 6e  st->zAffSdst)==n
8320: 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 20  ResultCol );.   
8330: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8340: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
8350: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
8360: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
8370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c  .            r1,
8380: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
8390: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
83a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
83b0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
83c0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
83d0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
83e0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
83f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
8400: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
8410: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
8420: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8430: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8440: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8450: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
8460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8470: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
8480: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
8490: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
84a0: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
84b0: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
84c0: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
84d0: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
84e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
84f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8500: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
8510: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
8520: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
8530: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
8540: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
8550: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8560: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
8570: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
8580: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
8590: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
85a0: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
85b0: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
85c0: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
85d0: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
85e0: 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20 0a  ll or array of .
85f0: 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 65      ** memory ce
8600: 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  lls and break ou
8610: 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  t of the scan lo
8620: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
8630: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
8640: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
8650: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8660: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70 44  ( nResultCol<=pD
8670: 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20  est->nSdst );.  
8680: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
8690: 72 74 65 72 28 0a 20 20 20 20 20 20 20 20 20 20  rter(.          
86a0: 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c    pParse, pSort,
86b0: 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72   p, regResult, r
86c0: 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43  egOrig, nResultC
86d0: 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b  ol, nPrefixReg);
86e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
86f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
8700: 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d  esultCol==pDest-
8710: 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20  >nSdst );.      
8720: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65 73    assert( regRes
8730: 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20  ult==iParm );.  
8740: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
8750: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
8760: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
8770: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
8780: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8790: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
87a0: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
87b0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
87c0: 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54  */..    case SRT
87d0: 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20  _Coroutine:     
87e0: 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74    /* Send data t
87f0: 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  o a co-routine *
8800: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  /.    case SRT_O
8810: 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20  utput: {        
8820: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  /* Return the re
8830: 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  sults */.      t
8840: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8850: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
8860: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8870: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8880: 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
8890: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
88a0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
88b0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
88c0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
88d0: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
88e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
88f0: 20 20 20 20 20 20 20 20 20 6e 50 72 65 66 69 78           nPrefix
8900: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
8910: 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54  e if( eDest==SRT
8920: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
8930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8940: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
8950: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
8960: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
8970: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8980: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8990: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
89a0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
89b0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
89c0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
89d0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
89e0: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
89f0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8a00: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
8a10: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
8a20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
8a30: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
8a40: 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  e results into a
8a50: 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65 20   priority queue 
8a60: 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61 63  that is order ac
8a70: 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a  cording to.    *
8a80: 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  * pDest->pOrderB
8a90: 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65  y (in pSO).  pDe
8aa0: 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20  st->iSDParm (in 
8ab0: 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63 75  iParm) is the cu
8ac0: 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20  rsor for an.    
8ad0: 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70 53  ** index with pS
8ae0: 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d  O->nExpr+2 colum
8af0: 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79  ns.  Build a key
8b00: 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74   using pSO for t
8b10: 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  he first.    ** 
8b20: 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d  pSO->nExpr colum
8b30: 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ns, then make su
8b40: 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20  re all keys are 
8b50: 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e 67  unique by adding
8b60: 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20   a.    ** final 
8b70: 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75  OP_Sequence colu
8b80: 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f  mn.  The last co
8b90: 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f  lumn is the reco
8ba0: 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20  rd as a blob..  
8bb0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8bc0: 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20  T_DistQueue:.   
8bd0: 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a   case SRT_Queue:
8be0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65   {.      int nKe
8bf0: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  y;.      int r1,
8c00: 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69   r2, r3;.      i
8c10: 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b  nt addrTest = 0;
8c20: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
8c30: 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20  *pSO;.      pSO 
8c40: 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  = pDest->pOrderB
8c50: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
8c60: 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b   pSO );.      nK
8c70: 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b  ey = pSO->nExpr;
8c80: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
8c90: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
8ca0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20  arse);.      r2 
8cb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8cc0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b  Range(pParse, nK
8cd0: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20  ey+2);.      r3 
8ce0: 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20  = r2+nKey+1;.   
8cf0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
8d00: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
8d10: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
8d20: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
8d30: 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20  DistQueue, then 
8d40: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
8d50: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
8d60: 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20   ** on a second 
8d70: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
8d80: 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76  that holds all v
8d90: 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65 76  alues every prev
8da0: 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a  iously.        *
8db0: 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 71  * added to the q
8dc0: 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ueue. */.       
8dd0: 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69   addrTest = sqli
8de0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
8df0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
8e00: 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20  arm+1, 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 20 20 20                  
8e30: 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52     regResult, nR
8e40: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
8e50: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
8e60: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
8e70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8e80: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
8e90: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
8ea0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29   nResultCol, r3)
8eb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
8ec0: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
8ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8ee0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8ef0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
8f00: 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20  Parm+1, r3);.   
8f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8f20: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8f30: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
8f40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8f50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79   for(i=0; i<nKey
8f60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8f70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8f80: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20  2(v, OP_SCopy,. 
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
8fb0: 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75  lt + pSO->a[i].u
8fc0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
8fd0: 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   1,.            
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 32                r2
8ff0: 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
9000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9010: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
9020: 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e  nce, iParm, r2+n
9030: 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Key);.      sqli
9040: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9050: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
9060: 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b  r2, nKey+2, r1);
9070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9080: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
9090: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
90a0: 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65 79  rm, r1, r2, nKey
90b0: 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  +2);.      if( a
90c0: 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65  ddrTest ) sqlite
90d0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
90e0: 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20   addrTest);.    
90f0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
9100: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
9110: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
9120: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
9130: 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e  ge(pParse, r2, n
9140: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72  Key+2);.      br
9150: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
9160: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9170: 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21  _CTE */....#if !
9180: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9190: 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20  MIT_TRIGGER).   
91a0: 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
91b0: 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69  results.  This i
91c0: 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43  s used for SELEC
91d0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  T statements ins
91e0: 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  ide.    ** the b
91f0: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
9200: 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
9210: 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69  f such selects i
9220: 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  s to call.    **
9230: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
9240: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  nctions that hav
9250: 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20  e side effects. 
9260: 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   We do not care.
9270: 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65      ** about the
9280: 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20   actual results 
9290: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20  of the select.. 
92a0: 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
92b0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
92c0: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t( eDest==SRT_Di
92d0: 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62  scard );.      b
92e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
92f0: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  if.  }..  /* Jum
9300: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
9310: 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
9320: 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
9330: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20  .  Except, if.  
9340: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f  ** there is a so
9350: 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63  rter, in which c
9360: 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68  ase the sorter h
9370: 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74  as already limit
9380: 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70  ed.  ** the outp
9390: 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a  ut for us..  */.
93a0: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26    if( pSort==0 &
93b0: 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & p->iLimit ){. 
93c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
93d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
93e0: 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  umpZero, p->iLim
93f0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
9400: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
9410: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
9420: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
9430: 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20  ject sufficient 
9440: 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20  for an index of 
9450: 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e  N key columns an
9460: 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c  d.** X extra col
9470: 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  umns..*/.KeyInfo
9480: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
9490: 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64  Alloc(sqlite3 *d
94a0: 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29  b, int N, int X)
94b0: 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  {.  int nExtra =
94c0: 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43   (N+X)*(sizeof(C
94d0: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73 69  ollSeq*)+1) - si
94e0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a  zeof(CollSeq*);.
94f0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73    KeyInfo *p = s
9500: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
9510: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4b  wNN(db, sizeof(K
9520: 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72 61  eyInfo) + nExtra
9530: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
9540: 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
9550: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c  = (u8*)&p->aColl
9560: 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4b  [N+X];.    p->nK
9570: 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e  eyField = (u16)N
9580: 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69 65  ;.    p->nAllFie
9590: 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29 3b  ld = (u16)(N+X);
95a0: 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e  .    p->enc = EN
95b0: 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  C(db);.    p->db
95c0: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52   = db;.    p->nR
95d0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73  ef = 1;.    mems
95e0: 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78  et(&p[1], 0, nEx
95f0: 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tra);.  }else{. 
9600: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
9610: 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  lt(db);.  }.  re
9620: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
9630: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65   Deallocate a Ke
9640: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
9650: 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49  void sqlite3KeyI
9660: 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f  nfoUnref(KeyInfo
9670: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
9680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9690: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
96a0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
96b0: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71   p->nRef==0 ) sq
96c0: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70 2d  lite3DbFreeNN(p-
96d0: 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  >db, p);.  }.}..
96e0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77  /*.** Make a new
96f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
9700: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
9710: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
9720: 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e  KeyInfoRef(KeyIn
9730: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
9740: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9750: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
9760: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  p->nRef++;.  }. 
9770: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69   return p;.}..#i
9780: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9790: 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  G./*.** Return T
97a0: 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f  RUE if a KeyInfo
97b0: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63   object can be c
97c0: 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49  hange.  The KeyI
97d0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61  nfo object.** ca
97e0: 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65  n only be change
97f0: 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  d if this is jus
9800: 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72  t a single refer
9810: 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65  ence to the obje
9820: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ct..**.** This r
9830: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
9840: 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73  nly inside of as
9850: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
9860: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9870: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
9880: 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ble(KeyInfo *p){
9890: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d   return p->nRef=
98a0: 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =1; }.#endif /* 
98b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
98c0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
98d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
98e0: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
98f0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
9900: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
9910: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
9920: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
9930: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
9940: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9950: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
9960: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
9970: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
9980: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
9990: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
99a0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
99b0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
99c0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
99d0: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
99e0: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
99f0: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
9a00: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
9a10: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
9a20: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
9a30: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
9a40: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
9a50: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
9a60: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
9a70: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
9a80: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
9a90: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
9aa0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
9ab0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
9ac0: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
9ad0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
9ae0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
9af0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
9b00: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
9b10: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
9b20: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
9b30: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
9b40: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
9b50: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
9b60: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
9b70: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
9b80: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9b90: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9ba0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
9bb0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
9bc0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
9bd0: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
9be0: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
9bf0: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
9c00: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
9c10: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
9c20: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
9c30: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
9c40: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
9c50: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a  o the end */.){.
9c60: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
9c70: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
9c80: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9c90: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
9ca0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9cb0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
9cc0: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
9cd0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
9ce0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
9cf0: 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
9d00: 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78 74  xpr-iStart, nExt
9d10: 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49 6e  ra+1);.  if( pIn
9d20: 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  fo ){.    assert
9d30: 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
9d40: 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66  IsWriteable(pInf
9d50: 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  o) );.    for(i=
9d60: 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c  iStart, pItem=pL
9d70: 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69  ist->a+iStart; i
9d80: 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  <nExpr; i++, pIt
9d90: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 6e  em++){.      pIn
9da0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
9db0: 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rt] = sqlite3Exp
9dc0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
9dd0: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
9de0: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
9df0: 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61  SortOrder[i-iSta
9e00: 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  rt] = pItem->sor
9e10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
9e20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
9e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  ;.}../*.** Name 
9e40: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
9e50: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
9e60: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
9e70: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
9e80: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
9e90: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
9ea0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
9eb0: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
9ec0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
9ed0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
9ee0: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
9ef0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
9f00: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
9f10: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
9f20: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
9f30: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
9f40: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9f50: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
9f60: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
9f70: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
9f80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
9f90: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9fa0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
9fb0: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22  *.** Unless an "
9fc0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
9fd0: 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62  AN" command is b
9fe0: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
9ff0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
a000: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
a010: 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20  erwise, it adds 
a020: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
a030: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51  output to the EQ
a040: 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65  P result,.** whe
a050: 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69  re the caption i
a060: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
a070: 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50  *.**   "USE TEMP
a080: 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22   B-TREE FOR xxx"
a090: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78  .**.** where xxx
a0a0: 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54   is one of "DIST
a0b0: 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59  INCT", "ORDER BY
a0c0: 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e  " or "GROUP BY".
a0d0: 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a   Exactly which.*
a0e0: 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  * is determined 
a0f0: 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72  by the zUsage ar
a100: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
a110: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65  c void explainTe
a120: 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  mpTable(Parse *p
a130: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
a140: 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66  r *zUsage){.  if
a150: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
a160: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
a170: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a180: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
a190: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
a1a0: 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
a1b0: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
a1c0: 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67  E FOR %s", zUsag
a1d0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
a1e0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a1f0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
a200: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
a210: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
a220: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
a230: 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73  * Assign express
a240: 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20  ion b to lvalue 
a250: 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d  a. A second, no-
a260: 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  op, version of t
a270: 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20  his macro.** is 
a280: 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51  provided when SQ
a290: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
a2a0: 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  N is defined. Th
a2b0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  is allows the co
a2c0: 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33  de.** in sqlite3
a2d0: 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69  Select() to assi
a2e0: 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72  gn values to str
a2f0: 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61  ucture member va
a300: 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20  riables that.** 
a310: 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51  only exist if SQ
a320: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
a330: 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  N is not defined
a340: 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69   without polluti
a350: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  ng the.** code w
a360: 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65  ith #ifndef dire
a370: 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66  ctives..*/.# def
a380: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
a390: 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20  teger(a, b) a = 
a3a0: 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  b..#else./* No-o
a3b0: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
a3c0: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
a3d0: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
a3e0: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
a3f0: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
a400: 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20  e(y,z).# define 
a410: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
a420: 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23  r(y,z).#endif..#
a430: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a440: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
a450: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
a460: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
a470: 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20  D_SELECT)./*.** 
a480: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
a490: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
a4a0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
a4b0: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
a4c0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
a4d0: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
a4e0: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
a4f0: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
a500: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
a510: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
a520: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
a530: 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66  one of the two f
a540: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43  orms:.**.**   "C
a550: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
a560: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
a570: 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22  ub2 (op)".**   "
a580: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
a590: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
a5a0: 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20  Sub2 USING TEMP 
a5b0: 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a  B-TREE (op)".**.
a5c0: 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61  ** where iSub1 a
a5d0: 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65  nd iSub2 are the
a5e0: 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64   integers passed
a5f0: 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
a600: 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  nding.** functio
a610: 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e  n parameters, an
a620: 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74  d op is the text
a630: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
a640: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
a650: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
a660: 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65  name. The parame
a670: 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65  ter "op" must be
a680: 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   one of TK_UNION
a690: 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20  , TK_EXCEPT,.** 
a6a0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20  TK_INTERSECT or 
a6b0: 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73  TK_ALL. The firs
a6c0: 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69  t form is used i
a6d0: 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54  f argument bUseT
a6e0: 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c  mp is .** false,
a6f0: 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66   or the second f
a700: 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75  orm if it is tru
a710: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
a720: 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  d explainComposi
a730: 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  te(.  Parse *pPa
a740: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
a750: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
a760: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
a770: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
a780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a790: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
a7a0: 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a  TK_EXCEPT etc. *
a7b0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20  /.  int iSub1,  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
a7e0: 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53  id 1 */.  int iS
a7f0: 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub2,            
a800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
a810: 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20  query id 2 */.  
a820: 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20  int bUseTmp     
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d  /* True if a tem
a850: 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64  p table was used
a860: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
a870: 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c   op==TK_UNION ||
a880: 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
a890: 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
a8a0: 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  CT || op==TK_ALL
a8b0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
a8c0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
a8d0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
a8e0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
a8f0: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
a900: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20  lite3MPrintf(.  
a910: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
a920: 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51  , "COMPOUND SUBQ
a930: 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64  UERIES %d AND %d
a940: 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c   %s(%s)", iSub1,
a950: 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20   iSub2,.        
a960: 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54  bUseTmp?"USING T
a970: 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c  EMP B-TREE ":"",
a980: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70   selectOpName(op
a990: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ).    );.    sql
a9a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
a9b0: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
a9c0: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
a9d0: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
a9e0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
a9f0: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
aa00: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
aa10: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
aa20: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
aa30: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
aa40: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76  plainComposite(v
aa50: 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
aa60: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
aa70: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
aa80: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
aa90: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
aaa0: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
aab0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
aac0: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
aad0: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
aae0: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
aaf0: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
ab00: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
ab10: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
ab20: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
ab30: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
ab40: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
ab50: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
ab60: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
ab70: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
ab80: 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50  ateSortTail(.  P
ab90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
aba0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
abb0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
abc0: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
abd0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
abe0: 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  nt */.  SortCtx 
abf0: 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66  *pSort,   /* Inf
ac00: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20  ormation on the 
ac10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ac20: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
ac30: 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ,      /* Number
ac40: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
ac50: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
ac60: 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72  est *pDest /* Wr
ac70: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
ac80: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
ac90: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
aca0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
acd0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
ace0: 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20  int addrBreak = 
acf0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65  pSort->labelDone
ad00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
ad10: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69  Jump here to exi
ad20: 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  t loop */.  int 
ad30: 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73  addrContinue = s
ad40: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ad50: 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70  bel(v);  /* Jump
ad60: 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63   here for next c
ad70: 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ycle */.  int ad
ad80: 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e  dr;.  int addrOn
ad90: 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  ce = 0;.  int iT
ada0: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
adb0: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74  pOrderBy = pSort
adc0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
add0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
ade0: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
adf0: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
ae00: 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52  Parm;.  int regR
ae10: 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ow;.  int regRow
ae20: 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  id;.  int iCol;.
ae30: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e    int nKey;.  in
ae40: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae60: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
ae70: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
ae80: 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20   int nSortData; 
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c   /* Trailing val
aeb0: 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ues to read from
aec0: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74   sorter */.  int
aed0: 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20   i;.  int bSeq; 
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
af00: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69   sorter record i
af10: 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e  ncludes seq. no.
af20: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
af30: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74  rList_item *aOut
af40: 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Ex = p->pEList->
af50: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64  a;..  assert( ad
af60: 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69  drBreak<0 );.  i
af70: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
af80: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  kOut ){.    sqli
af90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
afa0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
afb0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
afc0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
afd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
afe0: 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61  Goto(v, addrBrea
aff0: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
b000: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b010: 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  v, pSort->labelB
b020: 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61  kOut);.  }.  iTa
b030: 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  b = pSort->iECur
b040: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
b050: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
b060: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
b070: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
b080: 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  RT_Mem ){.    re
b090: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  gRowid = 0;.    
b0a0: 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e  regRow = pDest->
b0b0: 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74  iSdst;.    nSort
b0c0: 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  Data = nColumn;.
b0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
b0e0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
b0f0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
b100: 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  );.    regRow = 
b110: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
b120: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
b130: 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44  umn);.    nSortD
b140: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
b150: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
b160: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
b170: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
b180: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
b190: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
b1a0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
b1b0: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
b1c0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
b1d0: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
b1e0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
b1f0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
b200: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
b210: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
b220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
b230: 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
b240: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b250: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b260: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b270: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72  OpenPseudo, iSor
b280: 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  tTab, regSortOut
b290: 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61  , nKey+1+nSortDa
b2a0: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  ta);.    if( add
b2b0: 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56  rOnce ) sqlite3V
b2c0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b2d0: 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64  ddrOnce);.    ad
b2e0: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
b2f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b300: 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61  _SorterSort, iTa
b310: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
b320: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
b330: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
b340: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
b350: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
b360: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b370: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
b380: 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72  terData, iTab, r
b390: 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74  egSortOut, iSort
b3a0: 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d  Tab);.    bSeq =
b3b0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
b3c0: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
b3d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b3e0: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
b3f0: 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
b400: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b410: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
b420: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
b430: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53  ontinue);.    iS
b440: 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ortTab = iTab;. 
b450: 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d     bSeq = 1;.  }
b460: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c  .  for(i=0, iCol
b470: 3d 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c 6e 53  =nKey+bSeq; i<nS
b480: 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20  ortData; i++){. 
b490: 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20     int iRead;.  
b4a0: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
b4b0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
b4c0: 29 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d  ){.      iRead =
b4d0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
b4e0: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
b4f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b500: 52 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b 0a 20  Read = iCol++;. 
b510: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b520: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b530: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
b540: 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77  b, iRead, regRow
b550: 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  +i);.    VdbeCom
b560: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61  ment((v, "%s", a
b570: 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f  OutEx[i].zName ?
b580: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
b590: 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70   : aOutEx[i].zSp
b5a0: 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  an));.  }.  swit
b5b0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
b5c0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
b5d0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
b5e0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
b5f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b600: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
b610: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
b620: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
b630: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b640: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
b650: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
b660: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
b670: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
b680: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
b690: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b6a0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
b6b0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b6c0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
b6d0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
b6e0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69  t( nColumn==sqli
b6f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73  te3Strlen30(pDes
b700: 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a  t->zAffSdst) );.
b710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b720: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
b730: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
b740: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f  , nColumn, regRo
b750: 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
b760: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
b770: 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43  st->zAffSdst, nC
b780: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71  olumn);.      sq
b790: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
b7a0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
b7b0: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
b7c0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
b7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b7e0: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
b7f0: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
b800: 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  id, regRow, nCol
b810: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
b820: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b830: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
b840: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
b850: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
b860: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
b870: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
b880: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b890: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
b8a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b8b0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
b8c0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
b8d0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
b8e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
b8f0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
b900: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b910: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
b920: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
b930: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b940: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
b950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b960: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
b970: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  Row, pDest->iSds
b980: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
b990: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b9a0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
b9b0: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73  nge(pParse, pDes
b9c0: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
b9d0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
b9e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b9f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ba00: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
ba10: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
ba20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ba30: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65    }.  }.  if( re
ba40: 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66  gRowid ){.    if
ba50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  ( eDest==SRT_Set
ba60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ba70: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
ba80: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
ba90: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
baa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
bab0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
bac0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
bad0: 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  w);.    }.    sq
bae0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
baf0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
bb00: 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  owid);.  }.  /* 
bb10: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
bb20: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
bb30: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
bb40: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
bb50: 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53  tinue);.  if( pS
bb60: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
bb70: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
bb80: 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
bb90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bba0: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
bbb0: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
bbc0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
bbd0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
bbe0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bbf0: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
bc00: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
bc10: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
bc20: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
bc30: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
bc40: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
bc50: 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  n, pSort->regRet
bc60: 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  urn);.  sqlite3V
bc70: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
bc80: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d  v, addrBreak);.}
bc90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
bca0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
bcb0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
bcc0: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
bcd0: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
bce0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
bcf0: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
bd00: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
bd10: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
bd20: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  ller..**.** Also
bd30: 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
bd40: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
bd50: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
bd60: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a  and return that.
bd70: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45  ** result in *pE
bd80: 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54  stWidth..**.** T
bd90: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
bda0: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
bdb0: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
bdc0: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
bdd0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
bde0: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
bdf0: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
be00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
be10: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
be20: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
be30: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
be40: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
be50: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
be60: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
be70: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
be80: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
be90: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
bea0: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
beb0: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
bec0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
bed0: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
bee0: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
bef0: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
bf00: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
bf10: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
bf20: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
bf30: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
bf40: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
bf50: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
bf60: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
bf70: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
bf80: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
bf90: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
bfa0: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
bfb0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
bfc0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
bfd0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
bfe0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
bff0: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
c000: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
c010: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65  is routine has e
c020: 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72  ither 3 or 6 par
c030: 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e  ameters dependin
c040: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
c050: 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  not.** the SQLIT
c060: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c070: 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65  METADATA compile
c080: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
c090: 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  used..*/.#ifdef 
c0a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c0b0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20  LUMN_METADATA.# 
c0c0: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
c0d0: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
c0e0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
c0f0: 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f 2a 20  C,D,E).#else /* 
c100: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c110: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c120: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
c130: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
c140: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
c150: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 29  umnTypeImpl(A,B)
c160: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
c170: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
c180: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
c190: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
c1a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
c1b0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c1c0: 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a 70 45  ADATA.  Expr *pE
c1d0: 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78 70 72  xpr.#else.  Expr
c1e0: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
c1f0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
c200: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
c210: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
c220: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
c230: 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b 0a 20  gCol.#endif.){. 
c240: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
c250: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
c260: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c270: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c280: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
c290: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
c2a0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
c2b0: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
c2c0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
c2d0: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
c2e0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
c2f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
c300: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
c310: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
c320: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
c330: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
c340: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
c350: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
c360: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
c370: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
c380: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
c390: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
c3a0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
c3b0: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
c3c0: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
c3d0: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
c3e0: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
c3f0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
c400: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
c410: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
c420: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c430: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
c440: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
c450: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
c460: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
c470: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
c480: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
c490: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
c4a0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
c4b0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
c4c0: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
c4d0: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
c4e0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
c4f0: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74   pTab */.      t
c500: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
c510: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
c520: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
c530: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
c540: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
c550: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
c560: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
c570: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
c580: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
c590: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
c5a0: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
c5b0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
c5c0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
c5d0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
c5e0: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
c5f0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
c600: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
c610: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
c620: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
c630: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
c640: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
c650: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
c660: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
c670: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
c680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
c690: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
c6a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
c6b0: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
c6c0: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
c6d0: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
c6e0: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
c6f0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
c700: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
c710: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
c720: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
c730: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
c740: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
c750: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
c760: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
c770: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
c780: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
c790: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
c7a0: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
c7b0: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
c7c0: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
c7d0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
c7e0: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
c7f0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
c800: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
c810: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
c820: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
c830: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
c840: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
c850: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c860: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
c870: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
c880: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
c890: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
c8a0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
c8b0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
c8c0: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
c8d0: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
c8e0: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
c8f0: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
c900: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
c910: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
c920: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
c930: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
c940: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
c950: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
c960: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
c970: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
c980: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
c990: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
c9a0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
c9b0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
c9c0: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
c9d0: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
c9e0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
c9f0: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
ca00: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
ca10: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
ca20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ca30: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
ca40: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
ca50: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
ca60: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
ca70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
ca80: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
ca90: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
caa0: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
cab0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
cac0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
cad0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
cae0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
caf0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
cb00: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
cb10: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
cb20: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
cb30: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
cb40: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
cb50: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
cb60: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e  >=0 && iCol<pS->
cb70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
cb80: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
cb90: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
cba0: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
cbb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
cbc0: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
cbd0: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
cbe0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
cbf0: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
cc00: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
cc10: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
cc20: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
cc30: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
cc40: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
cc50: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
cc60: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e    */.          N
cc70: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
cc80: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
cc90: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
cca0: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20  a[iCol].pExpr;. 
ccb0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72           sNC.pSr
ccc0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
ccd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
cce0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
ccf0: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
cd00: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
cd10: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
cd20: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
cd30: 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26  NC, p,&zOrigDb,&
cd40: 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43  zOrigTab,&zOrigC
cd50: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ol); .        }.
cd60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cd70: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
cd80: 61 62 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61  able or a CTE ta
cd90: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
cda0: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69  ssert( !pS );.#i
cdb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cdc0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
cdd0: 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  TA.        if( i
cde0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
cdf0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
ce00: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
ce10: 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69  ==XN_ROWID || (i
ce20: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
ce30: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
ce40: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
ce50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
ce60: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
ce70: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
ce80: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
ce90: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
cea0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
ceb0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
cec0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
ced0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c       zType = sql
cee0: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26  ite3ColumnType(&
cef0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cf00: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ,0);.        }. 
cf10: 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20         zOrigTab 
cf20: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
cf30: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
cf40: 70 50 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e  pParse && pTab->
cf50: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
cf60: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
cf70: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
cf80: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
cf90: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
cfa0: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
cfb0: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
cfc0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
cfd0: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
cfe0: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
cff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
d000: 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28  l==XN_ROWID || (
d010: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
d020: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
d030: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
d040: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
d050: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
d060: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d070: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
d080: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
d090: 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c  Type(&pTab->aCol
d0a0: 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20  [iCol],0);.     
d0b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d0c0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d0d0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
d0e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
d0f0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
d100: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
d110: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
d120: 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  n is a sub-selec
d130: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
d140: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
d150: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67  nd.      ** orig
d160: 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20  in info for the 
d170: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e  single column in
d180: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d190: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
d1a0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
d1b0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d1c0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
d1d0: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
d1e0: 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  pS = pExpr->x.pS
d1f0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
d200: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
d210: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
d220: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
d230: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
d240: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
d250: 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ) );.      sNC.p
d260: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
d270: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
d280: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
d290: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
d2a0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
d2b0: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
d2c0: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
d2d0: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
d2e0: 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20  , &zOrigCol); . 
d2f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d300: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
d310: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d320: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
d330: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
d340: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
d350: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
d360: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
d370: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
d380: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
d390: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
d3a0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
d3b0: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
d3c0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
d3d0: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
d3e0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
d3f0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
d400: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
d410: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
d420: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
d430: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
d440: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
d450: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
d460: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d470: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
d480: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
d490: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
d4a0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
d4b0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
d4c0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
d4d0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
d4e0: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
d4f0: 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  set */.){.#ifnde
d500: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
d510: 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76  CLTYPE.  Vdbe *v
d520: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d530: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
d540: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
d550: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
d560: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
d570: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
d580: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b    sNC.pNext = 0;
d590: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
d5a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
d5b0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
d5c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
d5d0: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
d5e0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64  har *zType;.#ifd
d5f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d600: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d610: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d620: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
d630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
d640: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
d650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
d660: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54  gCol = 0;.    zT
d670: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
d680: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
d690: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
d6a0: 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20  zOrigCol);..    
d6b0: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
d6c0: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
d6d0: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
d6e0: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
d6f0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
d700: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
d710: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
d720: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
d730: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
d740: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
d750: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
d760: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
d770: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d780: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
d790: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
d7a0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
d7b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d7c0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d7d0: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
d7e0: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
d7f0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d800: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d810: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d820: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
d830: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
d840: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
d850: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d860: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d870: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
d880: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d890: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d8a0: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
d8b0: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
d8c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
d8d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
d8e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d8f0: 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a  DECLTYPE) */.}..
d900: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
d910: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d920: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
d930: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
d940: 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
d950: 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
d960: 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
d970: 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
d980: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
d990: 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
d9a0: 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
d9b0: 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
d9c0: 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
d9d0: 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
d9e0: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
d9f0: 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
da00: 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
da10: 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
da20: 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
da30: 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
da40: 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
da50: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
da60: 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
da70: 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
da80: 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
da90: 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
daa0: 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
dab0: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
dac0: 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
dad0: 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
dae0: 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
daf0: 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73  *.** See Also: s
db00: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
db10: 6d 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a  mExprList().**.*
db20: 2a 20 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f  * The PRAGMA sho
db30: 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20  rt_column_names 
db40: 61 6e 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f  and PRAGMA full_
db50: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74  column_names set
db60: 74 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70  tings are.** dep
db70: 72 65 63 61 74 65 64 2e 20 20 54 68 65 20 64 65  recated.  The de
db80: 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73  fault setting is
db90: 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d   short=ON, full=
dba0: 4f 46 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61  OFF.  99.9% of a
dbb0: 6c 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ll.** applicatio
dbc0: 6e 73 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74  ns should operat
dbd0: 65 20 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76  e this way.  Nev
dbe0: 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65  ertheless, we ne
dbf0: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68  ed to support th
dc00: 65 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73  e.** other modes
dc10: 20 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a   for legacy:.**.
dc20: 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c  **    short=OFF,
dc30: 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
dc40: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74  Column name is t
dc50: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 65  he text of the e
dc60: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74  xpression has it
dc70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65   originally appe
dca0: 61 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ars in the SELEC
dcb0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  T statement.  In
dcc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
dcf0: 65 20 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72  e zSpan of the r
dd00: 65 73 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e  esult expression
dd10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  ..**.**    short
dd20: 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20  =ON, full=OFF:  
dd30: 20 20 20 20 20 28 54 68 69 73 20 69 73 20 74 68       (This is th
dd40: 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
dd50: 67 29 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  g).  If the resu
dd60: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 72 65 66 65 72 73 20 64 69 72 65 63 74     refers direct
dd90: 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f  ly to a table co
dda0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a  lumn, then the.*
ddb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
ddd0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
dde0: 65 20 69 73 20 6a 75 73 74 20 74 68 65 20 74 61  e is just the ta
ddf0: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20  ble column.**   
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a             name:
de20: 20 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77   COLUMN.  Otherw
de30: 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
de40: 2a 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c  *.**    full=ON,
de50: 20 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20   short=ANY:     
de60: 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
de70: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
de80: 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  to a table colum
de90: 6e 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n,.**           
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 74 68 65 6e 20 74 68 65 20 72 65 73 75     then the resu
dec0: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  lt column name w
ded0: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
dee0: 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  me.**           
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54     prefix, ex: T
df10: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74  ABLE.COLUMN.  Ot
df20: 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70 61  herwise use zSpa
df30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
df40: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
df50: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
df60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
df70: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
df80: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
df90: 65 63 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ect     /* Gener
dfa0: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ate column names
dfb0: 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
dfc0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
dfd0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
dfe0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
dff0: 74 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t i;.  Table *pT
e000: 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
e010: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
e020: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
e030: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e040: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
e050: 75 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54  ullName;    /* T
e060: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e  ABLE.COLUMN if n
e070: 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20  o AS clause and 
e080: 69 73 20 61 20 64 69 72 65 63 74 20 74 61 62 6c  is a direct tabl
e090: 65 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73  e ref */.  int s
e0a0: 72 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43  rcName;     /* C
e0b0: 4f 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43  OLUMN or TABLE.C
e0c0: 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63  OLUMN if no AS c
e0d0: 6c 61 75 73 65 20 61 6e 64 20 69 73 20 64 69 72  lause and is dir
e0e0: 65 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ect */..#ifndef 
e0f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
e100: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
e110: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
e120: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
e130: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
e140: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
e150: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
e160: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
e170: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
e180: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e190: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20   ) return;.  /* 
e1a0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  Column names are
e1b0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
e1c0: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
e1d0: 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  m of a compound 
e1e0: 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c  select */.  whil
e1f0: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
e200: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
e210: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
e220: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65    pTabList = pSe
e230: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45  lect->pSrc;.  pE
e240: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
e250: 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
e260: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
e270: 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20  rt( pTabList!=0 
e280: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  );.  pParse->col
e290: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
e2a0: 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e  fullName = (db->
e2b0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
e2c0: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
e2d0: 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62  .  srcName = (db
e2e0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
e2f0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
e300: 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a  =0 || fullName;.
e310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e320: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
e330: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
e340: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
e350: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
e360: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
e370: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a  t->a[i].pExpr;..
e380: 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30      assert( p!=0
e390: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e3a0: 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  p->op!=TK_AGG_CO
e3b0: 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20  LUMN );  /* Agg 
e3c0: 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e  processing has n
e3d0: 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20  ot run yet */.  
e3e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
e3f0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
e400: 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43  >pTab!=0 ); /* C
e410: 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20  overing idx not 
e420: 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20  yet coded */.   
e430: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
e440: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
e450: 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65   /* An AS clause
e460: 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69   always takes fi
e470: 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a  rst priority */.
e480: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
e490: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
e4a0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
e4b0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
e4c0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
e4d0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
e4e0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
e4f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e500: 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70  srcName && p->op
e510: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
e520: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
e530: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
e540: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
e550: 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54      pTab = p->pT
e560: 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ab;.      assert
e570: 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
e580: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
e590: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
e5a0: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
e5b0: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
e5c0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
e5d0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
e5e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e5f0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
e600: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
e610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
e620: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
e630: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
e640: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e650: 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  fullName ){.    
e660: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
e670: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
e680: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
e690: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
e6a0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
e6b0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
e6c0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
e6d0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
e6e0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
e6f0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
e700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e710: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e720: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
e730: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
e740: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
e750: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
e760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
e780: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
e790: 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
e7a0: 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
e7b0: 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
e7c0: 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
e7d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
e7e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e7f0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
e800: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
e810: 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
e820: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
e830: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
e840: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
e850: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
e860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
e870: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
e880: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
e890: 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
e8a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
e8b0: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
e8c0: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
e8d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
e8e0: 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
e8f0: 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
e900: 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
e910: 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
e920: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
e930: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
e940: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
e950: 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
e960: 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
e970: 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
e980: 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
e990: 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
e9a0: 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
e9b0: 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
e9c0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
e9d0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
e9e0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
e9f0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
ea00: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
ea10: 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
ea20: 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
ea30: 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
ea40: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
ea50: 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  NOMEM..**.** The
ea60: 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20   only guarantee 
ea70: 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65  that SQLite make
ea80: 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
ea90: 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20  ames is that if 
eaa0: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61  the.** column ha
eab0: 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61  s an AS clause a
eac0: 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61  ssigning it a na
ead0: 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  me, that will be
eae0: 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a   the name used..
eaf0: 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f  ** That is the o
eb00: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67  nly documented g
eb10: 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76  uarantee.  Howev
eb20: 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70  er, countless ap
eb30: 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65  plications.** de
eb40: 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65  veloped over the
eb50: 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65   years have made
eb60: 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70   baseless assump
eb70: 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75  tions about colu
eb80: 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20  mn names.** and 
eb90: 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68  will break if th
eba0: 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ose assumptions 
ebb0: 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c  changes.  Hence,
ebc0: 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75   use extreme cau
ebd0: 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64  tion.** when mod
ebe0: 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74  ifying this rout
ebf0: 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65  ine to avoid bre
ec00: 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a  aking legacy..**
ec10: 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65  .** See Also: ge
ec20: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
ec30: 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s().*/.int sqlit
ec40: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
ec50: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
ec60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
ec70: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ec80: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
ec90: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
eca0: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
ecb0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
ecc0: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
ecd0: 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ecf0: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
ed00: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
ed10: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
ed20: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
ed30: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
ed40: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
ed50: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
ed60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ed70: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
ed80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
ed90: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
edb0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
edc0: 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20    u32 cnt;      
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ede0: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
edf0: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
ee00: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
ee10: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
ee20: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
ee30: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
ee40: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
ee50: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
ee60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ee70: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
ee80: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
ee90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
eea0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
eeb0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
eec0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
eef0: 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
ef00: 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20    Hash ht;      
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef20: 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63   Hash table of c
ef30: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
ef40: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
ef50: 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45  t(&ht);.  if( pE
ef60: 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
ef70: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
ef80: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
ef90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
efa0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
efb0: 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
efc0: 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
efd0: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
efe0: 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
eff0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  aCol = 0;.  }.  
f000: 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69  assert( nCol==(i
f010: 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e  16)nCol );.  *pn
f020: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
f030: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
f040: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
f050: 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64  ol; i<nCol && !d
f060: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
f070: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
f080: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
f090: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
f0a0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
f0b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61   */.    if( (zNa
f0c0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
f0d0: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
f0e0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
f0f0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
f100: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
f110: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
f120: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
f130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f140: 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
f150: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
f160: 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
f170: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
f180: 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45      while( pColE
f190: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
f1a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45  ){.        pColE
f1b0: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
f1c0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
f1d0: 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
f1e0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
f1f0: 20 20 20 20 20 69 66 28 20 28 70 43 6f 6c 45 78       if( (pColEx
f200: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
f210: 4e 20 7c 7c 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  N || pColExpr->o
f220: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
f230: 29 0a 20 20 20 20 20 20 20 26 26 20 70 43 6f 6c  ).       && pCol
f240: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 0a 20  Expr->pTab!=0 . 
f250: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
f260: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
f270: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
f280: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
f290: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
f2a0: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
f2b0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
f2c0: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
f2d0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
f2e0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
f2f0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
f300: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
f310: 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
f320: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
f330: 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
f340: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
f350: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
f360: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
f370: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
f380: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
f390: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
f3a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
f3b0: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
f3c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f3d0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
f3e0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
f3f0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
f400: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
f410: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
f420: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
f430: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
f440: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
f450: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
f460: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
f470: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
f480: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
f490: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
f4a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
f4b0: 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b  "column%d",i+1);
f4c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
f4d0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
f4e0: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
f4f0: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
f500: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
f510: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
f520: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
f530: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
f540: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
f550: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
f560: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
f570: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
f580: 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
f590: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
f5a0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
f5b0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
f5c0: 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
f5d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
f5e0: 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
f5f0: 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
f600: 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
f610: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
f620: 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
f630: 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
f640: 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
f650: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
f660: 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
f670: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
f680: 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
f690: 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
f6a0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
f6b0: 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
f6c0: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
f6d0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
f6e0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
f6f0: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
f700: 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
f710: 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
f720: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
f730: 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
f740: 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
f750: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
f760: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
f770: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
f780: 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
f790: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
f7a0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
f7b0: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
f7c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f7d0: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
f7e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f7f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
f800: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
f810: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
f820: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
f830: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
f840: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
f850: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f860: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
f870: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
f880: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
f890: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
f8a0: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
f8b0: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
f8c0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
f8d0: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
f8e0: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
f8f0: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
f900: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
f910: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
f920: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
f930: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
f940: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
f950: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
f960: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
f970: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
f980: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f990: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
f9a0: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
f9b0: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
f9c0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
f9d0: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
f9e0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
f9f0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
fa00: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
fa10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
fa20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
fa30: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
fa40: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
fa50: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
fa60: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
fa70: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
fa80: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
fa90: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
faa0: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
fab0: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
fac0: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
fad0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fae0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
faf0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
fb00: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
fb10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
fb20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
fb30: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
fb40: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
fb50: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
fb60: 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
fb70: 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
fb80: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
fb90: 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
fba0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
fbb0: 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
fbc0: 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
fbd0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
fbe0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
fbf0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
fc00: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
fc10: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
fc20: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
fc30: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
fc40: 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
fc50: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
fc60: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
fc70: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
fc80: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
fc90: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
fca0: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74   *zType;.    int
fcb0: 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61   n, m;.    p = a
fcc0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a  [i].pExpr;.    z
fcd0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
fce0: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
fcf0: 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43 6f 6c   0);.    /* pCol
fd00: 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20 2f 2f  ->szEst = ... //
fd10: 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65 73 74   Column size est
fd20: 20 66 6f 72 20 53 45 4c 45 43 54 20 74 61 62 6c   for SELECT tabl
fd30: 65 73 20 6e 65 76 65 72 20 75 73 65 64 20 2a 2f  es never used */
fd40: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
fd50: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
fd60: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
fd70: 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20    if( zType ){. 
fd80: 20 20 20 20 20 6d 20 3d 20 73 71 6c 69 74 65 33       m = sqlite3
fd90: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
fda0: 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
fdb0: 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d  e3Strlen30(pCol-
fdc0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
fdd0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Col->zName = sql
fde0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
fdf0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
fe00: 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20  ame, n+m+2);.   
fe10: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61     if( pCol->zNa
fe20: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  me ){.        me
fe30: 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d  mcpy(&pCol->zNam
fe40: 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d  e[n+1], zType, m
fe50: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  +1);.        pCo
fe60: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
fe70: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
fe80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fe90: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
fea0: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
feb0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
fec0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
fed0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
fee0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
fef0: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
ff00: 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43  Coll && pCol->zC
ff10: 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
ff20: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
ff30: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ff40: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
ff50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
ff60: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b  b->szTabRow = 1;
ff70: 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f   /* Any non-zero
ff80: 20 76 61 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a   value works */.
ff90: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
ffa0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ffb0: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
ffc0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
ffd0: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
ffe0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
fff0: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
10000 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
10010 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
10020 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
10030 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
10040 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
10050 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10060 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10070 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
10080 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
10090 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
100a0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
100b0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
100c0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
100d0 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
100e0 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
100f0 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
10100 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
10110 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
10120 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
10130 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
10140 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
10150 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
10160 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
10170 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
10180 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
10190 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
101a0 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
101b0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
101c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
101d0 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
101e0 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
101f0 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
10200 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
10210 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
10220 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
10230 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
10240 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
10250 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54  le );.  pTab->nT
10260 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  abRef = 1;.  pTa
10270 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
10280 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
10290 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
102a0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
102b0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
102c0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
102d0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
102e0 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
102f0 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
10300 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
10310 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
10320 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
10330 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
10340 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
10350 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
10360 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
10370 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
10380 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
10390 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
103a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
103b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
103c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
103d0 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
103e0 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
103f0 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
10400 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
10410 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
10420 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10430 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
10440 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
10450 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
10460 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
10470 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
10480 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  if( pParse->pVdb
10490 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
104a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
104b0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
104c0 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
104d0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
104e0 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
104f0 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  db,SQLITE_Factor
10500 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20  OutConst).  ){. 
10510 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e     pParse->okCon
10520 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20  stFactor = 1;.  
10530 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
10540 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
10550 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rse);.}.../*.** 
10560 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
10570 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
10580 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
10590 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
105a0 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
105b0 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
105c0 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
105d0 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
105e0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
105f0 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
10600 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
10610 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
10620 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
10630 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
10640 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
10650 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
10660 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
10670 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
10680 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
10690 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
106a0 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
106b0 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
106c0 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
106d0 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
106e0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
106f0 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
10700 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
10710 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
10720 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
10730 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10740 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
10750 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
10760 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
10770 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
10780 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
10790 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
107a0 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
107b0 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
107c0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
107d0 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
107e0 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
107f0 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a  values (zero).**
10800 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
10810 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
10820 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65  **.** The iOffse
10830 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69  t register (if i
10840 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69  t exists) is ini
10850 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
10860 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
10870 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69  OFFSET.  The iLi
10880 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20  mit register is 
10890 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
108a0 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a  IMIT.  Register.
108b0 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20  ** iOffset+1 is 
108c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
108d0 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a  IMIT+OFFSET..**.
108e0 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
108f0 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
10900 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
10910 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
10920 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
10930 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
10940 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
10950 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
10960 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
10970 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
10980 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
10990 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
109a0 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
109b0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
109c0 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
109d0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
109e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
109f0 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
10a00 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
10a10 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
10a20 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
10a30 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
10a40 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
10a50 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a   return;..  /* .
10a60 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
10a70 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
10a80 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
10a90 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
10aa0 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  oversy about wha
10ab0 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
10ac0 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
10ad0 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
10ae0 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
10af0 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
10b00 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
10b10 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
10b20 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
10b30 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
10b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
10b50 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d  pOffset==0 || p-
10b60 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >pLimit!=0 );.  
10b70 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
10b80 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
10b90 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
10ba0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
10bb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10bc0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
10bd0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
10be0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
10bf0 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
10c00 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  imit, &n) ){.   
10c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10c20 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
10c30 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a  er, n, iLimit);.
10c40 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
10c50 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
10c60 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69  nter"));.      i
10c70 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
10c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
10c90 74 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  to(v, iBreak);. 
10ca0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
10cb0 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  >=0 && p->nSelec
10cc0 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45  tRow>sqlite3LogE
10cd0 73 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20  st((u64)n) ){.  
10ce0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
10cf0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
10d00 45 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20  Est((u64)n);.   
10d10 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
10d20 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69   |= SF_FixedLimi
10d30 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
10d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
10d50 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10d60 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69  se, p->pLimit, i
10d70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
10d80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10d90 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
10da0 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
10db0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
10dc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10dd0 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
10de0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
10df0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10e00 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c  P_IfNot, iLimit,
10e10 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
10e20 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
10e30 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
10e40 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
10e50 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
10e60 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
10e70 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
10e80 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
10e90 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
10ea0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
10eb0 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
10ec0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10ed0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
10ee0 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
10ef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10f00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10f10 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
10f20 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
10f30 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
10f40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
10f50 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
10f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10f70 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
10f80 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  fsetLimit, iLimi
10f90 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f  t, iOffset+1, iO
10fa0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
10fb0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
10fc0 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
10fd0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
10fe0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10ff0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
11000 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11010 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
11020 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11030 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
11040 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
11050 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
11060 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
11070 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
11080 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
11090 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
110a0 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
110b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
110c0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
110d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
110e0 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
110f0 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
11100 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
11110 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
11120 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
11130 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
11140 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
11150 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
11160 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
11170 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11180 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
11190 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
111a0 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
111b0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
111c0 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
111d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
111e0 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
111f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11200 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
11210 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
11220 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74  ;.  /* iCol must
11230 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d   be less than p-
11240 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20  >pEList->nExpr. 
11250 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   Otherwise an er
11260 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68  ror would.  ** h
11270 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20  ave been thrown 
11280 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f  during name reso
11290 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f  lution and we wo
112a0 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74  uld not have got
112b0 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ten.  ** this fa
112c0 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d  r */.  if( pRet=
112d0 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
112e0 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
112f0 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20  pr) ){.    pRet 
11300 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
11310 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
11320 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
11330 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
11340 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
11350 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
11360 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
11370 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
11380 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
11390 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
113a0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
113b0 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
113c0 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
113d0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
113e0 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
113f0 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
11400 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
11410 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
11420 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
11430 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
11440 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
11450 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
11460 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
11470 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
11480 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
11490 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
114a0 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
114b0 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
114c0 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
114d0 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
114e0 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
114f0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
11500 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
11510 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
11520 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
11530 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
11540 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
11550 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
11560 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11570 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
11580 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
11590 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
115a0 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
115b0 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
115c0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
115d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
115e0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
115f0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
11600 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
11610 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
11620 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
11630 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
11640 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
11650 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
11660 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
11670 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
11680 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
11690 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
116a0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
116b0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
116c0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
116d0 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
116e0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
116f0 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
11700 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
11710 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
11720 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
11730 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
11740 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
11750 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
11760 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
11770 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
11780 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
11790 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
117a0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
117b0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
117c0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
117d0 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
117e0 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
117f0 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
11800 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
11810 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11820 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
11830 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
11840 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
11850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
11860 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11870 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
11880 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
11890 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
118a0 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
118b0 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
118c0 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
118d0 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
118e0 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
118f0 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
11900 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
11910 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
11930 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
11940 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
11950 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
119a0 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
119b0 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
119c0 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
119d0 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
119e0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
119f0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
11a00 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
11a10 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67   SrcList->a[].fg
11a20 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
11a30 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
11a40 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
11a50 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
11a60 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
11a70 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
11a80 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
11a90 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
11aa0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
11ab0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
11ac0 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
11ad0 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
11ae0 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
11af0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
11b00 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
11b10 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
11b20 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
11b30 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
11b40 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
11b50 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
11b60 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
11b70 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
11b80 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
11b90 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
11ba0 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
11bb0 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
11bc0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
11bd0 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
11be0 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
11bf0 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
11c00 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
11c10 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
11c20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
11c30 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
11c40 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
11c50 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
11c60 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
11c70 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
11c80 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
11c90 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
11ca0 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
11cb0 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
11cc0 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
11cd0 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
11ce0 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
11cf0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
11d00 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
11d10 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
11d20 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
11d30 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
11d40 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
11d50 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
11d60 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
11d70 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
11d80 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
11d90 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
11da0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
11db0 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
11dc0 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
11dd0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
11de0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
11df0 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
11e00 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
11e10 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
11e20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
11e30 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
11e40 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
11e50 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
11e60 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
11e70 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
11e80 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
11e90 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
11ea0 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
11eb0 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
11ec0 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
11ed0 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
11ee0 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
11ef0 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
11f00 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
11f10 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
11f20 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
11f30 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
11f40 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
11f50 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
11f60 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
11f70 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
11f80 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
11f90 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
11fa0 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
11fb0 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
11fc0 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
11fd0 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
11fe0 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
11ff0 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
12000 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
12010 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12020 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12030 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12050 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
12060 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
12070 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
12080 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
12090 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
120a0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
120b0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
120c0 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
120d0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
120e0 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
120f0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
12100 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
12110 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
12120 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
12130 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
12140 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
12150 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
12160 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
12170 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
12180 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
12190 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
121a0 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
121b0 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
121c0 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
121d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
12200 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
12210 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
12220 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
12230 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
12240 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
12250 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
12260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12270 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
12280 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
12290 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
122a0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
122b0 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
122c0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
122d0 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
122e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
122f0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
12300 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
12310 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
12320 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
12330 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
12340 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
12350 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
12360 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
12370 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
12380 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
12390 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
123a0 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
123b0 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
123c0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
123d0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
123f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
12400 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12430 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
12440 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
12450 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
12460 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
12470 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
12480 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
12490 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
124a0 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
124b0 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
124c0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
124d0 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
124e0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
124f0 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
12500 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
12510 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20   do a recursive 
12520 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73  query */.  if( s
12530 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12540 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
12550 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20  ECURSIVE, 0, 0, 
12560 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
12570 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c  /* Process the L
12580 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
12590 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79  clauses, if they
125a0 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72   exist */.  addr
125b0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
125c0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
125d0 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
125e0 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69   = 320;  /* 4 bi
125f0 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20  llion rows */.  
12600 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
12610 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
12620 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
12630 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
12640 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70  t;.  pOffset = p
12650 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67  ->pOffset;.  reg
12660 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
12670 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d  t;.  regOffset =
12680 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
12690 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f  ->pLimit = p->pO
126a0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ffset = 0;.  p->
126b0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
126c0 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
126d0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
126e0 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
126f0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
12700 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
12710 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
12720 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
12730 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
12740 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
12750 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  [i].fg.isRecursi
12760 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
12770 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
12780 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
12790 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
127a0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
127b0 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
127c0 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
127d0 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
127e0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
127f0 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
12800 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
12810 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
12820 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
12830 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
12840 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
12850 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
12860 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
12870 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
12880 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
12890 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
128a0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
128b0 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
128c0 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
128d0 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
128e0 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
128f0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
12900 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
12910 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
12920 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
12930 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
12940 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
12950 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
12960 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
12970 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
12980 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
12990 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
129a0 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
129b0 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
129c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
129d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
129e0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
129f0 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
12a00 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
12a10 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
12a20 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
12a30 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
12a40 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
12a50 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
12a60 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
12a70 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12a80 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
12a90 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
12aa0 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
12ad0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
12ae0 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
12af0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
12b00 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
12b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b20 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
12b30 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
12b40 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
12b50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
12b60 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
12b70 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
12b80 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
12b90 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
12ba0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12bb0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
12bc0 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
12bd0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
12be0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
12bf0 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
12c00 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
12c10 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
12c20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
12c30 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
12c40 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
12c50 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
12c60 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
12c70 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
12c80 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
12c90 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  t = 0;.  rc = sq
12ca0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12cb0 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
12cc0 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
12cd0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
12ce0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
12cf0 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
12d00 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
12d10 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
12d20 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
12d30 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
12d40 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
12d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12d60 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
12d70 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
12d80 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12d90 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
12da0 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
12db0 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
12dc0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
12dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12de0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
12df0 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
12e00 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
12e10 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
12e20 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
12e30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12e40 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
12e50 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
12e60 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
12e70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12e80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e90 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
12ea0 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
12eb0 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
12ec0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12ed0 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
12ee0 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
12ef0 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
12f00 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
12f10 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
12f20 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12f30 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
12f40 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
12f50 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
12f60 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
12f70 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74  rse, p, iCurrent
12f80 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
12f90 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
12fa0 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
12fb0 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
12fc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12fd0 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
12fe0 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
12ff0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
13000 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13010 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13020 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
13030 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
13040 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
13050 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
13060 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
13070 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
13080 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
13090 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
130a0 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
130b0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
130c0 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
130d0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
130e0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
130f0 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
13100 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13110 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
13120 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
13130 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
13140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
13150 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
13160 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13170 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75  arse, p, &destQu
13180 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  eue);.    assert
13190 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
131a0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
131b0 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20  = pSetup;.  }.. 
131c0 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67   /* Keep running
131d0 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20   the loop until 
131e0 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70  the Queue is emp
131f0 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ty */.  sqlite3V
13200 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54  dbeGoto(v, addrT
13210 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  op);.  sqlite3Vd
13220 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13230 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65  , addrBreak);..e
13240 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
13250 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33  query:.  sqlite3
13260 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
13270 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f  Parse->db, p->pO
13280 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f  rderBy);.  p->pO
13290 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
132a0 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  y;.  p->pLimit =
132b0 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f   pLimit;.  p->pO
132c0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
132d0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
132e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
132f0 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f  IT_CTE */../* Fo
13300 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
13310 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
13320 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
13330 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
13340 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
13350 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13360 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
13370 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13380 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
13390 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
133a0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
133b0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
133c0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
133d0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
133e0 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c  .);../*.** Handl
133f0 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  e the special ca
13400 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  se of a compound
13410 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69  -select that ori
13420 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a  ginates from a.*
13430 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  * VALUES clause.
13440 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68    By handling th
13450 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  is as a special 
13460 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64  case, we avoid d
13470 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e  eep.** recursion
13480 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f  , and thus do no
13490 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63  t need to enforc
134a0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  e the SQLITE_LIM
134b0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
134c0 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45  CT.** on a VALUE
134d0 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  S clause..**.** 
134e0 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65  Because the Sele
134f0 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e  ct object origin
13500 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55  ates from a VALU
13510 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20  ES clause:.**   
13520 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49  (1) It has no LI
13530 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a  MIT or OFFSET.**
13540 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73     (2) All terms
13550 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a   are UNION ALL.*
13560 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73  *   (3) There is
13570 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
13580 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  use.*/.static in
13590 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c  t multiSelectVal
135a0 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ues(.  Parse *pP
135b0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
135c0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
135d0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
135e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
135f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
13600 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
13610 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
13620 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
13630 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
13640 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
13650 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
13660 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52  pPrior;.  int nR
13670 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63  ow = 1;.  int rc
13680 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
13690 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
136a0 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20  _MultiValue );. 
136b0 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28   do{.    assert(
136c0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
136d0 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20  F_Values );.    
136e0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
136f0 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d  K_ALL || (p->op=
13700 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d  =TK_SELECT && p-
13710 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20  >pPrior==0) );. 
13720 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
13730 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  imit==0 );.    a
13740 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
13750 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t==0 );.    asse
13760 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
13770 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
13780 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70  xpr==p->pNext->p
13790 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
137a0 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f      if( p->pPrio
137b0 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
137c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
137d0 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b  ior->pNext==p );
137e0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
137f0 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a  or;.    nRow++;.
13800 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77    }while(1);.  w
13810 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70  hile( p ){.    p
13820 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
13830 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  r;.    p->pPrior
13840 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
13850 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13860 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
13870 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13880 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20  pPrior;.    if( 
13890 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
138a0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
138b0 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d  nRow;.    p = p-
138c0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
138d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
138e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
138f0 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
13900 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
13910 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
13920 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
13930 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
13940 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
13950 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
13960 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
13970 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
13980 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
13990 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
139a0 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
139b0 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
139c0 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
139d0 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
139e0 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
139f0 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
13a00 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
13a10 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
13a20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
13a30 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
13a40 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
13a50 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
13a60 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
13a70 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
13a80 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
13a90 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
13aa0 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
13ab0 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
13ac0 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
13ad0 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
13ae0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
13af0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
13b00 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
13b10 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
13b20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
13b30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
13b40 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
13b50 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
13b60 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
13b70 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
13b80 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
13b90 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
13ba0 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
13bb0 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
13bd0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
13be0 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
13bf0 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
13c00 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
13c10 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
13c20 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
13c30 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
13c40 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
13c50 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
13c60 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
13c70 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
13c80 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
13c90 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
13ca0 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
13cb0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
13cc0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
13cd0 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
13ce0 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
13cf0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
13d00 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
13d10 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
13d20 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
13d30 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
13d40 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
13d50 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
13d60 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
13d70 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
13d80 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
13d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13da0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
13db0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
13dc0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
13dd0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13de0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
13df0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13e00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
13e10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
13e20 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
13e30 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
13e40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
13e50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
13e60 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
13e70 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
13e80 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
13e90 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
13ea0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13eb0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
13ec0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
13ed0 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
13ee0 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
13ef0 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
13f00 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
13f10 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
13f20 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
13f30 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
13f40 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
13f50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
13f60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23   connection */.#
13f70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13f80 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
13f90 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20   iSub1 = 0;     
13fa0 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
13fb0 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
13fc0 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d  */.  int iSub2 =
13fd0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
13fe0 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
13ff0 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
14000 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
14010 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
14020 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
14030 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
14040 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
14050 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
14060 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
14070 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
14080 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
14090 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
140a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
140b0 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
140c0 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
140d0 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
140e0 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61  this much */.  a
140f0 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
14100 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
14110 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d  ve)==0 || p->op=
14120 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70  =TK_ALL || p->op
14130 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
14140 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14150 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
14160 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20  Prior;.  dest = 
14170 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
14180 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c  rior->pOrderBy |
14190 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  | pPrior->pLimit
141a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
141b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
141c0 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  %s clause should
141d0 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
141e0 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
141f0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
14200 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42  By!=0 ? "ORDER B
14210 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65  Y" : "LIMIT", se
14220 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
14230 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
14240 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14250 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
14260 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14270 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14280 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
14290 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
142a0 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
142b0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
142c0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
142d0 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
142e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
142f0 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
14300 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
14310 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
14320 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
14330 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
14340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14350 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
14360 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
14370 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
14380 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65  ->nExpr);.    de
14390 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
143a0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
143b0 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  Special handling
143c0 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d   for a compound-
143d0 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
143e0 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55  inates as a VALU
143f0 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ES clause..  */.
14400 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
14410 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
14420 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  e ){.    rc = mu
14430 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
14440 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
14450 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  );.    goto mult
14460 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
14470 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
14480 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
14490 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
144a0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
144b0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
144c0 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
144d0 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
144e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
144f0 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
14500 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72  EList );.  asser
14510 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  t( p->pEList->nE
14520 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr==pPrior->pEL
14530 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23  ist->nExpr );..#
14540 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14550 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e  IT_CTE.  if( p->
14560 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
14570 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67  cursive ){.    g
14580 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
14590 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65  siveQuery(pParse
145a0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d  , p, &dest);.  }
145b0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  else.#endif..  /
145c0 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
145d0 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
145e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
145f0 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
14600 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
14610 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
14620 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
14630 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
14640 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
14650 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
14660 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
14670 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
14680 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
14690 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
146a0 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
146b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
146c0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
146d0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
146e0 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
146f0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
14700 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
14710 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
14720 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  = p->iLimit;.   
14730 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73     pPrior->iOffs
14740 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
14750 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
14760 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
14770 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
14780 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
14790 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70  ffset;.      exp
147a0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
147b0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
147c0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
147d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
147e0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
147f0 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
14800 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
14810 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66   0;.      p->pOf
14820 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
14830 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14840 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
14850 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
14860 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14870 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
14880 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
14890 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  iLimit;.      p-
148a0 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
148b0 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
148c0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
148d0 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  ){.        addr 
148e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
148f0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
14900 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62   p->iLimit); Vdb
14910 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14920 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
14930 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61  t((v, "Jump ahea
14940 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
14950 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ed"));.        i
14960 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b  f( p->iOffset ){
14970 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14980 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14990 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a  OP_OffsetLimit,.
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149b0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
149c0 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65  Limit, p->iOffse
149d0 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  t+1, p->iOffset)
149e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
149f0 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69    }.      explai
14a00 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14a10 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
14a20 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14a40 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
14a50 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
14a60 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
14a70 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
14a80 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14a90 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14aa0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14ab0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
14ac0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
14ad0 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
14ae0 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
14af0 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66  ctRow);.      if
14b00 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
14b10 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
14b20 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
14b30 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20  pPrior->pLimit, 
14b40 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
14b50 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70  && nLimit>0 && p
14b60 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73  ->nSelectRow > s
14b70 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
14b80 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20  4)nLimit) .     
14b90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
14ba0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
14bb0 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
14bc0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
14bd0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
14be0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14bf0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14c00 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
14c10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14c20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
14c30 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
14c40 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
14c50 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
14c60 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
14c70 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
14c80 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
14c90 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
14ca0 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
14cb0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
14cc0 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
14cd0 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
14ce0 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
14cf0 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
14d00 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
14d10 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
14d20 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
14d30 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
14d40 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
14d50 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
14d60 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
14d70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
14d80 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
14d90 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
14da0 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
14db0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
14dc0 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20  =TK_EXCEPT );.  
14dd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
14de0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
14df0 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
14e00 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
14e10 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
14e20 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  ==priorOp ){.   
14e30 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
14e40 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
14e50 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
14e60 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
14e70 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
14e80 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
14e90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14ea0 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
14eb0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c        /* Not all
14ec0 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
14ed0 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
14ee0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14ef0 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
14f00 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
14f10 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
14f20 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
14f30 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74   unionTab = dest
14f40 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
14f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
14f60 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
14f70 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
14f80 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14f90 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
14fa0 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
14fb0 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
14fc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14fd0 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
14fe0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
14ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15000 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
15010 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
15020 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15030 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
15040 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
15050 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15060 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
15070 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
15080 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
15090 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
150a0 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67  .        findRig
150b0 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
150c0 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
150d0 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
150e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
150f0 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
15100 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
15110 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15120 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
15130 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
15140 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
15150 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
15160 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
15170 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73  stInit(&uniondes
15180 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  t, priorOp, unio
15190 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70  nTab);.      exp
151a0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
151b0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
151c0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
151d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
151e0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
151f0 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
15200 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
15210 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
15220 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
15230 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
15240 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
15250 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
15260 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
15270 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
15280 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
15290 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
152a0 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
152b0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
152c0 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
152d0 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
152e0 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
152f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
15300 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15310 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
15320 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
15330 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
15340 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
15350 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
15360 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
15370 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
15380 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65  st = op;.      e
15390 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
153a0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
153b0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
153c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
153d0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
153e0 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
153f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15400 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15410 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79  ;.      /* Query
15420 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
15430 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
15440 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
15450 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a  OrderBy..      *
15460 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
15470 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
15480 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
15490 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
154a0 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ak. */.      sql
154b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
154c0 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
154d0 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  By);.      pDele
154e0 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
154f0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
15500 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
15510 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
15520 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
15530 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
15540 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
15550 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
15560 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
15570 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
15580 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
15590 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
155a0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
155b0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
155c0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
155d0 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
155e0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
155f0 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
15600 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
15610 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20  Offset = 0;..   
15620 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
15630 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
15640 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
15650 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
15660 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
15670 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
15680 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
15690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
156a0 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53  nionTab==dest.iS
156b0 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  DParm || dest.eD
156c0 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
156d0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
156e0 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
156f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
15700 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
15710 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
15720 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
15730 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
15740 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15750 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
15760 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
15770 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15780 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
15790 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
157a0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
157b0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
157c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
157d0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
157e0 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
157f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15800 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
15810 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15820 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
15830 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
15840 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
15850 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20   unionTab,.     
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
15880 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
15890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
158a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
158b0 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
158c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
158d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
158e0 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
158f0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
15900 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
15910 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15920 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
15930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15940 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15950 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
15960 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
15970 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15980 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
15990 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
159a0 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20  INTERSECT ); {. 
159b0 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
159c0 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
159d0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
159e0 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
159f0 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
15a00 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  et;.      int ad
15a10 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
15a20 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65  Dest intersectde
15a30 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  st;.      int r1
15a40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
15a50 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
15a60 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
15a70 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
15a80 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
15a90 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
15aa0 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
15ab0 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
15ac0 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
15ad0 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
15ae0 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
15af0 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
15b00 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
15b10 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
15b20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
15b30 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
15b40 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
15b50 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rBy==0 );..     
15b60 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15b70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b80 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
15b90 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
15ba0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
15bb0 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
15bc0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
15bd0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
15be0 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69  dr;.      findRi
15bf0 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
15c00 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
15c10 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
15c20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15c30 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
15c40 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
15c50 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
15c60 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15c70 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
15c80 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
15c90 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
15ca0 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
15cb0 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
15cc0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
15cd0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
15ce0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
15cf0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
15d00 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
15d10 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
15d20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
15d30 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
15d40 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
15d50 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
15d60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
15d70 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
15d80 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
15d90 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
15da0 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
15db0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
15dc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15dd0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
15de0 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
15df0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
15e00 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
15e10 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
15e20 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
15e30 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
15e40 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
15e50 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
15e60 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
15e70 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
15e80 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
15e90 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
15ea0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
15eb0 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
15ec0 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
15ed0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
15ee0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
15ef0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
15f00 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
15f10 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
15f20 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
15f30 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
15f40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
15f50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
15f60 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
15f70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
15f80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
15f90 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
15fa0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
15fb0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
15fc0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
15fd0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
15fe0 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
15ff0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
16000 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
16010 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
16020 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
16030 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
16040 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
16050 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
16060 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
16070 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
16080 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
16090 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
160a0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
160b0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
160c0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
160d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
160e0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
160f0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
16100 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16110 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
16120 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
16130 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
16140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16150 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
16160 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
16170 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16180 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
16190 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
161a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
161b0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
161c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
161d0 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
161e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
161f0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
16200 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
16210 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20  ab2, iCont, r1, 
16220 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
16230 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
16240 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16250 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
16260 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
16270 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74  oop(pParse, p, t
16280 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ab1,.           
16290 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
162a0 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
162b0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
162c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
162d0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
162e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
162f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16300 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
16310 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
16320 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
16330 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16340 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
16350 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16360 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
16370 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
16380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16390 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
163a0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
163b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
163c0 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f    }..  explainCo
163d0 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
163e0 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
163f0 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41  ub2, p->op!=TK_A
16400 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  LL);..  /* Compu
16410 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
16420 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
16430 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
16440 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
16450 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
16460 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
16470 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
16480 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
16490 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
164a0 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
164b0 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
164c0 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
164d0 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
164e0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
164f0 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
16500 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
16510 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
16520 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
16530 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
16540 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
16550 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
16560 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
16570 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
16580 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
16590 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
165a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
165b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
165c0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
165d0 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
16600 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
16610 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
16620 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
16630 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
16640 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
16650 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
16660 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
16670 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
16680 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
16690 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
166a0 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
166b0 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
166c0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
166d0 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
166e0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
166f0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
16720 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
16730 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
16740 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
16750 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
16760 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
16770 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
16780 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
16790 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29  loc(db, nCol, 1)
167a0 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
167b0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
167c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
167d0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
167e0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
167f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
16800 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
16810 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
16820 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
16830 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
16840 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
16850 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
16860 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
16870 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
16880 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
16890 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
168a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
168b0 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
168c0 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
168d0 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
168e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
168f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
16900 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
16910 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
16920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
16930 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
16940 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
16950 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
16960 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
16970 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
16980 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
16990 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
169a0 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
169b0 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
169c0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
169d0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
169e0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
169f0 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
16a00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16a10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16a20 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
16a30 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
16a40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16a50 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
16a60 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
16a70 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
16a80 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
16ab0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
16ac0 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
16ad0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
16ae0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
16af0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
16b00 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
16b10 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
16b20 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
16b30 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
16b40 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
16b50 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
16b60 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
16b70 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
16b80 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
16b90 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
16ba0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
16bb0 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d  /../*.** Error m
16bc0 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20  essage for when 
16bd0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
16be0 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  s of a compound 
16bf0 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66  select have diff
16c00 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65  erent.** size re
16c10 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f  sult sets..*/.vo
16c20 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
16c30 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
16c40 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
16c50 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
16c60 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16c70 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
16c80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16c90 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20  sg(pParse, "all 
16ca0 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65  VALUES must have
16cb0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
16cc0 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d   of terms");.  }
16cd0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
16ce0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16cf0 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
16d00 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
16d10 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
16d20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
16d30 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
16d40 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
16d50 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
16d60 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  op));.  }.}../*.
16d70 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
16d80 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
16d90 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
16da0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
16db0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
16dc0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
16dd0 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
16de0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
16df0 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68   pIn->iSdst.  Th
16e00 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e  ere are.** pIn->
16e10 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  nSdst columns to
16e20 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
16e30 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
16e40 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
16e50 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
16e60 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
16e70 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
16e80 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
16e90 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
16ea0 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
16eb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
16ec0 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
16ed0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
16ee0 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
16ef0 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
16f00 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
16f10 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
16f20 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
16f30 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
16f40 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
16f50 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
16f60 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
16f70 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
16f80 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
16f90 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
16fa0 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
16fb0 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
16fc0 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
16fd0 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
16fe0 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
16ff0 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
17000 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
17010 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
17020 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
17030 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
17040 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
17050 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
17060 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
17070 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
17080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17090 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
170a0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
170b0 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
170c0 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
170d0 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
170e0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
170f0 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
17100 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
17110 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
17120 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
17130 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
17140 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
17150 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
17160 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
17170 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
17180 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
17190 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
171a0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
171b0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
171c0 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
171d0 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
171e0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ry */.  int iBre
171f0 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
17200 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
17210 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
17220 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
17230 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
17240 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
17250 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
17260 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
17270 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
17280 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
17290 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
172a0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
172b0 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
172c0 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
172d0 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
172e0 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
172f0 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
17300 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
17310 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  2;.    addr1 = s
17320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17330 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
17340 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65  gPrev); VdbeCove
17350 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
17360 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
17370 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
17380 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  pare, pIn->iSdst
17390 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
173a0 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20  ->nSdst,.       
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
173d0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
173e0 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
173f0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
17400 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17410 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b   OP_Jump, addr2+
17420 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64  2, iContinue, ad
17430 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65  dr2+2); VdbeCove
17440 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
17450 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
17460 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
17470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17480 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49  3(v, OP_Copy, pI
17490 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
174a0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d  v+1, pIn->nSdst-
174b0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
174c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
174d0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
174e0 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
174f0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
17500 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
17510 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
17520 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46  ess the first OF
17530 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
17540 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
17550 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
17560 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
17570 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
17580 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  inue);..  assert
17590 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  ( pDest->eDest!=
175a0 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20  SRT_Exists );.  
175b0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
175c0 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
175d0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  );.  switch( pDe
175e0 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
175f0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
17600 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
17610 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
17620 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
17630 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
17640 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
17650 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17660 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17670 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
17680 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
17690 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
176a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
176b0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
176c0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
176d0 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
176e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
176f0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
17700 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
17710 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
17720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17730 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
17740 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
17750 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
17760 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
17770 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
17780 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
17790 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
177a0 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
177b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
177c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
177d0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
177e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
177f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
17800 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
17810 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
17820 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
17830 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
17840 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  ...)"..    */.  
17850 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
17860 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
17870 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17880 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a  pIn->nSdst>1 );.
17890 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
178a0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
178b0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
178c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
178d0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
178e0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
178f0 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20  >nSdst, .       
17900 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41     r1, pDest->zA
17910 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  ffSdst, pIn->nSd
17920 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
17930 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
17940 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
17950 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
17960 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17980 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
17990 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
179a0 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20  DParm, r1,.     
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74        pIn->iSdst
179d0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
179e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
179f0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17a00 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
17a10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
17a20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
17a30 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
17a40 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
17a50 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
17a60 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
17a70 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
17a80 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
17a90 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
17aa0 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
17ab0 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
17ac0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
17ad0 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
17ae0 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
17af0 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73  Sdst==1 || pPars
17b00 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65  e->nErr>0 );  te
17b10 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
17b20 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  st!=1 );.      s
17b30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
17b40 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
17b50 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
17b60 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  DParm, 1);.     
17b70 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
17b80 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
17b90 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
17ba0 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
17bb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
17bc0 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
17bd0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17be0 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  RY */..    /* Th
17bf0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
17c00 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
17c10 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ce of registers.
17c20 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
17c30 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e  at pDest->iSdst.
17c40 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f    Then the co-ro
17c50 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20  utine yields..  
17c60 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
17c70 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  T_Coroutine: {. 
17c80 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e       if( pDest->
17c90 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
17ca0 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
17cb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17cc0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
17cd0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17ce0 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74      pDest->nSdst
17cf0 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20   = pIn->nSdst;. 
17d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
17d10 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
17d20 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
17d30 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  dst, pDest->iSds
17d40 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17d60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
17d70 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
17d80 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arm);.      brea
17d90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
17da0 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
17db0 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
17dc0 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69  result destinati
17dd0 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a  on must be.    *
17de0 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54  * SRT_Output.  T
17df0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
17e00 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
17e10 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a   any other.    *
17e20 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  * destination ot
17e30 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
17e40 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20  s handled above 
17e50 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20  or SRT_Output.. 
17e60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
17e70 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73   SRT_Output, res
17e80 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
17e90 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
17ea0 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20   registers.  .  
17eb0 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50    ** Then the OP
17ec0 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
17ed0 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75  e is used to cau
17ee0 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
17ef0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) to.    ** retu
17f00 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  rn the next row 
17f10 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a  of result..    *
17f20 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
17f30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17f40 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
17f50 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
17f60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17f70 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
17f80 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  ow, pIn->iSdst, 
17f90 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17fa0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17fb0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
17fc0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17fd0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17fe0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17ff0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18000 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
18010 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
18020 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
18030 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
18040 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
18050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18060 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
18070 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  pZero, p->iLimit
18080 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
18090 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
180a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
180b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
180c0 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
180d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
180e0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
180f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18100 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
18110 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
18120 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
18130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
18140 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
18150 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
18160 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
18170 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
18180 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
18190 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
181a0 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
181b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
181c0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
181d0 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
181e0 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
181f0 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
18200 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
18210 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
18220 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
18230 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
18240 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
18250 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
18260 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
18270 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
18280 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
18290 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
182a0 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
182b0 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
182c0 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
182d0 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
182e0 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
182f0 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
18300 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
18310 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
18320 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
18330 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
18340 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
18350 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
18360 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
18370 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
18380 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
18390 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
183a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
183b0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
183c0 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
183d0 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
183e0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
183f0 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
18400 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
18410 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
18420 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
18430 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
18440 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
18450 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
18460 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
18470 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
18480 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
18490 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
184a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
184b0 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
184c0 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
184d0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
184e0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
184f0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
18500 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
18510 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
18520 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
18530 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
18540 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
18550 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
18560 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
18570 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
18580 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
18590 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
185a0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
185b0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
185c0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
185d0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
185e0 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
185f0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
18600 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
18610 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
18620 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
18630 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
18640 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
18650 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
18660 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
18670 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
18680 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
18690 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
186a0 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
186b0 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
186c0 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
186d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
186e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
186f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
18700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
18710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18720 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
18730 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
18740 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
18750 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
18760 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
18770 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
18780 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
18790 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
187a0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
187b0 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
187c0 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
187d0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
187e0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
187f0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
18800 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
18810 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
18820 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
18830 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
18840 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
18850 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
18860 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
18870 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
18880 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
18890 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
188a0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
188b0 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
188c0 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
188d0 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
188e0 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
188f0 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
18900 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
18910 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
18920 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
18930 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
18940 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
18950 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
18960 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
18970 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
18980 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
18990 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
189a0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
189b0 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
189c0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
189d0 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
189e0 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
189f0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
18a00 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
18a10 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
18a20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
18a30 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
18a40 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
18a50 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
18a60 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
18a70 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
18a80 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
18a90 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
18aa0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
18ab0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
18ac0 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
18ad0 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
18ae0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
18af0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
18b00 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
18b10 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
18b20 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
18b30 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
18b40 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
18b50 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
18b60 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
18b70 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
18b80 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
18b90 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
18ba0 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
18bb0 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
18bc0 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
18bd0 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
18be0 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
18bf0 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
18c00 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
18c10 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
18c20 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
18c30 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
18c40 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
18c50 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
18c60 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
18c70 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
18c80 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
18c90 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
18ca0 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
18cb0 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
18cc0 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
18cd0 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
18ce0 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
18cf0 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
18d00 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
18d10 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
18d20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
18d30 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
18d40 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
18d50 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
18d60 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
18d70 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
18d80 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
18d90 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
18da0 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
18db0 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
18dc0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
18dd0 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
18de0 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
18df0 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
18e00 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
18e10 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
18e20 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
18e30 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
18e40 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
18e50 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
18e60 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
18e70 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
18e80 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
18e90 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
18ea0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18eb0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
18ec0 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
18ed0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
18ee0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18ef0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
18f00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18f10 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
18f20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
18f30 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
18f40 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
18f50 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
18f60 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
18f70 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
18f80 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
18f90 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
18fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18fb0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
18fc0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
18fd0 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
18fe0 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
18ff0 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
19000 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
19010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
19020 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
19030 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
19040 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
19050 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
19060 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
19070 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
19080 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
19090 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
190a0 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
190b0 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
190c0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
190d0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
190e0 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
190f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ne */.  int regA
19100 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
19110 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
19120 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
19130 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
19140 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
19150 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19160 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
19170 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
19180 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
19190 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
191a0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
191b0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
191c0 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
191d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
191e0 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
191f0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
19200 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
19210 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
19220 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
19230 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
19240 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
19250 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
19260 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
19270 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
19280 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
19290 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
192a0 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
192b0 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
192c0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
192d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
192e0 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
192f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
19300 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
19310 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
19320 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f   int addrEofA_no
19330 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  B;     /* Altern
19340 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20  ate addrEofA if 
19350 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a  B is uninitializ
19360 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
19370 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
19380 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
19390 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
193a0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
193b0 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
193c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
193d0 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
193e0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
193f0 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
19400 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
19410 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
19420 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19430 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
19440 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
19450 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
19460 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
19470 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
19480 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
19490 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
194a0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
194b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
194c0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
194d0 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
194e0 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
194f0 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
19500 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
19510 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
19520 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
19530 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
19540 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
19550 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
19560 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
19570 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
19580 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
19590 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
195a0 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
195b0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
195c0 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
195d0 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
195e0 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
195f0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
19600 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
19610 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
19620 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  stmt */.  int ad
19630 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
19640 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
19650 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
19660 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
19670 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
19680 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
19690 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
196a0 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
196b0 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
196c0 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
196d0 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
196e0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
196f0 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
19700 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
19710 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
19720 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
19730 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
19740 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
19750 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
19760 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
19770 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
19780 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
19790 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
197a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
197b0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
197c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
197d0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
197e0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
197f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
19800 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
19810 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
19820 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
19830 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
19840 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ns */.#ifndef SQ
19850 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
19860 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20  N.  int iSub1;  
19870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
19880 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
19890 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
198a0 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20  iSub2;          
198b0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
198c0 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
198d0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
198e0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
198f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
19900 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
19910 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
19920 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
19930 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
19940 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
19950 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
19960 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
19970 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
19980 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
19990 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
199a0 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
199b0 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
199c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
199d0 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
199e0 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
199f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
19a00 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
19a10 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
19a20 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
19a30 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
19a40 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
19a50 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
19a60 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
19a70 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
19a80 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
19a90 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
19aa0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
19ab0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
19ac0 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
19ad0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
19ae0 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
19af0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
19b00 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
19b10 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
19b20 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
19b30 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
19b40 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
19b50 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
19b60 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
19b70 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
19b80 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
19b90 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
19ba0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
19bb0 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
19bc0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
19bd0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
19be0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19bf0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
19c00 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
19c10 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
19c20 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19c30 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
19c40 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
19c50 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
19c60 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
19c70 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20  OrderByCol==i ) 
19c80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
19c90 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
19ca0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
19cb0 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
19cc0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
19cd0 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20  INTEGER, 0);.   
19ce0 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
19cf0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19d00 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
19d10 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
19d20 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
19d30 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
19d40 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
19d50 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
19d60 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71   = pOrderBy = sq
19d70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
19d80 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
19d90 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20  erBy, pNew);.   
19da0 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
19db0 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  y ) pOrderBy->a[
19dc0 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e  nOrderBy++].u.x.
19dd0 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
19de0 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  16)i;.      }.  
19df0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
19e00 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72  mpute the compar
19e10 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e  ison permutation
19e20 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61   and keyinfo tha
19e30 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20  t is used with. 
19e40 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74   ** the permutat
19e50 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  ion used to dete
19e60 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78  rmine if the nex
19e70 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65  t.  ** row of re
19e80 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d  sults comes from
19e90 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65   selectA or sele
19ea0 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65  ctB.  Also add e
19eb0 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c  xplicit.  ** col
19ec0 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f  lations to the O
19ed0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
19ee0 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65  erms so that whe
19ef0 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
19f00 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67  .  ** to the rig
19f10 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20  ht and the left 
19f20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74  are evaluated, t
19f30 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72  hey use the corr
19f40 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  ect.  ** collati
19f50 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d  on..  */.  aPerm
19f60 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ute = sqlite3DbM
19f70 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
19f80 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64  izeof(int)*(nOrd
19f90 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66  erBy + 1));.  if
19fa0 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
19fb0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
19fc0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19fd0 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d     aPermute[0] =
19fe0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66   nOrderBy;.    f
19ff0 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f  or(i=1, pItem=pO
1a000 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f  rderBy->a; i<=nO
1a010 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
1a020 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
1a030 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
1a040 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
1a050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a060 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1a070 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
1a080 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1a090 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
1a0a0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1a0b0 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  ByCol - 1;.    }
1a0c0 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
1a0d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
1a0e0 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
1a0f0 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  e, p, 1);.  }els
1a100 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
1a110 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1a120 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
1a130 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
1a140 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1a150 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1a160 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
1a170 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
1a180 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1a190 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
1a1a0 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
1a1b0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
1a1c0 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
1a1d0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
1a1e0 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
1a1f0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
1a200 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
1a210 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
1a220 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
1a230 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
1a240 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
1a250 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
1a260 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
1a270 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1a280 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
1a290 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
1a2a0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
1a2b0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
1a2c0 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
1a2d0 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
1a2e0 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
1a2f0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1a300 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
1a310 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
1a320 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70  se->nMem += nExp
1a330 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r+1;.    sqlite3
1a340 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a350 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
1a360 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44  Prev);.    pKeyD
1a370 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  up = sqlite3KeyI
1a380 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
1a390 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
1a3a0 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20  pKeyDup ){.     
1a3b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a3c0 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
1a3d0 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20  le(pKeyDup) );. 
1a3e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1a3f0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1a400 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43       pKeyDup->aC
1a410 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
1a420 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
1a430 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
1a440 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
1a450 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20  tOrder[i] = 0;. 
1a460 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a470 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65  . .  /* Separate
1a480 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68   the left and th
1a490 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72  e right query fr
1a4a0 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20  om one another. 
1a4b0 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
1a4c0 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  = 0;.  pPrior->p
1a4d0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Next = 0;.  sqli
1a4e0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
1a4f0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1a500 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
1a510 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
1a520 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
1a530 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
1a540 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
1a550 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
1a560 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
1a570 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
1a580 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
1a590 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
1a5a0 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
1a5b0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
1a5c0 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
1a5d0 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
1a5e0 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
1a5f0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
1a600 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
1a610 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
1a620 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
1a630 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
1a640 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a650 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
1a660 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
1a670 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
1a6b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a6c0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
1a6d0 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
1a6e0 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
1a6f0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
1a700 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
1a710 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
1a720 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
1a730 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
1a740 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
1a750 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1a760 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
1a770 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
1a780 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
1a790 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1a7a0 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
1a7b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
1a7c0 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
1a7d0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
1a7e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a7f0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1a800 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
1a810 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1a820 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
1a830 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1a840 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
1a850 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1a860 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
1a870 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
1a880 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1a890 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1a8a0 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
1a8b0 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
1a8c0 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
1a8d0 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
1a8e0 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41  */.  addrSelectA
1a8f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1a900 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
1a910 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
1a920 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a930 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
1a940 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20  e, regAddrA, 0, 
1a950 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20  addrSelectA);.  
1a960 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1a970 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b  "left SELECT"));
1a980 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
1a990 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
1a9a0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
1a9b0 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
1a9c0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
1a9d0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1a9e0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
1a9f0 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
1aa00 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
1aa10 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41  tine(v, regAddrA
1aa20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1aa30 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1aa40 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  1);..  /* Genera
1aa50 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
1aa60 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
1aa70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1aa80 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
1aa90 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
1aaa0 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
1aab0 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
1aac0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1aad0 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
1aae0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1aaf0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
1ab00 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1ab10 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  B, 0, addrSelect
1ab20 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  B);.  VdbeCommen
1ab30 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c  t((v, "right SEL
1ab40 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c  ECT"));.  savedL
1ab50 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
1ab60 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20  ;.  savedOffset 
1ab70 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
1ab80 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  p->iLimit = regL
1ab90 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66  imitB;.  p->iOff
1aba0 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70  set = 0;  .  exp
1abb0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
1abc0 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
1abd0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
1abe0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1abf0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
1ac00 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
1ac10 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
1ac20 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
1ac30 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
1ac40 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
1ac50 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  e(v, regAddrB);.
1ac60 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1ac70 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1ac80 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1ac90 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1aca0 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
1acb0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1acc0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1acd0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1ace0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1acf0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1ad00 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
1ad10 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
1ad20 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
1ad30 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad50 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
1ad60 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1ad80 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
1ad90 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
1ada0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1adb0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1adc0 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
1add0 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
1ade0 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
1adf0 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
1ae00 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1ae10 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1ae20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
1ae30 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
1ae40 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1ae50 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1ae60 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
1ae70 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
1ae80 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1ae90 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1aea0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1aeb0 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
1aec0 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1aef0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1af00 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  }.  sqlite3KeyIn
1af10 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29  foUnref(pKeyDup)
1af20 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1af30 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1af40 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1af50 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1af60 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
1af70 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1af80 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
1af90 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1afa0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
1afb0 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
1afc0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1afd0 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64  drEofA_noB = add
1afe0 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64  rEofA = labelEnd
1aff0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1b000 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1b010 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
1b020 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1b030 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
1b040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b050 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1b060 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
1b070 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1b080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b090 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b0a0 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e  egAddrB, labelEn
1b0b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1b0e0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1b0f0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b100 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
1b110 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1b120 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1b130 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
1b140 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1b150 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ow);.  }..  /* G
1b160 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1b170 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
1b180 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
1b190 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
1b1a0 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
1b1b0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
1b1c0 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
1b1d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1b1e0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1b1f0 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
1b200 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28  ddrEofA;.    if(
1b210 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
1b220 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1b230 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
1b240 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
1b250 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73  electRow;.  }els
1b260 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1b270 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1b280 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
1b290 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
1b2a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b2b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1b2c0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1b2d0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1b2e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b2f0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1b300 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62  , labelEnd); Vdb
1b310 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b320 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1b330 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  o(v, addrEofB);.
1b340 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1b350 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1b360 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
1b370 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1b380 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1b390 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
1b3a0 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
1b3b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b3c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1b3d0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1b3e0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1b3f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b400 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1b410 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1b420 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1b430 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b440 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1b450 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b460 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1b470 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
1b480 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1b490 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1b4a0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
1b4b0 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
1b4c0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1b4d0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1b4e0 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
1b4f0 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
1b500 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1b510 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
1b520 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1b530 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
1b540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b550 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b560 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1b570 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1b580 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1b590 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1b5a0 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
1b5b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1b5c0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1b5d0 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
1b5e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1b5f0 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
1b600 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1b610 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
1b620 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1b630 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
1b640 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1b650 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
1b660 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b670 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1b680 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1b690 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1b6a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b6b0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1b6c0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1b6d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1b6e0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b6f0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1b700 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
1b710 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
1b720 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
1b730 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1b740 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1b750 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
1b760 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b770 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1b780 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20   addrEofA_noB); 
1b790 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b7a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b7b0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b7c0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1b7d0 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1b7e0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d  age(v);..  /* Im
1b7f0 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
1b800 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
1b810 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1b820 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1b830 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
1b840 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b850 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
1b860 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
1b870 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
1b880 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
1b890 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b8a0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
1b8b0 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
1b8c0 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1b8f0 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
1b900 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
1b910 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1b920 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
1b930 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1b940 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
1b950 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
1b960 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
1b970 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b980 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
1b990 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
1b9a0 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
1b9b0 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
1b9c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1b9d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b9e0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
1b9f0 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
1ba00 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1ba10 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
1ba20 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
1ba30 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
1ba40 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1ba50 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
1ba60 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
1ba70 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1ba80 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
1ba90 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
1baa0 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f   pPrior;.  pPrio
1bab0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20  r->pNext = p;.. 
1bac0 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
1bad0 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
1bae0 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
1baf0 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
1bb00 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
1bb10 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70  ries ****/.  exp
1bb20 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
1bb30 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
1bb40 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20  b1, iSub2, 0);. 
1bb50 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
1bb60 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69  nErr!=0;.}.#endi
1bb70 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
1bb80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1bb90 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1bba0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1bbb0 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61  EW)../* An insta
1bbc0 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62 73 74  nce of the Subst
1bbd0 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64  Context object d
1bbe0 65 73 63 72 69 62 65 73 20 61 6e 20 73 75 62 73  escribes an subs
1bbf0 74 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a  titution edit.**
1bc00 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
1bc10 20 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65 65   on a parse tree
1bc20 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65  ..**.** All refe
1bc30 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
1bc40 73 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c  s in table iTabl
1bc50 65 20 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c  e are to be repl
1bc60 61 63 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f  aced by correspo
1bc70 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73  nding.** express
1bc80 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a  ions in pEList..
1bc90 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1bca0 74 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b  t SubstContext {
1bcb0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1bcc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1bcd0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1bce0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ext */.  int iTa
1bcf0 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
1bd00 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65     /* Replace re
1bd10 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
1bd20 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1bd30 69 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20  iNewTable;      
1bd40 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62        /* New tab
1bd50 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  le number */.  i
1bd60 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20  nt isLeftJoin;  
1bd70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1bd80 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f  TK_IF_NULL_ROW o
1bd90 70 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72  pcodes on each r
1bda0 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20  eplacement */.  
1bdb0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1bdc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ;         /* Rep
1bdd0 6c 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73  lacement express
1bde0 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43  ions */.} SubstC
1bdf0 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77  ontext;../* Forw
1be00 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  ard Declarations
1be10 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1be20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 53 75  substExprList(Su
1be30 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70  bstContext*, Exp
1be40 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
1be50 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1be60 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20  (SubstContext*, 
1be70 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a  Select*, int);..
1be80 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
1be90 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
1bea0 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
1beb0 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
1bec0 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
1bed0 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
1bee0 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
1bef0 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
1bf00 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
1bf10 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
1bf20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
1bf30 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
1bf40 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
1bf50 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
1bf60 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
1bf70 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
1bf80 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
1bf90 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
1bfa0 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
1bfb0 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
1bfc0 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
1bfd0 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
1bfe0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1bff0 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
1c000 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
1c010 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
1c020 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
1c030 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
1c040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1c050 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
1c060 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1c070 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
1c080 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
1c090 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
1c0a0 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
1c0b0 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
1c0c0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
1c0d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1c0e0 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
1c0f0 73 75 62 73 74 45 78 70 72 28 0a 20 20 53 75 62  substExpr(.  Sub
1c100 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1c110 74 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69  t,  /* Descripti
1c120 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69  on of the substi
1c130 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  tution */.  Expr
1c140 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
1c150 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68     /* Expr in wh
1c160 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ich substitution
1c170 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20   occurs */.){.  
1c180 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
1c190 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45  eturn 0;.  if( E
1c1a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c1b0 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
1c1c0 6e 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  n).   && pExpr->
1c1d0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
1c1e0 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a  =pSubst->iTable.
1c1f0 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e    ){.    pExpr->
1c200 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1c210 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61  = pSubst->iNewTa
1c220 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ble;.  }.  if( p
1c230 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1c240 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
1c250 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1c260 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
1c270 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
1c280 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1c290 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
1c2a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c2b0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
1c2c0 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20    Expr *pCopy = 
1c2d0 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e  pSubst->pEList->
1c2e0 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
1c2f0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45  ].pExpr;.      E
1c300 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20  xpr ifNullRow;. 
1c310 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1c320 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26  bst->pEList!=0 &
1c330 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
1c340 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d  <pSubst->pEList-
1c350 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1c360 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
1c370 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
1c380 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1c390 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c3a0 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f  ExprIsVector(pCo
1c3b0 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  py) ){.        s
1c3c0 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
1c3d0 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61  rMsg(pSubst->pPa
1c3e0 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20  rse, pCopy);.   
1c3f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c400 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c410 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e  pSubst->pParse->
1c420 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  db;.        if( 
1c430 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f  pSubst->isLeftJo
1c440 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21  in && pCopy->op!
1c450 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1c460 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
1c470 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69  ifNullRow, 0, si
1c480 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29  zeof(ifNullRow))
1c490 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75  ;.          ifNu
1c4a0 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46  llRow.op = TK_IF
1c4b0 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20  _NULL_ROW;.     
1c4c0 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70       ifNullRow.p
1c4d0 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20  Left = pCopy;.  
1c4e0 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1c4f0 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  w.iTable = pSubs
1c500 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1c510 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20          pCopy = 
1c520 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20  &ifNullRow;.    
1c530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e      }.        pN
1c540 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1c550 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30  Dup(db, pCopy, 0
1c560 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1c570 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69  New && pSubst->i
1c580 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  sLeftJoin ){.   
1c590 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
1c5a0 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
1c5b0 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  CanBeNull);.    
1c5c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1c5d0 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61  ( pNew && ExprHa
1c5e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1c5f0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1c600 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1c610 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1c620 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  = pExpr->iRightJ
1c630 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  oinTable;.      
1c640 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1c650 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f  rty(pNew, EP_Fro
1c660 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  mJoin);.        
1c670 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1c680 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1c690 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1c6a0 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
1c6b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1c6c0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78  lse{.    if( pEx
1c6d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55  pr->op==TK_IF_NU
1c6e0 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d  LL_ROW && pExpr-
1c6f0 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1c700 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >iTable ){.     
1c710 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
1c720 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1c730 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  le;.    }.    pE
1c740 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62  xpr->pLeft = sub
1c750 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1c760 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1c770 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1c780 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1c790 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  st, pExpr->pRigh
1c7a0 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1c7b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1c7c0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1c7d0 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1c7e0 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45  elect(pSubst, pE
1c7f0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
1c800 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
1c810 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1c820 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  st(pSubst, pExpr
1c830 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
1c840 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1c850 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Expr;.}.static v
1c860 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1c870 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  t(.  SubstContex
1c880 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65  t *pSubst, /* De
1c890 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1c8a0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1c8b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1c8c0 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st       /* List
1c8d0 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
1c8e0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1c8f0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a  bstitutes */.){.
1c900 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1c910 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1c920 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1c930 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1c940 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
1c950 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
1c960 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69  Expr(pSubst, pLi
1c970 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1c980 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1c990 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
1c9a0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1c9b0 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1c9c0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1c9d0 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1c9e0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1c9f0 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
1ca00 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
1ca10 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1ca20 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  itutions */.  in
1ca30 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20  t doPrior       
1ca40 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69      /* Do substi
1ca50 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69  tutes on p->pPri
1ca60 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53  or too */.){.  S
1ca70 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
1ca80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ca90 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
1caa0 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20  t i;.  if( !p ) 
1cab0 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20  return;.  do{.  
1cac0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1cad0 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73  pSubst, p->pELis
1cae0 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
1caf0 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1cb00 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
1cb10 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1cb20 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ubst, p->pOrderB
1cb30 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69  y);.    p->pHavi
1cb40 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ng = substExpr(p
1cb50 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e  Subst, p->pHavin
1cb60 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  g);.    p->pWher
1cb70 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  e = substExpr(pS
1cb80 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29  ubst, p->pWhere)
1cb90 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e  ;.    pSrc = p->
1cba0 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  pSrc;.    assert
1cbb0 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ( pSrc!=0 );.   
1cbc0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1cbd0 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
1cbe0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
1cbf0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
1cc00 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1cc10 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1cc20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  1);.      if( pI
1cc30 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1cc40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62  c ){.        sub
1cc50 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1cc60 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  t, pItem->u1.pFu
1cc70 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  ncArg);.      }.
1cc80 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1cc90 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20  doPrior && (p = 
1cca0 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b  p->pPrior)!=0 );
1ccb0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1ccc0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1ccd0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1cce0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ccf0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
1cd00 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1cd10 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1cd20 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1cd30 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1cd40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1cd50 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
1cd60 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
1cd70 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
1cd80 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
1cd90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1cda0 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
1cdb0 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
1cdc0 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
1cdd0 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ning occurs..**.
1cde0 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
1cdf0 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
1ce00 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
1ce10 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1ce20 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
1ce30 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
1ce40 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
1ce50 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1ce60 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
1ce70 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
1ce80 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
1ce90 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
1cea0 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
1ceb0 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
1cec0 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
1ced0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1cee0 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
1cef0 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
1cf00 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1cf10 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
1cf20 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
1cf30 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
1cf40 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
1cf50 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
1cf60 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
1cf70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1cf80 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
1cf90 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
1cfa0 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
1cfb0 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1cfc0 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
1cfd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1cfe0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
1cff0 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
1d000 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
1d010 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
1d020 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
1d030 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1d040 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
1d050 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
1d060 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
1d070 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
1d080 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
1d090 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  s simplification
1d0a0 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
1d0b0 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
1d0c0 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
1d0d0 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
1d0e0 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
1d0f0 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
1d100 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
1d110 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
1d120 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
1d130 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
1d140 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
1d150 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74  ening is subject
1d160 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
1d170 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a  g constraints:.*
1d180 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1d190 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1d1a0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1d1b0 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1d1c0 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20  . Was:.**       
1d1d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1d1e0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1d1f0 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  y cannot both be
1d200 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1d210 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20  **  (**)  We no 
1d220 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74  longer attempt t
1d230 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67  o flatten aggreg
1d240 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  ate subqueries. 
1d250 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28  Was:.**        (
1d260 32 29 20 49 66 20 74 68 65 20 73 75 62 71 75 65  2) If the subque
1d270 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  ry is an aggrega
1d280 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  te then.**      
1d290 20 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72    (2a) the outer
1d2a0 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1d2b0 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1d2c0 20 20 20 20 20 20 20 20 28 32 62 29 20 74 68 65          (2b) the
1d2d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73   outer query mus
1d2e0 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  t not use subque
1d2f0 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ries.**         
1d300 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20 74      other than t
1d310 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75  he one FROM-clau
1d320 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74  se subquery that
1d330 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a   is a candidate.
1d340 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66  **             f
1d350 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  or flattening.  
1d360 28 54 68 69 73 20 69 73 20 64 75 65 20 74 6f 20  (This is due to 
1d370 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37  ticket [2f7170d7
1d380 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20  3bf9abf80].**   
1d390 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 32            from 2
1d3a0 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a  015-02-09.).**.*
1d3b0 2a 20 20 20 28 33 29 20 20 49 66 20 74 68 65 20  *   (3)  If the 
1d3c0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1d3d0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1d3e0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65   a LEFT JOIN the
1d3f0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61 29  n.**        (3a)
1d400 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1d410 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  y not be a join 
1d420 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33  and.**        (3
1d430 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  b) the FROM clau
1d440 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1d450 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61  ry may not conta
1d460 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  in a virtual.** 
1d470 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
1d480 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  e and.**        
1d490 28 33 63 29 20 74 68 65 20 6f 75 74 65 72 20 71  (3c) the outer q
1d4a0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1d4b0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  an aggregate..**
1d4c0 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1d4d0 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74 20  ubquery can not 
1d4e0 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  be DISTINCT..**.
1d4f0 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65  **  (**)  At one
1d500 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69   point restricti
1d510 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20  ons (4) and (5) 
1d520 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74  defined a subset
1d530 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20   of DISTINCT.** 
1d540 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69         sub-queri
1d550 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63  es that were exc
1d560 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20  luded from this 
1d570 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65  optimization. Re
1d580 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  striction .**   
1d590 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e       (4) has sin
1d5a0 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ce been expanded
1d5b0 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20   to exclude all 
1d5c0 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72  DISTINCT subquer
1d5d0 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ies..**.**  (**)
1d5e0 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
1d5f0 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
1d600 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
1d610 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
1d620 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20 73          If the s
1d630 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65  ubquery is aggre
1d640 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72 20  gate, the outer 
1d650 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1d660 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1d670 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1d680 75 65 72 79 20 6d 75 73 74 20 68 61 76 65 20 61  uery must have a
1d690 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1d6a0 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1d6b0 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1d6c0 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1d6d0 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1d6e0 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61  dding a FROM cla
1d6f0 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  use with the spe
1d700 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1d710 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1d720 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1d730 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1d740 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1d750 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1d760 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1d770 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1d780 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1d790 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d7a0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1d7b0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
1d7c0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1d7d0 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1d7e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d7f0 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72 65  may not be aggre
1d800 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  gate..**.**  (**
1d810 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  )  Restriction (
1d820 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20  10) was removed 
1d830 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e  from the code on
1d840 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20   2005-02-05 but 
1d850 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63  we.**        acc
1d860 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20  idently carried 
1d870 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77  the comment forw
1d880 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30  ard until 2014-0
1d890 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a  9-15.  Original.
1d8a0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  **        constr
1d8b0 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73 75  aint: "If the su
1d8c0 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67  bquery is aggreg
1d8d0 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75 74  ate then the out
1d8e0 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20  er query .**    
1d8f0 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20      may not use 
1d900 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28  LIMIT.".**.**  (
1d910 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1d920 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1d930 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f  query may not bo
1d940 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1d950 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1d960 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1d970 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1d980 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1d990 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1d9a0 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
1d9b0 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
1d9c0 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
1d9d0 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
1d9e0 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
1d9f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1da00 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  d outer query ma
1da10 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  y not both use L
1da20 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
1da30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1da40 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  may not use OFFS
1da50 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
1da60 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
1da70 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 61  ery is part of a
1da80 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1da90 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
1daa0 20 20 20 20 20 73 75 62 71 75 65 72 79 20 6d 61       subquery ma
1dab0 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
1dac0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
1dad0 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
1dae0 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
1daf0 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
1db00 36 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72  6)  If the outer
1db10 20 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67   query is aggreg
1db20 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ate, then the su
1db30 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a  bquery may not.*
1db40 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f 52 44  *        use ORD
1db50 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
1db60 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
1db70 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
1db80 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
1db90 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
1dba0 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
1dbb0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
1dbc0 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74 68 65  **  (17)  If the
1dbd0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 63   subquery is a c
1dbe0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1dbf0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1dc00 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e  17a) all compoun
1dc10 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73 74  d operators must
1dc20 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c   be a UNION ALL,
1dc30 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1dc40 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77 69  17b) no terms wi
1dc50 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72  thin the subquer
1dc60 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62  y compound may b
1dc70 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20  e aggregate.**  
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 44              or D
1dc90 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20  ISTINCT, and.** 
1dca0 20 20 20 20 20 20 20 28 31 37 63 29 20 65 76 65         (17c) eve
1dcb0 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ry term within t
1dcc0 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
1dcd0 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20 61  ound must have a
1dce0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
1dcf0 20 20 20 20 20 20 20 28 31 37 64 29 20 74 68 65         (17d) the
1dd00 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1dd10 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20   not be.**      
1dd20 20 20 20 20 20 20 20 20 28 31 37 64 31 29 20 61          (17d1) a
1dd30 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20  ggregate, or.** 
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37               (17
1dd50 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f 72  d2) DISTINCT, or
1dd60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1dd70 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a   (17d3) a join..
1dd80 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
1dd90 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
1dda0 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
1ddb0 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
1ddc0 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
1ddd0 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
1dde0 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
1ddf0 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
1de00 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
1de10 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
1de20 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
1de30 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
1de40 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
1de50 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1de60 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
1de70 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
1de80 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
1de90 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
1dea0 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1deb0 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
1dec0 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
1ded0 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
1dee0 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
1def0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
1df00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
1df10 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
1df20 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
1df30 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
1df40 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
1df50 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
1df60 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
1df70 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
1df80 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
1df90 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
1dfa0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
1dfb0 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
1dfc0 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
1dfd0 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
1dfe0 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
1dff0 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
1e000 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
1e010 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
1e020 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
1e030 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1e040 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
1e050 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
1e060 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
1e070 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
1e080 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1e090 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1e0a0 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
1e0b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
1e0c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
1e0d0 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
1e0e0 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
1e0f0 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
1e100 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
1e110 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
1e120 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20 74  *.**  (19)  If t
1e130 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1e140 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
1e150 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1e160 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
1e170 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
1e180 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
1e190 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1e1a0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1e1b0 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
1e1c0 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
1e1d0 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
1e1e0 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
1e1f0 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
1e200 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
1e210 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
1e220 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
1e230 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
1e240 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1e250 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
1e260 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
1e270 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
1e280 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
1e290 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1e2a0 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
1e2b0 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
1e2c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
1e2d0 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
1e2e0 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
1e2f0 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74 68  .**  (21)  If th
1e300 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1e310 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1e320 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1e330 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  ot be.**        
1e340 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
1e350 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
1e360 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32  fc])..**.**  (22
1e370 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1e380 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65 63  may not be a rec
1e390 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
1e3a0 2a 20 20 28 32 33 29 20 20 49 66 20 74 68 65 20  *  (23)  If the 
1e3b0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61  outer query is a
1e3c0 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20   recursive CTE, 
1e3d0 74 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65  then the sub-que
1e3e0 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  ry may not be.**
1e3f0 20 20 20 20 20 20 20 20 61 20 63 6f 6d 70 6f 75          a compou
1e400 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72  nd query. This r
1e410 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65  estriction is be
1e420 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69  cause transformi
1e430 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
1e440 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d   parent to a com
1e450 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66  pound query conf
1e460 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68  uses the code th
1e470 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20  at handles.**   
1e480 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71       recursive q
1e490 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53  ueries in multiS
1e4a0 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elect()..**.**  
1e4b0 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67  (**)  We no long
1e4c0 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c  er attempt to fl
1e4d0 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20  atten aggregate 
1e4e0 73 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73  subqueries.  Was
1e4f0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  :.**        The 
1e500 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1e510 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65   be an aggregate
1e520 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62   that uses the b
1e530 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72  uilt-in min() or
1e540 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d   .**        or m
1e550 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ax() functions. 
1e560 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72   (Without this r
1e570 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75  estriction, a qu
1e580 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20  ery like:.**    
1e590 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52      "SELECT x FR
1e5a0 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79  OM (SELECT max(y
1e5b0 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77  ), x FROM t1)" w
1e5c0 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61  ould not necessa
1e5d0 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  rily.**        r
1e5e0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
1e5f0 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61  X for which Y wa
1e600 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a  s maximal.).**.*
1e610 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
1e620 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
1e630 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
1e640 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
1e650 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
1e660 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
1e670 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
1e680 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
1e690 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e6a0 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
1e6b0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
1e6c0 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
1e6d0 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
1e6e0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1e6f0 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
1e700 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
1e710 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
1e720 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1e730 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
1e740 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
1e750 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
1e760 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
1e770 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1e780 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
1e790 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
1e7a0 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
1e7b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
1e7c0 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
1e7d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1e7e0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1e7f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1e800 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1e810 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
1e820 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
1e830 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
1e840 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
1e850 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1e860 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
1e870 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
1e880 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
1e890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e8a0 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
1e8b0 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
1e8c0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1e8d0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1e8e0 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
1e8f0 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
1e900 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
1e910 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  ect *pParent;   
1e920 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f   /* Current UNIO
1e930 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68  N ALL term of th
1e940 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f  e other query */
1e950 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
1e960 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1e970 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
1e980 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
1e990 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
1e9a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1e9b0 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
1e9c0 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
1e9d0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1e9e0 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
1e9f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1ea00 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ea10 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1ea20 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
1ea30 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1ea40 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1ea50 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
1ea60 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1ea70 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
1ea80 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
1ea90 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
1eaa0 20 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74    int iNewParent
1eab0 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65   = -1;/* Replace
1eac0 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69  ment table for i
1ead0 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
1eae0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20  isLeftJoin = 0; 
1eaf0 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20  /* True if pSub 
1eb00 69 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  is the right sid
1eb10 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
1eb20 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b   */    .  int i;
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb40 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1eb50 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1eb80 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1eb90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1eba0 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
1ebb0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
1ebc0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1ebd0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
1ebe0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1ebf0 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
1ec00 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
1ec10 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
1ec20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  */.  assert( p!=
1ec30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1ec40 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
1ec50 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1ec60 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
1ec70 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
1ec80 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
1ec90 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1eca0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1ecb0 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
1ecc0 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
1ecd0 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
1ece0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
1ecf0 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
1ed00 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
1ed10 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
1ed20 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1ed30 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
1ed40 29 3b 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20  );..  pSubSrc = 
1ed50 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
1ed60 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
1ed70 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76  .  /* Prior to v
1ed80 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68  ersion 3.1.2, wh
1ed90 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1eda0 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69  SET had to be si
1edb0 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a  mple constants,.
1edc0 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61    ** not arbitra
1edd0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1ede0 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
1edf0 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
1ee00 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
1ee10 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
1ee20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
1ee30 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1ee40 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
1ee50 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
1ee60 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
1ee70 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
1ee80 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
1ee90 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
1eea0 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
1eeb0 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
1eec0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1eed0 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
1eee0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1eef0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1ef00 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
1ef10 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
1ef20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef40 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1ef50 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
1ef60 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1ef70 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20  SF_Compound)!=0 
1ef80 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  && pSub->pLimit 
1ef90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1efd0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20  estriction (15) 
1efe0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
1eff0 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
1f000 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f020 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f030 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  7)  */.  if( pSu
1f040 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1f050 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  _Distinct ) retu
1f060 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f070 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f080 34 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4)  */.  if( pSu
1f090 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53  b->pLimit && (pS
1f0a0 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
1f0b0 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74  Agg) ){.     ret
1f0c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
1f0d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
1f0e0 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69  8)(9) */.  }.  i
1f0f0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
1f100 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
1f110 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1f120 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f150 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
1f160 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
1f170 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
1f180 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
1f190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f1a0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1f1b0 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
1f1c0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
1f1d0 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
1f1e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f1f0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1f200 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (19) */.  if( pS
1f210 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1f220 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f230 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a  Distinct)!=0 ){.
1f240 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f250 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1f260 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20  ction (21) */.  
1f270 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  }.  if( pSub->se
1f280 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63  lFlags & (SF_Rec
1f290 75 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72  ursive) ){.    r
1f2a0 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74  eturn 0; /* Rest
1f2b0 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f  rictions (22) */
1f2c0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1f2d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
1f2e0 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62 2d  ursive) && pSub-
1f2f0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
1f300 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74  eturn 0; /* Rest
1f310 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a  riction (23) */.
1f320 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
1f330 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1f340 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1f350 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
1f360 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  IN, then the.  *
1f370 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  * subquery may n
1f380 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73  ot be a join its
1f390 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c  elf (3a). Exampl
1f3a0 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  e of why this is
1f3b0 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65   not.  ** allowe
1f3c0 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
1f3d0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
1f3e0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
1f3f0 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
1f400 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
1f410 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
1f420 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
1f430 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
1f440 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
1f450 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
1f460 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
1f470 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
1f480 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ing..  **.  ** I
1f490 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1f4a0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1f4b0 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
1f4c0 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74  IN, then the out
1f4d0 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61  er.  ** query ca
1f4e0 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65  nnot be an aggre
1f4f0 67 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73  gate. (3c)  This
1f500 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20   is an artifact 
1f510 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
1f520 61 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70  aggregates are p
1f530 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65  rocessed - there
1f540 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d   is no mechanism
1f550 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1f560 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a  .  ** the LEFT J
1f570 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  OIN table should
1f580 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20   be all-NULL..  
1f590 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
1f5a0 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23   tickets #306, #
1f5b0 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a  350, and #3300..
1f5c0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
1f5d0 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
1f5e0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
1f5f0 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f   ){.    isLeftJo
1f600 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  in = 1;.    if( 
1f610 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20  pSubSrc->nSrc>1 
1f620 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69  || isAgg || IsVi
1f630 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61  rtual(pSubSrc->a
1f640 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
1f650 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20     /*  (3a)     
1f660 20 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20          (3c)    
1f670 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72   (3b) */.      r
1f680 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1f690 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1f6a0 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57  _EXTRA_IFNULLROW
1f6b0 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f  .  else if( iFro
1f6c0 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b  m>0 && !isAgg ){
1f6d0 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20  .    /* Setting 
1f6e0 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31  isLeftJoin to -1
1f6f0 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c   causes OP_IfNul
1f700 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20  lRow opcodes to 
1f710 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  be generated for
1f720 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65  .    ** every re
1f730 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72  ference to any r
1f740 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f  esult column fro
1f750 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20  m subquery in a 
1f760 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a  join, even.    *
1f770 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72  * though they ar
1f780 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  e not necessary.
1f790 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65    This will stre
1f7a0 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49  ss-test the OP_I
1f7b0 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a  fNullRow .    **
1f7c0 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
1f7d0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b  isLeftJoin = -1;
1f7e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1f7f0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f800 37 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  7): If the sub-q
1f810 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1f820 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
1f830 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
1f840 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
1f850 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
1f860 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
1f870 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
1f880 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
1f890 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
1f8a0 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
1f8b0 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
1f8c0 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
1f8d0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
1f8e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1f8f0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
1f900 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1f910 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
1f920 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
1f930 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20  tion (20) */.   
1f940 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
1f950 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
1f960 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1f970 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
1f980 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
1f990 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29  urn 0; /* (17d1)
1f9a0 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37  , (17d2), or (17
1f9b0 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  d3) */.    }.   
1f9c0 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
1f9d0 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
1f9e0 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
1f9f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
1fa00 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1fa10 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1fa20 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
1fa30 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
1fa40 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
1fa50 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1fa60 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1fa70 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1fa80 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
1fa90 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
1faa0 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20  >pSrc!=0 );.    
1fab0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
1fac0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
1fad0 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
1fae0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28  xpr );.      if(
1faf0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1fb00 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1fb10 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
1fb20 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a  =0    /* (17b) *
1fb30 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  /.       || (pSu
1fb40 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
1fb50 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20   /* (17a) */.   
1fb80 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
1fb90 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20  rc->nSrc<1      
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
1fbc0 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b  17c) */.      ){
1fbd0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fbe0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1fbf0 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
1fc00 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
1fc10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1fc20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29  Restriction (18)
1fc30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1fc40 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1fc50 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
1fc60 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
1fc70 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1fc80 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
1fc90 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
1fca0 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
1fcb0 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
1fcc0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1fcd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a    }.  }..  /****
1fce0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
1fcf0 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65  is point, flatte
1fd00 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1fd10 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45  d. *****/.  SELE
1fd20 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
1fd30 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e  ,p,("flatten %s.
1fd40 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c  %p from term %d\
1fd50 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1fd60 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65         pSub->zSe
1fd70 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72  lName, pSub, iFr
1fd80 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68  om));..  /* Auth
1fd90 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
1fda0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
1fdb0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1fdc0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
1fdd0 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
1fde0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1fdf0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1fe00 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1fe10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
1fe20 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
1fe30 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1fe40 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
1fe50 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
1fe60 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
1fe70 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1fe80 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1fe90 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
1fea0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
1feb0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
1fec0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
1fed0 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
1fee0 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
1fef0 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
1ff00 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
1ff10 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
1ff20 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
1ff30 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
1ff40 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
1ff50 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
1ff60 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1ff70 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
1ff80 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
1ff90 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
1ffa0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
1ffb0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
1ffc0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
1ffd0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
1ffe0 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
1fff0 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
20000 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
20010 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
20020 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
20030 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
20040 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
20050 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
20060 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
20070 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
20080 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
20090 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
200a0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
200b0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
200c0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
200d0 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
200e0 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
200f0 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
20100 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
20110 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
20120 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
20130 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
20140 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
20150 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
20160 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
20170 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
20180 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
20190 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
201a0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
201b0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
201c0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
201d0 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
201e0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
201f0 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
20200 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
20210 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
20220 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
20230 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
20240 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
20250 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
20260 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
20270 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
20280 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
20290 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
202a0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
202b0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
202c0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
202d0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
202e0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
202f0 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
20300 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
20310 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
20320 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
20330 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20  Limit;.    Expr 
20340 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  *pOffset = p->pO
20350 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63  ffset;.    Selec
20360 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
20370 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
20380 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
20390 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
203a0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
203b0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
203c0 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  0;.    p->pOffse
203d0 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
203e0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
203f0 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
20400 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
20410 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75  etName(pNew, pSu
20420 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  b->zSelName);.  
20430 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
20440 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70  Offset;.    p->p
20450 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
20460 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
20470 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
20480 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
20490 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
204a0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
204b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
204c0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
204d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
204e0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
204f0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
20500 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
20510 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
20520 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
20530 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
20540 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
20550 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
20560 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20  CE(2,pParse,p,. 
20570 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75          ("compou
20580 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
20590 74 65 6e 65 72 20 63 72 65 61 74 65 73 20 25 73  tener creates %s
205a0 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a  .%p as peer\n",.
205b0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a           pNew->z
205c0 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b  SelName, pNew));
205d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
205e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
205f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
20600 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
20610 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
20620 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
20630 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
20640 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
20650 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
20660 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
20670 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
20680 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
20690 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
206a0 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
206b0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
206c0 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
206d0 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
206e0 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
206f0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
20700 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20710 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
20720 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
20730 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
20740 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
20750 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
20760 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
20770 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
20780 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
20790 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
207a0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
207b0 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
207c0 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
207d0 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
207e0 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
207f0 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
20800 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
20810 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
20820 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
20830 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
20840 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
20850 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
20860 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
20870 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
20880 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
20890 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74    **.  ** pSubit
208a0 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61  em->pTab is alwa
208b0 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74  ys non-NULL by t
208c0 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  est restrictions
208d0 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65   and tests above
208e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ..  */.  if( ALW
208f0 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  AYS(pSubitem->pT
20900 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61  ab!=0) ){.    Ta
20910 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
20920 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
20930 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
20940 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29  el->nTabRef==1 )
20950 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
20960 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
20970 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
20980 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
20990 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
209a0 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
209b0 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
209c0 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
209d0 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
209e0 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
209f0 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
20a00 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20  el->nTabRef--;. 
20a10 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65     }.    pSubite
20a20 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d  m->pTab = 0;.  }
20a30 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
20a40 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
20a50 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72  nce for each ter
20a60 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  m in a compound-
20a70 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c  subquery.  ** fl
20a80 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73  attening (as des
20a90 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20  cribed above).  
20aa0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
20ab0 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64  a different kind
20ac0 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e  .  ** of flatten
20ad0 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69  ing - a flatteni
20ae0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
20af0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
20b00 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20  y flattening -. 
20b10 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f   ** then this lo
20b20 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63  op only runs onc
20b30 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
20b40 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c  s loop moves all
20b50 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
20b60 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
20b70 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
20b80 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
20b90 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
20ba0 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
20bb0 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
20bc0 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
20bd0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
20be0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
20bf0 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
20c00 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
20c10 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
20c20 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
20c30 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
20c40 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
20c50 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
20c60 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
20c70 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
20c80 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
20c90 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
20ca0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
20cb0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
20cc0 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
20cd0 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
20ce0 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
20cf0 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
20d00 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  in..  */.  for(p
20d10 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
20d20 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
20d30 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
20d40 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
20d50 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b      int nSubSrc;
20d60 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65  .    u8 jointype
20d70 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
20d80 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
20d90 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
20da0 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
20db0 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
20dc0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
20dd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
20de0 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
20df0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
20e00 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
20e10 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
20e20 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
20e30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
20e40 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
20e50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20e60 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
20e70 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
20e80 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
20e90 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
20ea0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a  = pSubitem->fg.j
20eb0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
20ec0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
20ed0 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
20ee0 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
20ef0 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
20f00 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
20f10 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
20f20 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
20f30 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
20f40 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
20f50 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
20f60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
20f70 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
20f80 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
20f90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20fa0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
20fb0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
20fc0 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
20fd0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
20fe0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
20ff0 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
21000 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
21010 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
21020 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
21030 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
21040 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
21050 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
21060 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
21070 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
21080 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
21090 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
210a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
210b0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
210c0 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
210d0 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
210e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
210f0 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
21100 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
21110 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
21120 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
21130 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
21140 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
21150 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
21160 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
21170 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
21180 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
21190 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
211a0 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
211b0 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
211c0 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75   query FROM clau
211d0 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20  se to 4 slots.. 
211e0 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65     ** The middle
211f0 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
21200 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
21210 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
21220 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72  space.    ** for
21230 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74   the two element
21240 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
21250 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
21260 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
21270 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
21280 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
21290 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
212a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
212b0 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
212c0 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
212d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
212e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
212f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
21300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21310 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
21320 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
21330 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
21340 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
21350 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
21360 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
21370 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
21380 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
21390 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
213a0 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
213b0 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
213c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
213d0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
213e0 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
213f0 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
21400 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
21410 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
21420 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 70 53   iNewParent = pS
21430 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  ubSrc->a[i].iCur
21440 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  sor;.      memse
21450 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
21460 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
21470 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
21480 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
21490 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  From].fg.jointyp
214a0 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
214b0 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
214c0 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
214d0 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
214e0 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
214f0 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
21500 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
21510 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
21520 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
21530 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
21540 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
21550 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
21560 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
21570 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
21580 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
21590 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
215a0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
215b0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
215c0 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
215d0 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
215e0 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
215f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21600 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
21610 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
21620 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21630 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
21640 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
21650 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
21660 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
21670 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
21680 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
21690 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
216a0 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
216b0 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
216c0 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
216d0 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
216e0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
216f0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
21700 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
21710 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
21720 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
21730 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
21740 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
21750 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
21760 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
21770 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
21780 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
21790 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
217a0 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
217b0 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
217c0 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
217d0 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
217e0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
217f0 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
21800 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
21810 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
21820 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
21830 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
21840 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
21850 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
21860 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
21870 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
21880 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
21890 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
218a0 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
218b0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
218c0 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
218d0 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
218e0 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
218f0 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
21900 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
21910 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
21920 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
21930 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
21940 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
21950 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
21960 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
21970 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
21980 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
21990 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
219a0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
219b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
219c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
219d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
219e0 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
219f0 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
21a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
21a10 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
21a20 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
21a30 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
21a40 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
21a50 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
21a60 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
21a70 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
21a80 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
21a90 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20   }.    pWhere = 
21aa0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
21ab0 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
21ac0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4c   0);.    if( isL
21ad0 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20  eftJoin>0 ){.   
21ae0 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
21af0 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e  Where, iNewParen
21b00 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
21b10 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
21b20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
21b30 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72 65  b, pWhere, pPare
21b40 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  nt->pWhere);.   
21b50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
21b60 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
21b70 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78    SubstContext x
21b80 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65  ;.      x.pParse
21b90 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20   = pParse;.     
21ba0 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61 72   x.iTable = iPar
21bb0 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65  ent;.      x.iNe
21bc0 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61 72  wTable = iNewPar
21bd0 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c  ent;.      x.isL
21be0 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74  eftJoin = isLeft
21bf0 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45  Join;.      x.pE
21c00 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c  List = pSub->pEL
21c10 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74  ist;.      subst
21c20 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65  Select(&x, pPare
21c30 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  nt, 0);.    }.  
21c40 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
21c50 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
21c60 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
21c70 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
21c80 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
21c90 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
21ca0 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
21cb0 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
21cc0 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
21cd0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
21ce0 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
21cf0 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
21d00 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
21d10 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
21d20 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
21d30 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
21d40 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
21d50 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
21d60 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
21d70 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
21d80 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
21d90 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
21da0 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
21db0 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
21dc0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
21dd0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
21de0 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
21df0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
21e00 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
21e10 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
21e20 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
21e30 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
21e40 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
21e50 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
21e60 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
21e70 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
21e80 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
21e90 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  1);..#if SELECTT
21ea0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
21eb0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
21ec0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
21ed0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
21ee0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
21ef0 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
21f00 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  ng:\n"));.    sq
21f10 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
21f20 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
21f30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
21f40 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
21f50 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
21f60 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
21f70 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
21f80 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
21f90 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
21fa0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
21fb0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
21fc0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21fd0 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  VIEW)./*.** Make
21fe0 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76   copies of relev
21ff0 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65  ant WHERE clause
22000 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75   terms of the ou
22010 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a  ter query into.*
22020 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
22030 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20  se of subquery. 
22040 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
22050 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
22060 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c   (SELECT a AS x,
22070 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74   c-d AS y FROM t
22080 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44  1) WHERE x=5 AND
22090 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61   y=10;.**.** Tra
220a0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a  nsformed into:.*
220b0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
220c0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
220d0 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
220e0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
220f0 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20   AND c-d=10).** 
22100 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e      WHERE x=5 AN
22110 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68  D y=10;.**.** Th
22120 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20 74  e hope is that t
22130 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20 74  he terms added t
22140 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72  o the inner quer
22150 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d  y will make it m
22160 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74  ore.** efficient
22170 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ..**.** Do not a
22180 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69  ttempt this opti
22190 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a  mization if:.**.
221a0 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20 54 68 69  **   (1) (** Thi
221b0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 77 61  s restriction wa
221c0 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30 31  s removed on 201
221d0 37 2d 30 39 2d 32 39 2e 20 20 57 65 20 75 73 65  7-09-29.  We use
221e0 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  d to.**         
221f0 20 20 64 69 73 61 6c 6c 6f 77 20 74 68 69 73 20    disallow this 
22200 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
22210 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
22220 65 72 69 65 73 2c 20 62 75 74 20 6e 6f 77 0a 2a  eries, but now.*
22230 2a 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69  *           it i
22240 73 20 61 6c 6c 6f 77 65 64 20 62 79 20 70 75 74  s allowed by put
22250 74 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 74  ting the extra t
22260 65 72 6d 73 20 6f 6e 20 74 68 65 20 48 41 56 49  erms on the HAVI
22270 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  NG clause..**   
22280 20 20 20 20 20 20 20 20 54 68 65 20 61 64 64 65          The adde
22290 64 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  d HAVING clause 
222a0 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 69 66 20  is pointless if 
222b0 74 68 65 20 73 75 62 71 75 65 72 79 20 6c 61 63  the subquery lac
222c0 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ks.**           
222d0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
222e0 65 2e 20 20 42 75 74 20 73 75 63 68 20 61 20 48  e.  But such a H
222f0 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  AVING clause is 
22300 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73 0a 2a 2a  also harmless.**
22310 20 20 20 20 20 20 20 20 20 20 20 73 6f 20 74 68             so th
22320 65 72 65 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ere does not app
22330 65 61 72 20 74 6f 20 62 65 20 61 6e 79 20 72 65  ear to be any re
22340 61 73 6f 6e 20 74 6f 20 61 64 64 20 65 78 74 72  ason to add extr
22350 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20 20 20 20  a logic.**      
22360 20 20 20 20 20 74 6f 20 73 75 70 70 72 65 73 73       to suppress
22370 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20   it. **).**.**  
22380 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (2) The inner q
22390 75 65 72 79 20 69 73 20 74 68 65 20 72 65 63 75  uery is the recu
223a0 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20  rsive part of a 
223b0 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
223c0 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
223d0 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (3) The inner q
223e0 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54  uery has a LIMIT
223f0 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74   clause (since t
22400 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
22410 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20  e WHERE.**      
22420 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61   close would cha
22430 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20  nge the meaning 
22440 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a  of the LIMIT)..*
22450 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69  *.**   (4) The i
22460 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68  nner query is th
22470 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
22480 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
22490 20 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20   (The caller.** 
224a0 20 20 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74        enforces t
224b0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
224c0 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
224d0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ne does not have
224e0 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20   enough.**      
224f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
22500 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  know.).**.**   (
22510 35 29 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  5) The WHERE cla
22520 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  use expression o
22530 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65  riginates in the
22540 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
22550 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  use.**       of 
22560 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a  a LEFT JOIN..**.
22570 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  ** Return 0 if n
22580 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
22590 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  de and non-zero 
225a0 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  if one or more W
225b0 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74  HERE clause.** t
225c0 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61  erms are duplica
225d0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ted into the sub
225e0 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
225f0 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65   int pushDownWhe
22600 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  reTerms(.  Parse
22610 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
22620 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
22630 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  t (for malloc() 
22640 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74  and error report
22650 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ing) */.  Select
22660 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20   *pSubq,        
22670 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
22680 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75  whose WHERE clau
22690 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d  se is to be augm
226a0 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ented */.  Expr 
226b0 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
226c0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
226d0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
226e0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
226f0 20 69 43 75 72 73 6f 72 20 20 20 20 20 20 20 20   iCursor        
22700 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
22710 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75  ber of the subqu
22720 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ery */.){.  Expr
22730 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43   *pNew;.  int nC
22740 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  hng = 0;.  if( p
22750 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72  Where==0 ) retur
22760 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71  n 0;.  if( pSubq
22770 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22780 52 65 63 75 72 73 69 76 65 20 29 20 72 65 74 75  Recursive ) retu
22790 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69  rn 0;  /* restri
227a0 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69  ction (2) */..#i
227b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
227c0 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  G.  /* Only the 
227d0 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 61 20  first term of a 
227e0 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61 76  compound can hav
227f0 65 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 2e  e a WITH clause.
22800 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20    But make.  ** 
22810 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20 74 65  sure no other te
22820 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64 20 53  rms are marked S
22830 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e 20 63  F_Recursive in c
22840 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20 63 68  ase something ch
22850 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68  anges.  ** in th
22860 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  e future..  */. 
22870 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70   {.    Select *p
22880 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70 58 3d  X;  .    for(pX=
22890 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58  pSubq; pX; pX=pX
228a0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
228b0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 73 65   assert( (pX->se
228c0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63  lFlags & (SF_Rec
228d0 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20  ursive))==0 );. 
228e0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
228f0 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c  .  if( pSubq->pL
22900 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72  imit!=0 ){.    r
22910 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
22920 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20  riction (3) */. 
22930 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65   }.  while( pWhe
22940 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
22950 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70  {.    nChng += p
22960 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
22970 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c  s(pParse, pSubq,
22980 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c   pWhere->pRight,
22990 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70   iCursor);.    p
229a0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
229b0 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
229c0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
229d0 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
229e0 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
229f0 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
22a00 28 35 29 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  (5) */.  if( sql
22a10 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
22a20 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20  onstant(pWhere, 
22a30 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  iCursor) ){.    
22a40 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69  nChng++;.    whi
22a50 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20  le( pSubq ){.   
22a60 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
22a70 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  x;.      pNew = 
22a80 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
22a90 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72  Parse->db, pWher
22aa0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 78 2e 70  e, 0);.      x.p
22ab0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
22ac0 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d        x.iTable =
22ad0 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   iCursor;.      
22ae0 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43  x.iNewTable = iC
22af0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69  ursor;.      x.i
22b00 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20  sLeftJoin = 0;. 
22b10 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20       x.pEList = 
22b20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20  pSubq->pEList;. 
22b30 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73       pNew = subs
22b40 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b  tExpr(&x, pNew);
22b50 0a 20 20 20 20 20 20 69 66 28 20 70 53 75 62 71  .      if( pSubq
22b60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22b70 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20  Aggregate ){.   
22b80 20 20 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76       pSubq->pHav
22b90 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
22ba0 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
22bb0 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c   pSubq->pHaving,
22bc0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65   pNew);.      }e
22bd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75  lse{.        pSu
22be0 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  bq->pWhere = sql
22bf0 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
22c00 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70  se->db, pSubq->p
22c10 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
22c20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62      }.      pSub
22c30 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f  q = pSubq->pPrio
22c40 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
22c50 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23  eturn nChng;.}.#
22c60 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
22c70 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
22c80 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
22c90 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
22ca0 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
22cb0 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  Based on the con
22cc0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67  tents of the Agg
22cd0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
22ce0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
22cf0 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
22d00 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
22d10 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66   checks if the f
22d20 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
22d30 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  e:.**.**    * th
22d40 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  e query contains
22d50 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61   just a single a
22d60 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22d70 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  n,.**    * the a
22d80 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22d90 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28  n is either min(
22da0 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a  ) or max(), and.
22db0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75  **    * the argu
22dc0 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72  ment to the aggr
22dd0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
22de0 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
22df0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f  ..**.** If all o
22e00 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
22e10 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45  true, then WHERE
22e20 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
22e30 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
22e40 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  X.** is returned
22e50 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
22e60 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78   Also, *ppMinMax
22e70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
22e80 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74   to the .** list
22e90 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
22ea0 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72  ssed to the aggr
22eb0 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74  egate before ret
22ec0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72  urning..**.** Or
22ed0 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69  , if the conditi
22ee0 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f  ons above are no
22ef0 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78  t met, *ppMinMax
22f00 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
22f10 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42  .** WHERE_ORDERB
22f20 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75  Y_NORMAL is retu
22f30 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
22f40 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41  u8 minMaxQuery(A
22f50 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
22f60 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d  , ExprList **ppM
22f70 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52  inMax){.  int eR
22f80 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
22f90 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20  BY_NORMAL;      
22fa0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
22fb0 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e  lue */..  *ppMin
22fc0 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Max = 0;.  if( p
22fd0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
22fe0 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  1 ){.    Expr *p
22ff0 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Expr = pAggInfo-
23000 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b  >aFunc[0].pExpr;
23010 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75   /* Aggregate fu
23020 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  nction */.    Ex
23030 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
23040 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
23050 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
23060 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69  ts to agg functi
23070 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  on */..    asser
23080 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
23090 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
230a0 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20  .    if( pEList 
230b0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
230c0 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
230d0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  [0].pExpr->op==T
230e0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
230f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
23100 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d   *zFunc = pExpr-
23110 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
23120 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
23130 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22  Cmp(zFunc, "min"
23140 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23150 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
23160 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20  ERBY_MIN;.      
23170 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
23180 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  List;.      }els
23190 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
231a0 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78  ICmp(zFunc, "max
231b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
231c0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
231d0 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20  DERBY_MAX;.     
231e0 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
231f0 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  EList;.      }. 
23200 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
23210 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
23220 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d   || (*ppMinMax)-
23230 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72  >nExpr==1 );.  r
23240 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
23250 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
23260 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
23270 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
23280 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
23290 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
232a0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
232b0 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
232c0 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
232d0 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
232e0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
232f0 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
23300 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
23310 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
23320 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
23330 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
23340 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
23350 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
23360 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
23370 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
23380 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
23390 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
233a0 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
233b0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
233c0 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
233d0 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
233e0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
233f0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
23400 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
23410 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
23420 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
23430 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
23440 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
23450 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
23460 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
23470 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
23480 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
23490 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
234a0 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
234b0 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
234c0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
234d0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
234e0 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
234f0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
23500 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
23510 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
23520 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
23530 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
23540 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
23550 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
23560 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
23570 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
23580 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
23590 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
235a0 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
235b0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
235c0 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
235d0 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
235e0 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
235f0 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45  funcFlags&SQLITE
23600 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
23610 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
23620 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45  ( pExpr->flags&E
23630 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  P_Distinct ) ret
23640 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  urn 0;..  return
23650 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
23660 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  If the source-li
23670 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61  st item passed a
23680 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61  s an argument wa
23690 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
236a0 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42   an.** INDEXED B
236b0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
236c0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ry to locate the
236d0 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78   specified index
236e0 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61  . If there.** wa
236f0 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20  s such a clause 
23700 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  and the named in
23710 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  dex cannot be fo
23720 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  und, return .** 
23730 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
23740 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
23750 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72  in pParse. Other
23760 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a  wise, populate .
23770 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78  ** pFrom->pIndex
23780 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
23790 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
237a0 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
237b0 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  okup(Parse *pPar
237c0 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
237d0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
237e0 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54  .  if( pFrom->pT
237f0 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e  ab && pFrom->fg.
23800 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
23810 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
23820 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
23830 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64    char *zIndexed
23840 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a  By = pFrom->u1.z
23850 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49  IndexedBy;.    I
23860 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
23870 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
23880 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
23890 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
238a0 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
238b0 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b  me, zIndexedBy);
238c0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
238d0 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
238e0 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
238f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23900 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23910 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
23920 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79   %s", zIndexedBy
23930 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
23940 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
23950 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
23960 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
23970 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d      }.    pFrom-
23980 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78  >pIBIndex = pIdx
23990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
239a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
239b0 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
239c0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
239d0 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
239e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
239f0 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
23a00 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
23a10 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
23a20 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
23a30 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
23a40 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
23a50 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
23a60 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
23a70 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
23a80 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
23a90 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
23aa0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
23ab0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
23ac0 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
23ad0 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
23ae0 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
23af0 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
23b00 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
23b10 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
23b20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
23b30 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
23b40 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
23b50 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
23b60 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
23b70 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
23b80 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
23b90 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
23ba0 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
23bb0 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
23bc0 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
23bd0 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
23be0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
23bf0 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
23c00 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
23c10 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
23c20 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
23c30 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
23c40 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
23c50 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
23c60 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
23c70 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
23c80 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
23c90 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
23ca0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
23cb0 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
23cc0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
23cd0 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
23ce0 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
23cf0 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
23d00 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
23d10 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
23d20 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
23d30 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
23d40 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
23d50 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
23d60 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
23d70 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
23d80 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
23d90 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
23da0 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
23db0 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
23dc0 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
23dd0 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
23de0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
23df0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
23e00 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
23e10 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
23e20 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23e30 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
23e40 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
23e50 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
23e60 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
23e70 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
23e80 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
23e90 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
23ea0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
23eb0 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
23ec0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
23ed0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
23ee0 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
23ef0 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
23f00 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
23f10 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
23f20 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23f30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
23f40 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
23f50 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
23f60 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
23f70 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
23f80 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
23f90 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
23fa0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
23fb0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
23fc0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
23fd0 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
23fe0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
23ff0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
24000 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
24010 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
24020 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
24030 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
24040 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
24050 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
24060 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
24070 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
24080 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24090 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
240a0 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
240b0 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
240c0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
240d0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
240e0 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
240f0 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b  (db, TK_ASTERISK
24100 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
24110 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
24120 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
24130 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
24140 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
24150 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
24160 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
24170 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
24180 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
24190 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20   p->pWith = 0;. 
241a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
241b0 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
241c0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
241d0 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72  lags & SF_Conver
241e0 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  ted)==0 );.  p->
241f0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
24200 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65  onverted;.  asse
24210 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  rt( pNew->pPrior
24220 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  !=0 );.  pNew->p
24230 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
24240 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  New;.  pNew->pLi
24250 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
24260 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
24270 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
24280 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  nue;.}../*.** Ch
24290 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
242a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
242b0 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74 61 62  rm pFrom has tab
242c0 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
242d0 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  on.** arguments.
242e0 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6c 65    If it does, le
242f0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
24300 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20 61  sage in pParse a
24310 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
24320 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70 46 72  -zero, since pFr
24330 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  om is not allowe
24340 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c 65 2d  d to be a table-
24350 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e  valued function.
24360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
24370 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
24380 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
24390 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
243a0 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
243b0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61  ( pFrom->fg.isTa
243c0 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c  bFunc ){.    sql
243d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
243e0 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e 6f  rse, "'%s' is no
243f0 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70  t a function", p
24400 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  From->zName);.  
24410 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
24420 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
24430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24440 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67  IT_CTE./*.** Arg
24450 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69  ument pWith (whi
24460 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  ch may be NULL) 
24470 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b  points to a link
24480 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65  ed list of neste
24490 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65  d .** WITH conte
244a0 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20  xts, from inner 
244b0 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66  to outermost. If
244c0 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74   the table ident
244d0 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f  ified by .** FRO
244e0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
244f0 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79   pItem is really
24500 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d   a common-table-
24510 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29  expression (CTE)
24520 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e   .** then return
24530 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24540 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e  e CTE definition
24550 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e   for that table.
24560 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65   Otherwise.** re
24570 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
24580 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   If a non-NULL v
24590 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
245a0 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74  , set *ppContext
245b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
245c0 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20   With.** object 
245d0 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
245e0 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f  d CTE belongs to
245f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
24600 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57 69  ct Cte *searchWi
24610 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74  th(.  With *pWit
24620 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
24630 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
24640 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48 20   innermost WITH 
24650 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
24660 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24670 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46  *pItem,     /* F
24680 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
24690 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f  nt to resolve */
246a0 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74  .  With **ppCont
246b0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
246c0 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20     /* OUT: WITH 
246d0 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76 61  clause return va
246e0 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  lue belongs to *
246f0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
24700 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
24710 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
24720 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  ==0 && (zName = 
24730 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30  pItem->zName)!=0
24740 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b   ){.    With *p;
24750 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68  .    for(p=pWith
24760 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72  ; p; p=p->pOuter
24770 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
24780 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
24790 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
247a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
247b0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
247c0 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
247d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
247e0 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b   *ppContext = p;
247f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
24800 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  n &p->a[i];.    
24810 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24820 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24830 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f   0;.}../* The co
24840 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69  de generator mai
24850 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f  ntains a stack o
24860 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63 6c  f active WITH cl
24870 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68  auses.** with th
24880 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54  e inner-most WIT
24890 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61  H clause being a
248a0 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
248b0 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
248c0 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65  is routine pushe
248d0 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75 73  s the WITH claus
248e0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
248f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
24900 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20  ** onto the top 
24910 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  of the stack. If
24920 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20   argument bFree 
24930 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
24940 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  is.** WITH claus
24950 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
24960 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
24970 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  stack. In this c
24980 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64  ase it.** should
24990 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
249a0 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20 6f  with the Parse o
249b0 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20  bject. In other 
249c0 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62  cases, when.** b
249d0 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74  Free==0, the Wit
249e0 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  h object will be
249f0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
24a00 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a  h the SELECT .**
24a10 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
24a20 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73 6f  which it is asso
24a30 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ciated..*/.void 
24a40 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
24a50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
24a60 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62  ith *pWith, u8 b
24a70 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Free){.  assert(
24a80 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50   bFree==0 || (pP
24a90 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26  arse->pWith==0 &
24aa0 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54  & pParse->pWithT
24ab0 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69  oFree==0) );.  i
24ac0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
24ad0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
24ae0 70 57 69 74 68 21 3d 70 57 69 74 68 20 29 3b 0a  pWith!=pWith );.
24af0 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65      pWith->pOute
24b00 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  r = pParse->pWit
24b10 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
24b20 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
24b30 20 20 69 66 28 20 62 46 72 65 65 20 29 20 70 50    if( bFree ) pP
24b40 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
24b50 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d  e = pWith;.  }.}
24b60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
24b70 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
24b80 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72  argument pFrom r
24b90 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64  efers to a CTE d
24ba0 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61  eclared by .** a
24bb0 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20   WITH clause on 
24bc0 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e  the stack curren
24bd0 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  tly maintained b
24be0 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e  y the parser. An
24bf0 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74  d,.** if current
24c00 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  ly processing a 
24c10 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  CTE expression, 
24c20 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72  if it is a recur
24c30 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  sive.** referenc
24c40 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
24c50 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   CTE..**.** If p
24c60 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20  From falls into 
24c70 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
24c80 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f  o categories abo
24c90 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a  ve, pFrom->pTab.
24ca0 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
24cb0 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  lds are populate
24cc0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
24cd0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
24ce0 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d   check.** (pFrom
24cf0 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65  ->pTab!=0) to de
24d00 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
24d10 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73  or not a success
24d20 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73  ful match.** was
24d30 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   found..**.** Wh
24d40 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d  ether or not a m
24d50 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53  atch is found, S
24d60 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24d70 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
24d80 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61  .** occurs. If a
24d90 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
24da0 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ur, an error mes
24db0 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
24dc0 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20  n the.** parser 
24dd0 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63  and some error c
24de0 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ode other than S
24df0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24e00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24e10 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57   withExpand(.  W
24e20 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
24e30 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
24e40 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b  t_item *pFrom.){
24e50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24e60 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
24e70 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
24e80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24e90 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
24ea0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
24eb0 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45    /* Matched CTE
24ec0 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20   (or NULL if no 
24ed0 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68  match) */.  With
24ee0 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20   *pWith;        
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
24f00 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20  ITH clause that 
24f10 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  pCte belongs to 
24f20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
24f30 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
24f40 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68  .  pCte = search
24f50 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69  With(pParse->pWi
24f60 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74  th, pFrom, &pWit
24f70 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29  h);.  if( pCte )
24f80 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
24f90 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  b;.    ExprList 
24fa0 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c  *pEList;.    Sel
24fb0 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53  ect *pSel;.    S
24fc0 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20  elect *pLeft;   
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24fe0 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  Left-most SELECT
24ff0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
25000 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73    int bMayRecurs
25010 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
25020 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f  /* True if compo
25030 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e  und joined by UN
25040 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20  ION [ALL] */.   
25050 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74   With *pSavedWit
25060 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
25070 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
25080 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  of pParse->pWith
25090 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   */..    /* If p
250a0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
250b0 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
250c0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
250d0 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
250e0 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
250f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
25100 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
25110 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
25120 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
25130 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
25140 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55  e->zCteErr is NU
25150 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  LL, then this is
25160 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
25170 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20   reference..    
25180 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
25190 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20   proceed.  */.  
251a0 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65    if( pCte->zCte
251b0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
251c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
251d0 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45  rse, pCte->zCteE
251e0 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
251f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
25200 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
25210 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e 6e 6f   }.    if( canno
25220 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
25230 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  se, pFrom) ) ret
25240 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25250 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
25260 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
25270 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  .    pFrom->pTab
25280 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
25290 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
252a0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
252b0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
252c0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
252d0 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e  bort;.    pTab->
252e0 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20  nTabRef = 1;.   
252f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
25300 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
25310 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
25320 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
25330 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d   = -1;.    pTab-
25340 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
25350 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
25360 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
25370 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54  48576) );.    pT
25380 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
25390 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54  TF_Ephemeral | T
253a0 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
253b0 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65  ;.    pFrom->pSe
253c0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
253d0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65  lectDup(db, pCte
253e0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
253f0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
25400 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
25410 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
25420 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
25430 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
25440 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
25450 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
25460 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
25470 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
25480 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
25490 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
254a0 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
254b0 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
254c0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
254d0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
254e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
254f0 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
25500 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
25510 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
25520 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
25530 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
25540 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
25550 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
25560 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
25570 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
25580 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
25590 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
255a0 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
255b0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
255c0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
255d0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
255e0 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
255f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
25600 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
25610 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
25620 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  em->fg.isRecursi
25630 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
25640 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
25650 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  +;.          pSe
25660 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  l->selFlags |= S
25670 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20  F_Recursive;.   
25680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25690 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c     }..    /* Onl
256a0 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20  y one recursive 
256b0 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72  reference is per
256c0 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20  mitted. */ .    
256d0 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  if( pTab->nTabRe
256e0 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  f>2 ){.      sql
256f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20  ite3ErrorMsg(.  
25700 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
25710 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65  "multiple refere
25720 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76  nces to recursiv
25730 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43  e table: %s", pC
25740 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
25750 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25760 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25770 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
25780 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  pTab->nTabRef==1
25790 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
257a0 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67   ((pSel->selFlag
257b0 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  s&SF_Recursive) 
257c0 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  && pTab->nTabRef
257d0 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74  ==2 ));..    pCt
257e0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69  e->zCteErr = "ci
257f0 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65  rcular reference
25800 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65  : %s";.    pSave
25810 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e  dWith = pParse->
25820 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
25830 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
25840 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
25850 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
25860 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
25870 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a  = pSel->pPrior;.
25880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
25890 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29  rior->pWith==0 )
258a0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
258b0 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57  pWith = pSel->pW
258c0 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ith;.      sqlit
258d0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
258e0 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20  lker, pPrior);. 
258f0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69       pPrior->pWi
25900 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  th = 0;.    }els
25910 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
25920 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
25930 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
25940 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
25950 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20  th = pWith;..   
25960 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b   for(pLeft=pSel;
25970 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20   pLeft->pPrior; 
25980 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72  pLeft=pLeft->pPr
25990 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74  ior);.    pEList
259a0 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74   = pLeft->pEList
259b0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  ;.    if( pCte->
259c0 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69  pCols ){.      i
259d0 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
259e0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65  ist->nExpr!=pCte
259f0 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29  ->pCols->nExpr )
25a00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25a10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
25a20 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
25a30 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64  %d values for %d
25a40 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20   columns",.     
25a50 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61         pCte->zNa
25a60 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  me, pEList->nExp
25a70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r, pCte->pCols->
25a80 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b  nExpr.        );
25a90 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
25aa0 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
25ab0 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ith;.        ret
25ac0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25ae0 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70  pEList = pCte->p
25af0 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cols;.    }..   
25b00 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
25b10 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
25b20 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61  se, pEList, &pTa
25b30 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
25b40 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  aCol);.    if( b
25b50 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
25b60 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e        if( pSel->
25b70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
25b80 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
25b90 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
25ba0 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63   = "multiple rec
25bb0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
25bc0 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65  s: %s";.      }e
25bd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
25be0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65  e->zCteErr = "re
25bf0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
25c00 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a  e in a subquery:
25c10 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
25c20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
25c30 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
25c40 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
25c50 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
25c60 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  0;.    pParse->p
25c70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74  With = pSavedWit
25c80 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  h;.  }..  return
25c90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
25ca0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
25cb0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
25cc0 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
25cd0 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  T passed as the 
25ce0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
25cf0 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65  has an associate
25d00 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73  d WITH .** claus
25d10 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74  e, pop it from t
25d20 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20  he stack stored 
25d30 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50  as part of the P
25d40 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  arse object..**.
25d50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25d60 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
25d70 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
25d80 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a  () callback by.*
25d90 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  * sqlite3SelectE
25da0 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c  xpand() when wal
25db0 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72  king a SELECT tr
25dc0 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61  ee to resolve ta
25dd0 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64  ble.** names and
25de0 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
25df0 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f  se elements. .*/
25e00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
25e10 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65  ectPopWith(Walke
25e20 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
25e30 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
25e40 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
25e50 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 66 28  r->pParse;.  if(
25e60 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52   OK_IF_ALWAYS_TR
25e70 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  UE(pParse->pWith
25e80 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ) && p->pPrior==
25e90 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
25ea0 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74  With = findRight
25eb0 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a  most(p)->pWith;.
25ec0 20 20 20 20 69 66 28 20 70 57 69 74 68 21 3d 30      if( pWith!=0
25ed0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
25ee0 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  ( pParse->pWith=
25ef0 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 20 20  =pWith );.      
25f00 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
25f10 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20  pWith->pOuter;. 
25f20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
25f30 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50  .#define selectP
25f40 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a  opWith 0.#endif.
25f50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
25f60 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
25f70 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
25f80 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
25f90 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
25fa0 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
25fb0 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
25fc0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
25fd0 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
25fe0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
25ff0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
26000 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
26010 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
26020 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
26030 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
26040 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
26050 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
26060 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
26070 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
26080 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
26090 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
260a0 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
260b0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
260c0 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
260d0 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
260e0 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
260f0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
26100 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
26110 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
26120 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
26130 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
26140 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
26150 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
26160 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
26170 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
26180 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
26190 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
261a0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
261b0 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
261c0 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
261d0 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
261e0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
261f0 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
26200 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
26210 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
26220 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
26230 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
26240 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
26250 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
26260 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
26270 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
26280 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
26290 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
262a0 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
262b0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
262c0 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
262d0 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
262e0 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
262f0 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
26300 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
26310 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
26320 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
26330 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
26340 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
26350 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
26360 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
26370 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
26380 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
26390 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
263a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
263b0 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
263c0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
263d0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
263e0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
263f0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
26400 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
26410 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
26420 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
26430 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
26440 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
26450 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
26460 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
26470 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
26480 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
26490 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
264a0 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73  elFlags;..  p->s
264b0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
264c0 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62  panded;.  if( db
264d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
264e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
264f0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  C_Abort;.  }.  i
26500 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63  f( NEVER(p->pSrc
26510 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67  ==0) || (selFlag
26520 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
26530 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
26540 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
26550 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
26560 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
26570 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
26580 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
26590 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20 29  TRUE(p->pWith) )
265a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74  {.    sqlite3Wit
265b0 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d  hPush(pParse, p-
265c0 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a  >pWith, 0);.  }.
265d0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
265e0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
265f0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
26600 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
26610 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
26620 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
26630 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
26640 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
26650 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
26660 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
26670 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
26680 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
26690 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
266a0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
266b0 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
266c0 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
266d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
266e0 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
266f0 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
26700 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
26710 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
26720 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
26730 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
26740 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
26750 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
26760 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
26770 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
26780 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
26790 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
267a0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
267b0 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
267c0 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72  ursive==0 || pFr
267d0 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20  om->pTab!=0 );. 
267e0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67     if( pFrom->fg
267f0 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63  .isRecursive ) c
26800 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
26810 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
26820 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
26830 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
26840 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e     if( withExpan
26850 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  d(pWalker, pFrom
26860 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
26870 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46  bort;.    if( pF
26880 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65  rom->pTab ) {} e
26890 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
268a0 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
268b0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
268c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
268d0 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
268e0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
268f0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
26900 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
26910 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
26920 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
26930 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
26940 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
26950 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
26960 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b==0 );.      if
26970 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c  ( sqlite3WalkSel
26980 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
26990 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  l) ) return WRC_
269a0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72  Abort;.      pFr
269b0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
269c0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
269d0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
269e0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
269f0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
26a00 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26a10 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
26a20 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Ref = 1;.      i
26a30 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  f( pFrom->zAlias
26a40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62   ){.        pTab
26a50 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
26a60 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 46  3DbStrDup(db, pF
26a70 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  rom->zAlias);.  
26a80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26a90 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
26aa0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
26ab0 64 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25 70  db, "subquery_%p
26ac0 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
26ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
26ae0 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
26af0 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65  or ){ pSel = pSe
26b00 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20  l->pPrior; }.   
26b10 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
26b20 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
26b30 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
26b40 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26  st,&pTab->nCol,&
26b50 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
26b60 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
26b70 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
26b80 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
26b90 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
26ba0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
26bb0 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20  48576) );.      
26bc0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
26bd0 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
26be0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
26bf0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
26c00 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
26c10 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
26c20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
26c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
26c40 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
26c50 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
26c60 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
26c70 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
26c80 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
26c90 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
26ca0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
26cb0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26cc0 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
26cd0 65 66 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef>=0xffff ){.  
26ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
26cf0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
26d00 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
26d10 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
26d20 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
26d30 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
26d40 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
26d50 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
26d60 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
26d70 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
26d80 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
26d90 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  f++;.      if( !
26da0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
26db0 26 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  && cannotBeFunct
26dc0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
26dd0 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  m) ){.        re
26de0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26df0 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66        }.#if !def
26e00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
26e10 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
26e20 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
26e30 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
26e40 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
26e50 6c 28 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d  l(pTab) || pTab-
26e60 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
26e70 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20      i16 nCol;.  
26e80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26e90 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
26ea0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
26eb0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
26ec0 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
26ed0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
26ee0 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
26ef0 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
26f00 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
26f10 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
26f20 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
26f30 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
26f40 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e  tSetName(pFrom->
26f50 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a  pSelect, pTab->z
26f60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Name);.        n
26f70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
26f80 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ;.        pTab->
26f90 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20  nCol = -1;.     
26fa0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
26fb0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
26fc0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
26fd0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
26fe0 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  l = nCol;.      
26ff0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
27000 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68      /* Locate th
27010 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79  e index named by
27020 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
27030 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20  clause, if any. 
27040 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
27050 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
27060 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  p(pParse, pFrom)
27070 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27080 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
27090 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
270a0 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
270b0 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
270c0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
270d0 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
270e0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
270f0 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72  iled || sqlitePr
27100 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
27110 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
27120 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
27130 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  }..  /* For ever
27140 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
27150 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
27160 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
27170 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
27180 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
27190 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
271a0 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
271b0 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
271c0 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
271d0 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
271e0 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
271f0 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
27200 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
27210 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52  ith the TK_ASTER
27220 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ISK operator for
27230 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
27240 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
27250 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e  olumn.  ** list.
27260 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
27270 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
27280 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
27290 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70  STERISK.  ** exp
272a0 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
272b0 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20  and each one to 
272c0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
272d0 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20  columns in.  ** 
272e0 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
272f0 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
27300 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
27310 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
27320 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
27330 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
27340 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
27350 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
27360 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
27370 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d  ; k++){.    pE =
27380 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
27390 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
273a0 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
273b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
273c0 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
273d0 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
273e0 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht!=0 );.    ass
273f0 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
27400 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66  DOT || (pE->pLef
27410 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66  t!=0 && pE->pLef
27420 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b  t->op==TK_ID) );
27430 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
27440 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
27450 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  Right->op==TK_AS
27460 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a  TERISK ) break;.
27470 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69    }.  if( k<pELi
27480 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
27490 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
274a0 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
274b0 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
274c0 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
274d0 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
274e0 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
274f0 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
27500 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
27510 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
27520 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
27530 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
27540 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
27550 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
27560 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
27570 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
27580 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
27590 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
275a0 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
275b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
275c0 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
275d0 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
275e0 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
275f0 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20  ames)!=0.       
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
27610 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
27620 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
27630 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ==0;..    for(k=
27640 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
27650 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
27660 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
27670 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
27680 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pE->pRight;.    
27690 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
276a0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
276b0 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
276c0 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53  f( pE->op!=TK_AS
276d0 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26  TERISK.       &&
276e0 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54   (pE->op!=TK_DOT
276f0 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d   || pRight->op!=
27700 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20  TK_ASTERISK).   
27710 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
27720 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
27730 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
27740 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
27750 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
27760 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
27770 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
27780 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
27790 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
277a0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
277b0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
277c0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
277d0 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
277e0 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
277f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
27800 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
27810 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61  Span = a[k].zSpa
27820 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  n;.          a[k
27830 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
27840 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61         a[k].zSpa
27850 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  n = 0;.        }
27860 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
27870 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  xpr = 0;.      }
27880 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
27890 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
278a0 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
278b0 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
278c0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
278d0 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
278e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
278f0 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
27900 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
27910 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
27920 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
27930 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  *zTName = 0;    
27940 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
27950 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
27960 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
27970 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
27980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
27990 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  E->pLeft!=0 );. 
279a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
279b0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
279c0 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f  y(pE->pLeft, EP_
279d0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
279e0 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
279f0 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  pE->pLeft->u.zTo
27a00 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ken;.        }. 
27a10 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
27a20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
27a30 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
27a40 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
27a50 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
27a60 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
27a70 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
27a80 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
27a90 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
27aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
27ab0 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
27ac0 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
27ad0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
27ae0 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20   *zSchemaName = 
27af0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
27b00 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
27b10 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
27b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
27b30 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
27b40 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
27b50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
27b60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
27b70 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
27b80 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30       if( pSub==0
27b90 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c   || (pSub->selFl
27ba0 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
27bb0 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rom)==0 ){.     
27bc0 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b         pSub = 0;
27bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27be0 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
27bf0 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
27c00 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
27c10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27c20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27c40 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
27c50 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
27c60 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
27c70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
27c80 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62  SchemaName = iDb
27c90 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44  >=0 ? db->aDb[iD
27ca0 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a  b].zDbSName : "*
27cb0 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
27cc0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
27cd0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
27ce0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
27cf0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
27d00 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
27d10 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
27d20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
27d30 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
27d40 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
27d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
27d60 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
27d70 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
27d80 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
27d90 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
27da0 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
27db0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
27dc0 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
27dd0 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
27de0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
27df0 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
27e00 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
27e10 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
27e20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
27e30 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
27e40 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
27e50 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
27e60 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
27e70 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
27e80 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
27e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
27ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
27eb0 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
27ec0 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
27ed0 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20  ', omit it from 
27ee0 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
27ef0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
27f00 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65  lt-set list unle
27f10 73 73 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ss the SELECT ha
27f20 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65  s the SF_Include
27f30 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20  Hidden.         
27f40 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20     ** bit set.. 
27f50 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
27f60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
27f70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27f80 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d  IncludeHidden)==
27f90 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
27fa0 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  & IsHiddenColumn
27fb0 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
27fc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
27fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
27fe0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
27ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28000 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
28010 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
28020 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
28030 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
28040 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
28050 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
28060 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
28070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
28080 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
28090 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
280a0 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
280b0 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
280e0 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
280f0 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
28100 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
28110 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
28120 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
28130 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
28140 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
28150 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
28160 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
28170 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
28180 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
28190 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
281a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
281b0 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
281c0 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
281d0 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
281e0 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
281f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
28200 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
28210 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
28220 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
28230 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
28240 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
28250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28260 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
28270 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
28280 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
28290 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
282a0 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
282b0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
282c0 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
282d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
282e0 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
282f0 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
28310 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
28320 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
28330 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
28340 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
28350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
28360 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
28370 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
28380 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
28390 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
283a0 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e      if( zSchemaN
283b0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
283c0 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
283d0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
283e0 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d  K_ID, zSchemaNam
283f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28400 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
28410 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
28420 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
28430 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
28440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28450 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
28460 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
28470 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
28480 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
28490 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
284a0 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  abName, zName);.
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284c0 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61  zToFree = zColna
284d0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
284e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
284f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28500 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
28510 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
28520 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
28530 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
28540 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
28550 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29  se, pNew, pExpr)
28560 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
28570 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
28580 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  sColname, zColna
28590 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
285a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
285b0 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
285c0 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
285d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
285e0 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d   if( pNew && (p-
285f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
28600 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b  estedFrom)!=0 ){
28610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
28620 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
28630 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d  tem *pX = &pNew-
28640 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
28650 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
28660 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20   if( pSub ){.   
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
28680 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
28690 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75  DbStrDup(db, pSu
286a0 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
286b0 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
286c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
286d0 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
286e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
286f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28700 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
28710 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
28720 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22  f(db, "%s.%s.%s"
28730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63               zSc
28760 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  hemaName, zTabNa
28770 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
28790 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
287a0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
287b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
287c0 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e         pX->bSpan
287d0 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20  IsTab = 1;.     
287e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
287f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
28800 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b  ee(db, zToFree);
28810 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
28830 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
28840 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
28850 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
28860 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
28870 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
28880 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
28890 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
288a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
288b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
288c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
288d0 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
288e0 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
288f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28900 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28910 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
28920 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
28930 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
28940 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
28950 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
28960 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
28970 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
28980 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
28990 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
289a0 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
289b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
289c0 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
289d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
289e0 74 20 73 65 74 22 29 3b 0a 20 20 20 20 72 65 74  t set");.    ret
289f0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
28a00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
28a10 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
28a30 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
28a40 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
28a50 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
28a60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
28a70 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
28a80 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
28a90 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
28aa0 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
28ab0 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
28ac0 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
28ad0 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
28ae0 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
28af0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
28b00 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
28b10 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
28b20 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
28b30 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
28b40 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
28b50 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
28b60 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
28b70 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
28b80 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ree..*/.int sqli
28b90 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  te3ExprWalkNoop(
28ba0 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
28bb0 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
28bc0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
28bd0 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
28be0 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
28bf0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
28c10 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
28c20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
28c30 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  r for SELECT sta
28c40 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71  tements..** subq
28c50 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
28c60 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
28c70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
28c80 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
28c90 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e  tUsed, Select *N
28ca0 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
28cb0 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
28cc0 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
28cd0 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
28ce0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20  ontinue;.}..#if 
28cf0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
28d00 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72 74  ** Always assert
28d10 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63 74 43  .  This xSelectC
28d20 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65  allback2 impleme
28d30 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74  ntation proves t
28d40 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65  hat the.** xSele
28d50 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e  ctCallback2 is n
28d60 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  ever invoked..*/
28d70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
28d80 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57  ectWalkAssert2(W
28d90 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
28da0 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
28db0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
28dc0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
28dd0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73  NotUsed2);.  ass
28de0 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64  ert( 0 );.}.#end
28df0 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  if./*.** This ro
28e00 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
28e10 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
28e20 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
28e30 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
28e40 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
28e50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
28e60 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
28e70 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
28e80 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
28e90 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
28ea0 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
28eb0 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
28ec0 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
28ed0 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
28ee0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
28ef0 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
28f00 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
28f10 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
28f20 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
28f30 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
28f40 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
28f50 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
28f60 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
28f70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
28f80 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
28f90 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
28fa0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
28fb0 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
28fc0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
28fd0 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
28fe0 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
28ff0 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
29000 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
29010 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
29020 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
29030 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
29040 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
29050 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
29060 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
29070 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
29080 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
29090 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
290a0 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
290b0 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
290c0 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
290d0 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
290e0 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  nd) ){.    w.xSe
290f0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
29100 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
29110 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
29120 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
29130 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20  lback2 = 0;.    
29140 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
29150 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
29160 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
29170 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
29180 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
29190 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
291a0 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
291b0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
291c0 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
291d0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
291e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
291f0 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
29200 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
29210 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
29220 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
29230 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
29240 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
29250 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
29260 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
29270 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
29280 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
29290 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
292a0 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
292b0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
292c0 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
292d0 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
292e0 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
292f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
29300 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
29310 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
29320 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
29330 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
29340 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
29350 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
29360 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
29370 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
29380 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
29390 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
293a0 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
293b0 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
293c0 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
293d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
293e0 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
293f0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
29400 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
29410 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
29420 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
29430 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
29440 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
29450 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
29460 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
29470 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
29480 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
29490 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
294a0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
294b0 6c 76 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  lved );.  assert
294c0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
294d0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29   SF_HasTypeInfo)
294e0 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
294f0 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79  lags |= SF_HasTy
29500 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  peInfo;.  pParse
29510 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
29520 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  se;.  pTabList =
29530 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28   p->pSrc;.  for(
29540 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
29550 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
29560 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
29570 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
29580 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
29590 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
295a0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
295b0 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
295c0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
295d0 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  meral)!=0 ){.   
295e0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
295f0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
29600 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
29610 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
29620 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
29630 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69  pSelect;.      i
29640 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20  f( pSel ){.     
29650 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
29660 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
29670 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
29680 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
29690 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
296a0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
296b0 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29  rse, pTab, pSel)
296c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
296d0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
296e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
296f0 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20  e adds datatype 
29700 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
29710 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  quence informati
29720 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62  on to.** the Tab
29730 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  le structures of
29740 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
29750 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61   subqueries in a
29760 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
29770 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ment..**.** Use 
29780 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74  this routine aft
29790 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
297a0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
297b0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
297c0 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73  AddTypeInfo(Pars
297d0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
297e0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66  t *pSelect){.#if
297f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29800 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b  _SUBQUERY.  Walk
29810 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63  er w;.  w.xSelec
29820 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
29830 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f  te3SelectWalkNoo
29840 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
29850 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
29860 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
29870 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
29880 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
29890 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
298a0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
298b0 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
298c0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
298d0 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
298e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
298f0 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c  ne sets up a SEL
29900 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
29910 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
29920 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
29930 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
29940 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
29950 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
29960 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
29970 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
29980 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
29990 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
299a0 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
299b0 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
299c0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
299d0 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
299e0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
299f0 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
29a00 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
29a10 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
29a20 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
29a30 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
29a40 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
29a50 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
29a60 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
29a70 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
29a80 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
29a90 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
29aa0 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
29ab0 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
29ac0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
29ad0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
29ae0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
29af0 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
29b00 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
29b10 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
29b20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
29b30 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
29b40 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
29b50 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
29b60 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
29b70 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
29b80 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
29b90 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
29ba0 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ner */.){.  asse
29bb0 72 74 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72  rt( p!=0 || pPar
29bc0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
29bd0 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50  iled );.  if( pP
29be0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
29bf0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
29c00 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
29c10 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
29c20 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
29c30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
29c40 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  and(pParse, p);.
29c50 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
29c60 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
29c70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29c80 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
29c90 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
29ca0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ames(pParse, p, 
29cb0 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28  pOuterNC);.  if(
29cc0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
29cd0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
29ce0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
29cf0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
29d00 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70  ectAddTypeInfo(p
29d10 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  Parse, p);.}../*
29d20 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
29d30 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
29d40 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
29d50 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
29d60 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
29d70 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
29d80 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
29d90 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
29da0 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
29db0 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
29dc0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
29dd0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
29de0 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c  that stores NULL
29df0 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
29e00 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c  e memory.** cell
29e10 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
29e20 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
29e30 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
29e40 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
29e50 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
29e60 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
29e70 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
29e80 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
29e90 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52  *pFunc;.  int nR
29ea0 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  eg = pAggInfo->n
29eb0 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d  Func + pAggInfo-
29ec0 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20  >nColumn;.  if( 
29ed0 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nReg==0 ) return
29ee0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
29ef0 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
29f00 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e  y that all AggIn
29f10 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65  fo registers are
29f20 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67   within the rang
29f30 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20  e specified by. 
29f40 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65   ** AggInfo.mnRe
29f50 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67  g..AggInfo.mxReg
29f60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52   */.  assert( nR
29f70 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg==pAggInfo->mx
29f80 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  Reg-pAggInfo->mn
29f90 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69  Reg+1 );.  for(i
29fa0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
29fb0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
29fc0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
29fd0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
29fe0 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
29ff0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
2a000 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
2a010 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
2a020 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20  >mxReg );.  }.  
2a030 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
2a040 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29  nfo->nFunc; i++)
2a050 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
2a060 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2a070 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
2a080 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
2a090 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  && pAggInfo->aFu
2a0a0 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  nc[i].iMem<=pAgg
2a0b0 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
2a0c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
2a0d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2a0e0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
2a0f0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41  gInfo->mnReg, pA
2a100 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a  ggInfo->mxReg);.
2a110 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
2a120 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
2a130 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2a140 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
2a150 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  +){.    if( pFun
2a160 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
2a170 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
2a180 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
2a190 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2a1a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2a1b0 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pE, EP_xIsSelec
2a1c0 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
2a1d0 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c  pE->x.pList==0 |
2a1e0 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pE->x.pList->n
2a1f0 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
2a200 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2a210 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
2a220 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20  INCT aggregates 
2a230 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
2a240 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20  y one ".        
2a250 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a     "argument");.
2a260 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
2a270 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
2a280 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a290 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2a2a0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
2a2b0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2a2c0 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c  se, pE->x.pList,
2a2d0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
2a2e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a2f0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2a300 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
2a310 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 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 20 20 20 28 63 68 61 72 2a 29           (char*)
2a340 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2a350 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
2a360 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2a370 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
2a380 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
2a390 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
2a3a0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
2a3b0 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
2a3c0 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
2a3d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
2a3e0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
2a3f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2a400 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2a410 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2a420 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2a430 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2a440 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2a450 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
2a460 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
2a470 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2a480 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
2a490 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2a4a0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
2a4b0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
2a4c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2a4d0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
2a4e0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2a4f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
2a500 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2a510 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
2a520 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
2a530 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
2a540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
2a550 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46  pendP4(v, pF->pF
2a560 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
2a570 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
2a580 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
2a590 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
2a5a0 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
2a5b0 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
2a5c0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
2a5d0 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
2a5e0 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
2a5f0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
2a600 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2a610 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2a620 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2a630 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2a640 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69  t i;.  int regHi
2a650 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64  t = 0;.  int add
2a660 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20  rHitTest = 0;.  
2a670 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2a680 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
2a690 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
2a6a0 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
2a6b0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
2a6c0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
2a6d0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
2a6e0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2a6f0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
2a700 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
2a710 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
2a720 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
2a730 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
2a740 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
2a750 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
2a760 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2a770 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
2a780 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2a790 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
2a7a0 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
2a7b0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
2a7c0 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
2a7d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2a7e0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67  nge(pParse, nArg
2a7f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a800 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2a810 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
2a820 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54  regAgg, 0, SQLIT
2a830 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20  E_ECEL_DUP);.   
2a840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
2a850 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
2a860 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
2a870 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
2a880 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
2a890 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
2a8a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2a8b0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
2a8c0 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b  case( nArg==0 );
2a8d0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69    /* Error condi
2a8e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65  tion */.      te
2a8f0 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29  stcase( nArg>1 )
2a900 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65  ;   /* Also an e
2a910 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  rror */.      co
2a920 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
2a930 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  e, pF->iDistinct
2a940 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72  , addrNext, 1, r
2a950 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20  egAgg);.    }.  
2a960 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
2a970 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
2a980 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
2a990 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  L ){.      CollS
2a9a0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
2a9b0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2a9c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2a9d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
2a9e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
2a9f0 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69  st!=0 );  /* pLi
2aa00 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75  st!=0 if pF->pFu
2aa10 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20  nc has NEEDCOLL 
2aa20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  */.      for(j=0
2aa30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
2aa40 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41  ; !pColl && j<nA
2aa50 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rg; j++, pItem++
2aa60 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
2aa70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2aa80 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
2aa90 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
2aaa0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2aab0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
2aac0 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
2aad0 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
2aae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2aaf0 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70  ( regHit==0 && p
2ab00 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
2ab10 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d  lator ) regHit =
2ab20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2ab30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ab40 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
2ab50 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20  ollSeq, regHit, 
2ab60 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
2ab70 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
2ab80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2ab90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2aba0 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c   OP_AggStep0, 0,
2abb0 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
2abc0 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
2abd0 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
2abe0 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
2abf0 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
2ac00 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2ac10 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
2ac20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2ac30 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
2ac40 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2ac50 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
2ac60 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2ac70 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
2ac80 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
2ac90 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
2aca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2acb0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
2acc0 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
2acd0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2ace0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2acf0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
2ad00 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67  efore populating
2ad10 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2ad20 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61   registers, clea
2ad30 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  r the column cac
2ad40 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  he..  ** Otherwi
2ad50 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68  se, if any of th
2ad60 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  e required colum
2ad70 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72  n values are alr
2ad80 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20  eady present .  
2ad90 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c  ** in registers,
2ada0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2adb0 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43  () may use OP_SC
2adc0 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  opy to copy the 
2add0 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43  value.  ** to pC
2ade0 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74  ->iMem. But by t
2adf0 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75  he time the valu
2ae00 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f  e is used, the o
2ae10 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72  riginal register
2ae20 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62  .  ** may have b
2ae30 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69  een used, invali
2ae40 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72  dating the under
2ae50 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c  lying buffer hol
2ae60 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65  ding the.  ** te
2ae70 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65  xt or blob value
2ae80 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38  . See ticket [88
2ae90 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a  3034dcb5]..  **.
2aea0 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c    ** Another sol
2aeb0 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74  ution would be t
2aec0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  o change the OP_
2aed0 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f  SCopy used to co
2aee0 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76  py cached.  ** v
2aef0 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43  alues to an OP_C
2af00 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  opy..  */.  if( 
2af10 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64  regHit ){.    ad
2af20 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69  drHitTest = sqli
2af30 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2af40 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b   OP_If, regHit);
2af50 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2af60 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2af70 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2af80 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
2af90 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
2afa0 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
2afb0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
2afc0 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
2afd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
2afe0 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
2aff0 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
2b000 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
2b010 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
2b020 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2b030 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2b040 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
2b050 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2b060 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2b070 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
2b080 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
2b090 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
2b0a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
2b0b0 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
2b0c0 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
2b0d0 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
2b0e0 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
2b0f0 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
2b100 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b110 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
2b120 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
2b130 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
2b140 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b160 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
2b170 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
2b180 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b190 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
2b1a0 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
2b1b0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1d0 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
2b1e0 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
2b1f0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
2b200 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
2b210 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69  lain==2 ){.    i
2b220 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64  nt bCover = (pId
2b230 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69  x!=0 && (HasRowi
2b240 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72  d(pTab) || !IsPr
2b250 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
2b260 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20  dx)));.    char 
2b270 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d  *zEqp = sqlite3M
2b280 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
2b290 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  b, "SCAN TABLE %
2b2a0 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
2b2b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
2b2c0 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20       bCover ? " 
2b2d0 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
2b2e0 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
2b2f0 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49       bCover ? pI
2b300 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20  dx->zName : "". 
2b310 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
2b320 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
2b330 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64       pParse->pVd
2b340 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  be, OP_Explain, 
2b350 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2b360 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50  d, 0, 0, zEqp, P
2b370 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b  4_DYNAMIC.    );
2b380 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
2b390 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d  efine explainSim
2b3a0 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a  pleCount(a,b,c).
2b3b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
2b3c0 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72  ntext object for
2b3d0 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78   havingToWhereEx
2b3e0 70 72 43 62 28 29 2e 0a 2a 2f 0a 73 74 72 75 63  prCb()..*/.struc
2b3f0 74 20 48 61 76 69 6e 67 54 6f 57 68 65 72 65 43  t HavingToWhereC
2b400 74 78 20 7b 0a 20 20 45 78 70 72 20 2a 2a 70 70  tx {.  Expr **pp
2b410 57 68 65 72 65 3b 0a 20 20 45 78 70 72 4c 69 73  Where;.  ExprLis
2b420 74 20 2a 70 47 72 6f 75 70 42 79 3b 0a 7d 3b 0a  t *pGroupBy;.};.
2b430 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61  ./*.** sqlite3Wa
2b440 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63  lkExpr() callbac
2b450 6b 20 75 73 65 64 20 62 79 20 68 61 76 69 6e 67  k used by having
2b460 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a  ToWhere()..**.**
2b470 20 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73   If the node pas
2b480 73 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  sed to the callb
2b490 61 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20  ack is a TK_AND 
2b4a0 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  node, return .**
2b4b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f   WRC_Continue to
2b4c0 20 74 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c   tell sqlite3Wal
2b4d0 6b 45 78 70 72 28 29 20 74 6f 20 69 74 65 72 61  kExpr() to itera
2b4e0 74 65 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64  te through child
2b4f0 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   nodes..**.** Ot
2b500 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2b510 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68  WRC_Prune. In th
2b520 69 73 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68  is case, also ch
2b530 65 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  eck if the .** s
2b540 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  ub-expression ma
2b550 74 63 68 65 73 20 74 68 65 20 63 72 69 74 65 72  tches the criter
2b560 69 61 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76  ia for being mov
2b570 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  ed to the WHERE.
2b580 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f  ** clause. If so
2b590 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  , add it to the 
2b5a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
2b5b0 20 72 65 70 6c 61 63 65 20 74 68 65 20 73 75 62   replace the sub
2b5c0 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77  -expression.** w
2b5d0 69 74 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47  ithin the HAVING
2b5e0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
2b5f0 20 61 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e   a constant "1".
2b600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2b610 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72  avingToWhereExpr
2b620 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  Cb(Walker *pWalk
2b630 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2b640 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
2b650 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p!=TK_AND ){.   
2b660 20 73 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f   struct HavingTo
2b670 57 68 65 72 65 43 74 78 20 2a 70 20 3d 20 70 57  WhereCtx *p = pW
2b680 61 6c 6b 65 72 2d 3e 75 2e 70 48 61 76 69 6e 67  alker->u.pHaving
2b690 43 74 78 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Ctx;.    if( sql
2b6a0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
2b6b0 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61 6c  ntOrGroupBy(pWal
2b6c0 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45 78  ker->pParse, pEx
2b6d0 70 72 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  pr, p->pGroupBy)
2b6e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b6f0 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d  3 *db = pWalker-
2b700 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
2b710 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
2b720 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
2b730 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
2b740 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
2b750 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ns[1], 0);.     
2b760 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
2b770 20 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72       Expr *pWher
2b780 65 20 3d 20 2a 28 70 2d 3e 70 70 57 68 65 72 65  e = *(p->ppWhere
2b790 29 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  );.        SWAP(
2b7a0 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45  Expr, *pNew, *pE
2b7b0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  xpr);.        pN
2b7c0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2b7d0 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20  And(db, pWhere, 
2b7e0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 2a  pNew);.        *
2b7f0 28 70 2d 3e 70 70 57 68 65 72 65 29 20 3d 20 70  (p->ppWhere) = p
2b800 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  New;.      }.   
2b810 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52   }.    return WR
2b820 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72  C_Prune;.  }.  r
2b830 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2b840 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  ue;.}../*.** Tra
2b850 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74  nsfer eligible t
2b860 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41  erms from the HA
2b870 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  VING clause of a
2b880 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69 73   query, which is
2b890 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66  .** processed af
2b8a0 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f  ter grouping, to
2b8b0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2b8c0 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f 63  e, which is proc
2b8d0 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  essed before.** 
2b8e0 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78  grouping. For ex
2b8f0 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
2b900 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
2b910 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e   * FROM <tables>
2b920 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50   WHERE a=? GROUP
2b930 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f   BY b HAVING b=?
2b940 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63   AND c=?.**.** c
2b950 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
2b960 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  as:.**.**   SELE
2b970 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65  CT * FROM <table
2b980 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  s> WHERE a=? AND
2b990 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20   b=? GROUP BY b 
2b9a0 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a  HAVING c=?.**.**
2b9b0 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   A term of the H
2b9c0 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2b9d0 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72   is eligible for
2b9e0 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74 20   transfer if it 
2b9f0 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69  consists.** enti
2ba00 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74  rely of constant
2ba10 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e  s and expression
2ba20 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
2ba30 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74  GROUP BY terms t
2ba40 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22  hat.** use the "
2ba50 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f  BINARY" collatio
2ba60 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  n sequence..*/.s
2ba70 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e  tatic void havin
2ba80 67 54 6f 57 68 65 72 65 28 0a 20 20 50 61 72 73  gToWhere(.  Pars
2ba90 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70  e *pParse,.  Exp
2baa0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
2bab0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
2bac0 2c 20 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68  , .  Expr **ppWh
2bad0 65 72 65 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  ere.){.  struct 
2bae0 48 61 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78  HavingToWhereCtx
2baf0 20 73 43 74 78 3b 0a 20 20 57 61 6c 6b 65 72 20   sCtx;.  Walker 
2bb00 73 57 61 6c 6b 65 72 3b 0a 0a 20 20 73 43 74 78  sWalker;..  sCtx
2bb10 2e 70 70 57 68 65 72 65 20 3d 20 70 70 57 68 65  .ppWhere = ppWhe
2bb20 72 65 3b 0a 20 20 73 43 74 78 2e 70 47 72 6f 75  re;.  sCtx.pGrou
2bb30 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
2bb40 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
2bb50 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  er, 0, sizeof(sW
2bb60 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b  alker));.  sWalk
2bb70 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
2bb80 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45  se;.  sWalker.xE
2bb90 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61  xprCallback = ha
2bba0 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43  vingToWhereExprC
2bbb0 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70  b;.  sWalker.u.p
2bbc0 48 61 76 69 6e 67 43 74 78 20 3d 20 26 73 43 74  HavingCtx = &sCt
2bbd0 78 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  x;.  sqlite3Walk
2bbe0 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70  Expr(&sWalker, p
2bbf0 48 61 76 69 6e 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Having);.}../*.*
2bc00 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2bc10 66 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72  f the pThis entr
2bc20 79 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73  y of pTabList is
2bc30 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20   a self-join of 
2bc40 61 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a  a prior view..**
2bc50 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
2bc60 72 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69  return the SrcLi
2bc70 73 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20  st_item for the 
2bc80 70 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20  prior view.  If 
2bc90 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68  it is not,.** th
2bca0 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  en return 0..*/.
2bcb0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72  static struct Sr
2bcc0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65  cList_item *isSe
2bcd0 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72  lfJoinView(.  Sr
2bce0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
2bcf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2bd00 61 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f  arch for self-jo
2bd10 69 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d  ins in this FROM
2bd20 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
2bd30 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2bd40 20 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61   *pThis   /* Sea
2bd50 72 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65  rch for prior re
2bd60 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2bd70 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
2bd80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2bd90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66  item *pItem;.  f
2bda0 6f 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c  or(pItem = pTabL
2bdb0 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54  ist->a; pItem<pT
2bdc0 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  his; pItem++){. 
2bdd0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2bde0 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69  elect==0 ) conti
2bdf0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
2be00 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2be10 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ine ) continue;.
2be20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2be30 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Name==0 ) contin
2be40 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2be50 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65  te3_stricmp(pIte
2be60 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54  m->zDatabase, pT
2be70 68 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21  his->zDatabase)!
2be80 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2be90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2bea0 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  tricmp(pItem->zN
2beb0 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d  ame, pThis->zNam
2bec0 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
2bed0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2bee0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2bef0 0a 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73  .          pThis
2bf00 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
2bf10 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
2bf20 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a  t->pWhere, -1) .
2bf30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2bf40 54 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64  The view was mod
2bf50 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74  ified by some ot
2bf60 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
2bf70 20 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a   such as.      *
2bf80 2a 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  * pushDownWhereT
2bf90 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20  erms() */.      
2bfa0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2bfb0 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
2bfc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2bfd0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2bfe0 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
2bff0 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
2c000 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61  * Attempt to tra
2c010 6e 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f  nsform a query o
2c020 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
2c030 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
2c040 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (*) FROM (SELECT
2c050 20 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   x FROM t1 UNION
2c060 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52   ALL SELECT y FR
2c070 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74  OM t2).**.** Int
2c080 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
2c090 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
2c0a0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2c0b0 29 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  )+(SELECT count(
2c0c0 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a  *) FROM t2).**.*
2c0d0 2a 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  * The transforma
2c0e0 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  tion only works 
2c0f0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2c100 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2c110 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65  :.**.**   *  The
2c120 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55   subquery is a U
2c130 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20  NION ALL of two 
2c140 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a  or more terms.**
2c150 20 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e     *  There is n
2c160 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50  o WHERE or GROUP
2c170 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c   BY or HAVING cl
2c180 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62  auses on the sub
2c190 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20  queries.**   *  
2c1a0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
2c1b0 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e  is a simple coun
2c1c0 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t(*).**.** Retur
2c1d0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70  n TRUE if the op
2c1e0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e  timization is un
2c1f0 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61  dertaken..*/.sta
2c200 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56  tic int countOfV
2c210 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
2c220 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2c230 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c  elect *p){.  Sel
2c240 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69  ect *pSub, *pPri
2c250 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  or;.  Expr *pExp
2c260 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e  r;.  Expr *pCoun
2c270 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2c280 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
2c290 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2c2a0 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ate)==0 ) return
2c2b0 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73   0;   /* This is
2c2c0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2c2d0 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
2c2e0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
2c2f0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2c300 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72       /* Single r
2c310 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  esult column */.
2c320 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
2c330 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
2c340 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2c350 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
2c360 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  N ) return 0;   
2c370 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69       /* Result i
2c380 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
2c390 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
2c3a0 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75  stricmp(pExpr->u
2c3b0 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29  .zToken,"count")
2c3c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2c3d0 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20   Is count() */. 
2c3e0 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c   if( pExpr->x.pL
2c3f0 69 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ist!=0 ) return 
2c400 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c410 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
2c420 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20  unt(*) */.  if( 
2c430 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
2c440 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c460 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52   One table in FR
2c470 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  OM  */.  pSub = 
2c480 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2c490 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75  elect;.  if( pSu
2c4a0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==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 20 20 20 2f 2a 20 54 68             /* Th
2c4d0 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71  e FROM is a subq
2c4e0 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53  uery */.  if( pS
2c4f0 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20  ub->pPrior==0 ) 
2c500 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2c510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2c520 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  ust be a compoun
2c530 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  d ry */.  do{.  
2c540 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d    if( pSub->op!=
2c550 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e  TK_ALL && pSub->
2c560 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
2c570 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55  0;  /* Must be U
2c580 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20  NION ALL */.    
2c590 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
2c5a0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5c0 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c    /* No WHERE cl
2c5d0 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  ause */.    if( 
2c5e0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2c5f0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20   SF_Aggregate ) 
2c600 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
2c610 20 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   Not an aggregat
2c620 65 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20  e */.    pSub = 
2c630 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20  pSub->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 20 20 20 2f 2a 20 52 65             /* Re
2c660 70 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75  peat over compou
2c670 6e 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20  nd */.  }while( 
2c680 70 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  pSub );..  /* If
2c690 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
2c6a0 6f 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20  oint then it is 
2c6b0 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  OK to perform th
2c6c0 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
2c6d0 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
2c6e0 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74  se->db;.  pCount
2c6f0 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70   = pExpr;.  pExp
2c700 72 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20  r = 0;.  pSub = 
2c710 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2c720 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63  elect;.  p->pSrc
2c730 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
2c740 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63   0;.  sqlite3Src
2c750 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2c760 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53  ->pSrc);.  p->pS
2c770 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
2c780 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
2c790 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e  >db, sizeof(*p->
2c7a0 70 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28  pSrc));.  while(
2c7b0 20 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70   pSub ){.    Exp
2c7c0 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50  r *pTerm;.    pP
2c7d0 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72  rior = pSub->pPr
2c7e0 69 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  ior;.    pSub->p
2c7f0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
2c800 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Sub->pNext = 0;.
2c810 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
2c820 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
2c830 74 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65  te;.    pSub->se
2c840 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
2c850 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62  mpound;.    pSub
2c860 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
2c870 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2c880 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2c890 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
2c8a0 20 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f     pTerm = pPrio
2c8b0 72 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44  r ? sqlite3ExprD
2c8c0 75 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30  up(db, pCount, 0
2c8d0 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20  ) : pCount;.    
2c8e0 70 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pSub->pEList = s
2c8f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
2c900 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
2c910 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  pTerm);.    pTer
2c920 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  m = sqlite3PExpr
2c930 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45  (pParse, TK_SELE
2c940 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  CT, 0, 0);.    s
2c950 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
2c960 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65  lect(pParse, pTe
2c970 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69  rm, pSub);.    i
2c980 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
2c990 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65       pExpr = pTe
2c9a0 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rm;.    }else{. 
2c9b0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
2c9c0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2c9d0 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d  , TK_PLUS, pTerm
2c9e0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  , pExpr);.    }.
2c9f0 20 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f      pSub = pPrio
2ca00 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69  r;.  }.  p->pELi
2ca10 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  st->a[0].pExpr =
2ca20 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c   pExpr;.  p->sel
2ca30 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67  Flags &= ~SF_Agg
2ca40 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c  regate;..#if SEL
2ca50 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2ca60 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2ca70 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2ca80 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2ca90 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2caa0 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e  e,p,("After coun
2cab0 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69  t-of-view optimi
2cac0 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  zation:\n"));.  
2cad0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2cae0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2caf0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
2cb00 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2cb10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e  f /* SQLITE_COUN
2cb20 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
2cb30 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TION */../*.** G
2cb40 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2cb50 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
2cb60 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
2cb70 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
2cb80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
2cb90 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
2cba0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2cbb0 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
2cbc0 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
2cbd0 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
2cbe0 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
2cbf0 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
2cc00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2cc10 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
2cc20 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
2cc30 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
2cc40 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
2cc50 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
2cc60 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
2cc70 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
2cc80 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
2cc90 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
2cca0 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
2ccb0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
2ccc0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
2ccd0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
2cce0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
2ccf0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
2cd00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2cd10 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
2cd20 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2cd30 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
2cd40 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
2cd50 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2cd60 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
2cd70 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
2cd80 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
2cd90 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
2cda0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
2cdb0 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
2cdc0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
2cdd0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2cde0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2cdf0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
2ce00 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2ce10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
2ce20 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
2ce30 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
2ce40 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
2ce50 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2ce60 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
2ce70 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
2ce80 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
2ce90 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2cea0 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
2ceb0 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
2cec0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2ced0 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  pEList = 0;  /* 
2cee0 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
2cef0 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
2cf00 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2cf10 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
2cf20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
2cf30 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
2cf40 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
2cf50 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2cf60 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
2cf70 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2cf80 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
2cf90 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
2cfa0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
2cfb0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
2cfc0 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
2cfd0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
2cfe0 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
2cff0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
2d000 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
2d010 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
2d020 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
2d030 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
2d040 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
2d050 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
2d060 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2d070 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
2d080 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
2d090 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
2d0a0 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2d0b0 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
2d0c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
2d0d0 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
2d0e0 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
2d0f0 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
2d100 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
2d110 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
2d120 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
2d130 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
2d140 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
2d150 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2d160 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2d170 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2d180 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  on */..#ifndef S
2d190 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
2d1a0 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72  IN.  int iRestor
2d1b0 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72  eSelectId = pPar
2d1c0 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20  se->iSelectId;. 
2d1d0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
2d1e0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65  Id = pParse->iNe
2d1f0 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65  xtSelectId++;.#e
2d200 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61  ndif..  db = pPa
2d210 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
2d220 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
2d230 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
2d240 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
2d250 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2d260 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
2d270 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2d280 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
2d290 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
2d2a0 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
2d2b0 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
2d2c0 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45  ggInfo));.#if SE
2d2d0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2d2e0 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c  D.  pParse->nSel
2d2f0 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53  ectIndent++;.  S
2d300 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2d310 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70  rse,p, ("begin p
2d320 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b  rocessing:\n"));
2d330 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2d340 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2d350 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2d360 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2d370 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2d380 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
2d390 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2d3a0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2d3b0 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
2d3c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2d3d0 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2d3e0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66  ->eDest!=SRT_Fif
2d3f0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
2d400 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2d410 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2d420 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a  RT_DistQueue );.
2d430 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2d440 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2d450 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75  t->eDest!=SRT_Qu
2d460 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e  eue );.  if( Ign
2d470 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2d480 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
2d490 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
2d4a0 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
2d4b0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d4c0 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
2d4d0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2d4e0 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
2d4f0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2d500 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20  SRT_Discard ||. 
2d510 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2d520 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75  >eDest==SRT_Queu
2d530 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  e  || pDest->eDe
2d540 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
2d550 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
2d560 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d570 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44  _DistQueue || pD
2d580 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d590 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66  Fifo);.    /* If
2d5a0 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20   ORDER BY makes 
2d5b0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e  no difference in
2d5c0 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e   the output then
2d5d0 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20   neither does.  
2d5e0 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f    ** DISTINCT so
2d5f0 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76   it can be remov
2d600 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73  ed too. */.    s
2d610 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2d620 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
2d630 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  erBy);.    p->pO
2d640 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2d650 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
2d660 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
2d670 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2d680 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
2d690 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  0);.  memset(&sS
2d6a0 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ort, 0, sizeof(s
2d6b0 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e  Sort));.  sSort.
2d6c0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
2d6d0 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69  rderBy;.  pTabLi
2d6e0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2d6f0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2d700 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
2d710 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
2d720 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
2d730 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
2d740 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41  List!=0 );.  isA
2d750 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
2d760 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2d770 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54  )!=0;.#if SELECT
2d780 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2d790 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2d7a0 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2d7b0 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2d7c0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
2d7d0 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72  , ("after name r
2d7e0 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b  esolution:\n"));
2d7f0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2d800 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2d810 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2d820 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e  .  /* Get a poin
2d830 74 65 72 20 74 68 65 20 56 44 42 45 20 75 6e 64  ter the VDBE und
2d840 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c  er construction,
2d850 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
2d860 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20  w VDBE if one.  
2d870 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  ** does not alre
2d880 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76  ady exist */.  v
2d890 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
2d8a0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
2d8b0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c   v==0 ) goto sel
2d8c0 65 63 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70  ect_end;.  if( p
2d8d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d8e0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
2d8f0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
2d900 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
2d910 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20   }..  /* Try to 
2d920 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
2d930 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2d940 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68  lause up into th
2d950 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a  e main query.  *
2d960 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2d970 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2d980 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2d990 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2d9a0 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
2d9b0 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
2d9c0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2d9d0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2d9e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2d9f0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2da00 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2da10 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
2da20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 54 61 62  pSelect;.    Tab
2da30 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d  le *pTab = pItem
2da40 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
2da50 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pSub==0 ) contin
2da60 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63  ue;..    /* Catc
2da70 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68  h mismatch in th
2da80 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d  e declared colum
2da90 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64  ns of a view and
2daa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
2dab0 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e     ** columns in
2dac0 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74   the SELECT on t
2dad0 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66  he RHS */.    if
2dae0 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53  ( pTab->nCol!=pS
2daf0 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
2db00 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
2db10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2db20 65 2c 20 22 65 78 70 65 63 74 65 64 20 25 64 20  e, "expected %d 
2db30 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27  columns for '%s'
2db40 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20   but got %d",.  
2db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db60 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20      pTab->nCol, 
2db70 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75  pTab->zName, pSu
2db80 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
2db90 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  );.      goto se
2dba0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
2dbb0 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74  .    /* Do not t
2dbc0 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e  ry to flatten an
2dbd0 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
2dbe0 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ery..    **.    
2dbf0 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e  ** Flattening an
2dc00 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
2dc10 65 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  ery is only poss
2dc20 69 62 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65  ible if the oute
2dc30 72 20 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69  r query.    ** i
2dc40 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42  s not a join.  B
2dc50 75 74 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ut if the outer 
2dc60 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
2dc70 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75  oin, then the su
2dc80 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69  bquery.    ** wi
2dc90 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ll be implemente
2dca0 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d as a co-routin
2dcb0 65 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  e and there is n
2dcc0 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20  o advantage to. 
2dcd0 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67     ** flattening
2dce0 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
2dcf0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
2dd00 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
2dd10 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
2dd20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2dd30 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
2dd40 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20  GroupBy==0 );.. 
2dd50 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2dd60 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
2dd70 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2dd80 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20  e and if.    ** 
2dd90 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  it will be imple
2dda0 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
2ddb0 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20  outine, then do 
2ddc0 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68  not flatten.  Th
2ddd0 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69  is.    ** restri
2dde0 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c  ction allows SQL
2ddf0 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65   constructs like
2de00 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
2de10 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70    **  SELECT exp
2de20 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2de30 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f  x).    **    FRO
2de40 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
2de50 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20   tab ORDER BY y 
2de60 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a  LIMIT 10);.    *
2de70 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70  *.    ** The exp
2de80 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2de90 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74  ) is only comput
2dea0 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77  ed on the 10 row
2deb0 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72  s that.    ** ar
2dec0 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72  e output, rather
2ded0 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20   than every row 
2dee0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
2def0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
2df00 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20  b->pOrderBy!=0. 
2df10 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20      && i==0.    
2df20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
2df30 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
2df40 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  || (pTabList->a[
2df50 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28  1].fg.jointype&(
2df60 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
2df70 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
2df80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2df90 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61    }..    if( fla
2dfa0 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
2dfb0 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
2dfc0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
2dfd0 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
2dfe0 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
2dff0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
2e000 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
2e010 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
2e020 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2e030 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2e040 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2e050 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2e060 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
2e070 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
2e080 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2e090 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2e0a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2e0b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e0c0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2e0d0 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
2e0e0 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
2e0f0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
2e100 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
2e110 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
2e120 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
2e130 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2e140 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2e150 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2e160 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2e170 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2e180 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2e190 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2e1a0 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2e1b0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2e1c0 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2e1d0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2e1e0 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2e1f0 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2e200 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
2e210 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
2e220 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2e230 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2e240 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68  f..  /* For each
2e250 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2e260 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f  M clause, do two
2e270 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31   things:.  ** (1
2e280 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72  ) Authorized unr
2e290 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73  eferenced tables
2e2a0 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61  .  ** (2) Genera
2e2b0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
2e2c0 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f  sub-queries.  */
2e2d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
2e2e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2e2f0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2e300 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2e310 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2e320 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2e330 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
2e340 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69 66  elect *pSub;.#if
2e350 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2e360 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
2e370 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
2e380 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
2e390 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2e3a0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
2e3b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2e3c0 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45 41  Issue SQLITE_REA
2e3d0 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73  D authorizations
2e3e0 20 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f 6c   with a fake col
2e3f0 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79  umn name for any
2e400 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74  .    ** tables t
2e410 68 61 74 20 61 72 65 20 72 65 66 65 72 65 6e 63  hat are referenc
2e420 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69 63  ed but from whic
2e430 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65 20  h no values are 
2e440 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20 2a  extracted..    *
2e450 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  * Examples of wh
2e460 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73 20  ere these kinds 
2e470 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52  of null SQLITE_R
2e480 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  EAD authorizatio
2e490 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ns.    ** would 
2e4a0 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20  occur:.    **.  
2e4b0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2e4c0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2e4d0 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
2e4e0 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20  AD t1."".    ** 
2e4f0 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20      SELECT t1.* 
2e500 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d  FROM t1, t2;   -
2e510 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32  - SQLITE_READ t2
2e520 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ."".    **.    *
2e530 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d  * The fake colum
2e540 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70  n name is an emp
2e550 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69  ty string.  It i
2e560 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  s possible for a
2e570 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a   table to.    **
2e580 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e   have a column n
2e590 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70 74  amed by the empt
2e5a0 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69  y string, in whi
2e5b0 63 68 20 63 61 73 65 20 74 68 65 72 65 20 69 73  ch case there is
2e5c0 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a   no way to.    *
2e5d0 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65  * distinguish be
2e5e0 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72  tween an unrefer
2e5f0 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20  enced table and 
2e600 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72 65  an actual refere
2e610 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
2e620 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  * "" column. The
2e630 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
2e640 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b   was for the fak
2e650 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f  e column name to
2e660 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20   be a NULL,.    
2e670 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  ** which would b
2e680 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20  e unambiguous.  
2e690 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f  But legacy autho
2e6a0 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
2e6b0 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  ks might.    ** 
2e6c0 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d  assume the colum
2e6d0 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55  n name is non-NU
2e6e0 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e  LL and segfault.
2e6f0 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20    The use of an 
2e700 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74 72  empty.    ** str
2e710 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b 65  ing for the fake
2e720 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65   column name see
2e730 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f  ms safer..    */
2e740 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2e750 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20  colUsed==0 ){.  
2e760 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
2e770 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
2e780 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d  ITE_READ, pItem-
2e790 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65  >zName, "", pIte
2e7a0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
2e7b0 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
2e7c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
2e7d0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
2e7e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2e7f0 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65  _VIEW).    /* Ge
2e800 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2e810 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
2e820 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2e830 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53  se.    */.    pS
2e840 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
2e850 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75  ect;.    if( pSu
2e860 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2e870 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d  ..    /* Sometim
2e880 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
2e890 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20  a subquery will 
2e8a0 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72  be generated mor
2e8b0 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e  e than.    ** on
2e8c0 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75  ce, if the subqu
2e8d0 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74  ery is part of t
2e8e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2e8f0 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a  in a LEFT JOIN,.
2e900 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70      ** for examp
2e910 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
2e920 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65  e, do not regene
2e930 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
2e940 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a   manifest.    **
2e950 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63   a view or the c
2e960 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70  o-routine to imp
2e970 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20  lement a view.  
2e980 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  The first instan
2e990 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66  ce.    ** is suf
2e9a0 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20  ficient, though 
2e9b0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
2e9c0 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76  o manifest the v
2e9d0 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20  iew does need.  
2e9e0 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b    ** to be invok
2e9f0 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20  ed again. */.   
2ea00 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72   if( pItem->addr
2ea10 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20  FillSub ){.     
2ea20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76   if( pItem->fg.v
2ea30 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29  iaCoroutine==0 )
2ea40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2ea50 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2ea60 20 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20 76   manifests the v
2ea70 69 65 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f  iew might be a o
2ea80 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c  ne-time routine,
2ea90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69  .        ** or i
2eaa0 74 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  t might need to 
2eab0 62 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68  be rerun on each
2eac0 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75   iteration becau
2ead0 73 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a  se it.        **
2eae0 20 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65   encodes a corre
2eaf0 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 20  lated subquery. 
2eb00 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  */.        testc
2eb10 61 73 65 28 20 73 71 6c 69 74 65 33 56 64 62 65  ase( sqlite3Vdbe
2eb20 47 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e  GetOp(v, pItem->
2eb30 61 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70  addrFillSub)->op
2eb40 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b  code==OP_Once );
2eb50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2eb60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2eb70 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72  _Gosub, pItem->r
2eb80 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  egReturn, pItem-
2eb90 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
2eba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
2ebb0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
2ebc0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
2ebd0 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
2ebe0 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
2ebf0 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
2ec00 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
2ec10 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
2ec20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
2ec30 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
2ec40 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
2ec50 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
2ec60 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
2ec70 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
2ec80 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
2ec90 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
2eca0 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
2ecb0 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
2ecc0 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
2ecd0 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
2ece0 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
2ecf0 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
2ed00 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
2ed10 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
2ed20 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
2ed30 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
2ed40 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
2ed50 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  (p);..    /* Mak
2ed60 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73  e copies of cons
2ed70 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73  tant WHERE-claus
2ed80 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f  e terms in the o
2ed90 75 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a  uter query down.
2eda0 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68      ** inside th
2edb0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  e subquery.  Thi
2edc0 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73  s can help the s
2edd0 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d  ubquery to run m
2ede0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e  ore efficiently.
2edf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ee00 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
2ee10 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d  ype & JT_OUTER)=
2ee20 3d 30 0a 20 20 20 20 20 26 26 20 70 75 73 68 44  =0.     && pushD
2ee30 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50  ownWhereTerms(pP
2ee40 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70  arse, pSub, p->p
2ee50 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43  Where, pItem->iC
2ee60 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69  ursor).    ){.#i
2ee70 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2ee80 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20  ABLED.      if( 
2ee90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2eea0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2eeb0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
2eec0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
2eed0 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63  ,("After WHERE-c
2eee0 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a  lause push-down:
2eef0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  \n"));.        s
2ef00 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2ef10 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2ef20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2ef30 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41    }..    zSavedA
2ef40 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
2ef50 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
2ef60 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  t;.    pParse->z
2ef70 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
2ef80 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  tem->zName;..   
2ef90 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2efa0 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2efb0 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
2efc0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75  **.    ** The su
2efd0 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d  bquery is implem
2efe0 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
2eff0 75 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62  utine if the sub
2f000 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20  query is.    ** 
2f010 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2f020 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
2f030 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  (so that it does
2f040 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
2f050 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20      ** computed 
2f060 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a  more than once).
2f070 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f      **.    ** TO
2f080 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74  DO: Are there ot
2f090 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69  her reasons besi
2f0a0 64 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20  de (1) to use a 
2f0b0 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  co-routine.    *
2f0c0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
2f0d0 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ?.    */.    if(
2f0e0 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70   i==0.     && (p
2f0f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
2f100 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2f110 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e  (pTabList->a[1].
2f120 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f  fg.jointype&(JT_
2f130 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
2f140 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20  =0)  /* (1) */. 
2f150 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
2f160 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
2f170 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2f180 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
2f190 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
2f1a0 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
2f1b0 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
2f1c0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
2f1d0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20    int addrTop = 
2f1e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2f1f0 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20  ntAddr(v)+1;.   
2f200 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e    .      pItem->
2f210 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
2f220 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2f230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f240 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
2f250 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
2f260 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
2f270 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
2f280 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
2f290 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
2f2a0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2f2b0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2f2c0 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
2f2d0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2f2e0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
2f2f0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
2f300 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2f310 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
2f320 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2f330 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
2f340 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
2f350 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
2f360 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
2f370 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
2f380 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2f390 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2f3a0 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74   = pSub->nSelect
2f3b0 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  Row;.      pItem
2f3c0 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
2f3d0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74  e = 1;.      pIt
2f3e0 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20  em->regResult = 
2f3f0 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20  dest.iSdst;.    
2f400 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
2f410 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74  Coroutine(v, pIt
2f420 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2f430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f440 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2f450 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73  rTop-1);.      s
2f460 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2f470 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
2f480 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f490 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2f4a0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2f4b0 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
2f4c0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
2f4d0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
2f4e0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
2f4f0 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
2f500 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
2f510 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
2f520 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
2f530 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2f540 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
2f550 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
2f560 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
2f570 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
2f580 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
2f590 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
2f5a0 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
2f5b0 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
2f5c0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
2f5d0 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
2f5e0 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20  int retAddr;.   
2f5f0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2f600 74 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a  t_item *pPrior;.
2f610 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f620 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2f630 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49  b==0 );.      pI
2f640 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
2f650 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2f660 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d  .      topAddr =
2f670 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f680 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2f690 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  , 0, pItem->regR
2f6a0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49  eturn);.      pI
2f6b0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2f6c0 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20   = topAddr+1;.  
2f6d0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
2f6e0 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d  g.isCorrelated==
2f6f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2f700 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
2f710 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
2f720 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
2f730 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
2f740 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
2f750 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  er, then we only
2f760 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
2f770 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2f780 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20  e subquery.     
2f790 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20     ** once. */. 
2f7a0 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20         onceAddr 
2f7b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2f7c0 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
2f7d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2f7e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2f7f0 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
2f800 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
2f810 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2f820 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  me));.      }els
2f830 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e  e{.        VdbeN
2f840 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
2f850 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
2f860 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
2f870 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2f880 20 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20   }.      pPrior 
2f890 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77  = isSelfJoinView
2f8a0 28 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d  (pTabList, pItem
2f8b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
2f8c0 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ior ){.        s
2f8d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2f8e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
2f8f0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  pItem->iCursor, 
2f900 70 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29  pPrior->iCursor)
2f910 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
2f920 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
2f930 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 70 50  m->iSelectId, pP
2f940 72 69 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64 29  rior->iSelectId)
2f950 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2f960 28 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  ( pPrior->pSelec
2f970 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
2f980 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2f990 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65   = pPrior->pSele
2f9a0 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ct->nSelectRow;.
2f9b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f9c0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2f9d0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
2f9e0 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
2f9f0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2fa00 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
2fa10 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2fa20 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
2fa30 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
2fa40 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20  lectId);.       
2fa50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
2fa60 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
2fa70 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2fa80 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
2fa90 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
2faa0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
2fab0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
2fac0 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
2fad0 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
2fae0 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
2faf0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2fb00 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2fb10 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
2fb20 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
2fb30 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2fb40 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
2fb50 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2fb60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fb70 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
2fb80 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
2fb90 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2fba0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2fbb0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
2fbc0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2fbd0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2fbe0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61  ect_end;.    pPa
2fbf0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
2fc00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2fc10 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20  rHeight(p);.    
2fc20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
2fc30 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
2fc40 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66  hContext;.#endif
2fc50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f  .  }..  /* Vario
2fc60 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  us elements of t
2fc70 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64  he SELECT copied
2fc80 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69   into local vari
2fc90 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63  ables for.  ** c
2fca0 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20  onvenience */.  
2fcb0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
2fcc0 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  st;.  pWhere = p
2fcd0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
2fce0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2fcf0 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
2fd00 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
2fd10 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
2fd20 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2fd30 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
2fd40 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
2fd50 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2fd60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2fd70 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
2fd80 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2fd90 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
2fda0 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  fter all FROM-cl
2fdb0 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  ause analysis:\n
2fdc0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
2fdd0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2fde0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2fdf0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2fe00 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
2fe10 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66  PTIMIZATION.  if
2fe20 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  ( OptimizationEn
2fe30 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2fe40 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c  _QueryFlattener|
2fe50 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69  SQLITE_CountOfVi
2fe60 65 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f  ew).   && countO
2fe70 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f  fViewOptimizatio
2fe80 6e 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29  n(pParse, p).  )
2fe90 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  {.    if( db->ma
2fea0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2feb0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2fec0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
2fed0 4c 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69  List;.    pTabLi
2fee0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2fef0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
2ff00 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44  f the query is D
2ff10 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20  ISTINCT with an 
2ff20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20  ORDER BY but is 
2ff30 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
2ff40 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74  , and .  ** if t
2ff50 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
2ff60 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
2ff70 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c  e ORDER BY list,
2ff80 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79   then this query
2ff90 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  .  ** can be rew
2ffa0 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55  ritten as a GROU
2ffb0 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77  P BY. In other w
2ffc0 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a  ords, this:.  **
2ffd0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2ffe0 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52   DISTINCT xyz FR
2fff0 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  OM ... ORDER BY 
30000 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  xyz.  **.  ** is
30010 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a   transformed to:
30020 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
30030 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  ELECT xyz FROM .
30040 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20  .. GROUP BY xyz 
30050 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
30060 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
30070 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72  d form is prefer
30080 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  red as a single 
30090 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74  index (or temp-t
300a0 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20  able) may be .  
300b0 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  ** used for both
300c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   the ORDER BY an
300d0 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  d DISTINCT proce
300e0 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e  ssing. As origin
300f0 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74  ally .  ** writt
30100 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73  en the query mus
30110 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62  t use a temp-tab
30120 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  le for at least 
30130 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  one of the ORDER
30140 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49   .  ** BY and DI
30150 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69  STINCT, and an i
30160 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65  ndex or separate
30170 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
30180 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a  the other..  */.
30190 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
301a0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
301b0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
301c0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20  ==SF_Distinct . 
301d0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
301e0 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72  ListCompare(sSor
301f0 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69  t.pOrderBy, pELi
30200 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
30210 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
30220 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
30230 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
30240 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
30250 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
30260 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b  (db, pEList, 0);
30270 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
30280 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
30290 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
302a0 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
302b0 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
302c0 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
302d0 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
302e0 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
302f0 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
30300 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
30310 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
30320 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
30330 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
30340 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
30350 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
30360 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
30370 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54   );..#if SELECTT
30380 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
30390 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
303a0 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
303b0 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  ){.      SELECTT
303c0 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
303d0 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20  e,p,("Transform 
303e0 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52  DISTINCT into GR
303f0 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20  OUP BY:\n"));.  
30400 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
30410 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
30420 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
30430 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
30440 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
30450 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
30460 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65  create an epheme
30470 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a  ral index to.  *
30480 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67  * do the sorting
30490 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74  .  But this sort
304a0 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e  ing ephemeral in
304b0 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
304c0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73  .  ** being unus
304d0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
304e0 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
304f0 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
30500 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61  der..  ** If tha
30510 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
30520 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  hen the OP_OpenE
30530 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
30540 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  tion will be.  *
30550 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  * changed to an 
30560 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20  OP_Noop once we 
30570 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
30580 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
30590 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65  x is.  ** not ne
305a0 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74  eded.  The sSort
305b0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76  .addrSortIndex v
305c0 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
305d0 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20  to facilitate.  
305e0 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  ** that change..
305f0 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
30600 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
30610 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
30620 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
30630 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
30640 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73  prList(pParse, s
30650 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30  Sort.pOrderBy, 0
30660 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
30670 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75  ;.    sSort.iECu
30680 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
30690 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74  Tab++;.    sSort
306a0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
306b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
306c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
306d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
306e0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45          sSort.iE
306f0 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f  Cursor, sSort.pO
30700 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b  rderBy->nExpr+1+
30710 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
30720 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
30730 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
30740 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b  KEYINFO.      );
30750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53  .  }else{.    sS
30760 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
30770 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
30780 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
30790 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
307a0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
307b0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
307c0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
307d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
307e0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
307f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30800 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
30810 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
30820 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  SDParm, pEList->
30830 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
30840 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
30850 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
30860 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
30870 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20  Label(v);.  if( 
30880 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
30890 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30  F_FixedLimit)==0
308a0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65   ){.    p->nSele
308b0 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a  ctRow = 320;  /*
308c0 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20   4 billion rows 
308d0 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65  */.  }.  compute
308e0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
308f0 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
30900 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
30910 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64  ==0 && sSort.add
30920 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
30930 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
30940 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
30950 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
30960 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  dex, OP_SorterOp
30970 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73  en);.    sSort.s
30980 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54  ortFlags |= SORT
30990 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a  FLAG_UseSorter;.
309a0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
309b0 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
309c0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
309d0 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
309e0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
309f0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
30a00 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
30a10 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
30a20 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
30a30 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
30a40 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
30a50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
30a60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
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 20 20 20 73 44 69 73              sDis
30a90 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
30aa0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
30ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ac0 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
30ad0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
30ae0 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30  rse, p->pEList,0
30af0 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,0),.           
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b10 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
30b20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
30b30 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
30b40 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
30b50 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
30b60 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
30b70 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a  INCT_UNORDERED;.
30b80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69    }else{.    sDi
30b90 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
30ba0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
30bb0 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  T_NOOP;.  }..  i
30bc0 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
30bd0 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
30be0 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
30bf0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
30c00 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
30c10 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
30c20 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
30c30 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
30c40 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
30c50 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
30c60 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  t( WHERE_USE_LIM
30c70 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69  IT==SF_FixedLimi
30c80 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c  t );.    wctrlFl
30c90 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61  ags |= p->selFla
30ca0 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
30cb0 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69  it;..    /* Begi
30cc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
30cd0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e  can. */.    pWIn
30ce0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
30cf0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
30d00 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
30d10 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
30d20 0a 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 20 20 20                  
30d40 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c  p->pEList, wctrl
30d50 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63  Flags, p->nSelec
30d60 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  tRow);.    if( p
30d70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
30d80 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
30d90 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
30da0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
30db0 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
30dc0 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
30dd0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
30de0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
30df0 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
30e00 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
30e10 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
30e20 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
30e30 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
30e40 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
30e50 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
30e60 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
30e70 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
30e80 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
30e90 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
30ea0 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
30eb0 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
30ec0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
30ed0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53  WInfo);.      sS
30ee0 6f 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65  ort.bOrderedInne
30ef0 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57  rLoop = sqlite3W
30f00 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72  hereOrderedInner
30f10 4c 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Loop(pWInfo);.  
30f20 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f      if( sSort.nO
30f30 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64  BSat==sSort.pOrd
30f40 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
30f50 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
30f60 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
30f70 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
30f80 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
30f90 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
30fa0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
30fb0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
30fc0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
30fd0 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
30fe0 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
30ff0 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
31000 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
31010 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
31020 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
31030 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72    if( sSort.addr
31040 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
31050 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d  sSort.pOrderBy==
31060 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
31070 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
31080 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
31090 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
310a0 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
310b0 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
310c0 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73   loop. */.    as
310d0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d  sert( p->pEList=
310e0 3d 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  =pEList );.    s
310f0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
31100 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
31110 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
31120 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
31130 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31140 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
31150 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
31160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31170 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
31180 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
31190 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  o));..    /* End
311a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
311b0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
311c0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
311d0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
311e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
311f0 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
31200 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
31210 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
31220 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
31230 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
31240 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
31250 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
31260 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
31270 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
31280 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
31290 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
312a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
312b0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
312c0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
312d0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
312e0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
312f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
31300 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
31310 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
31320 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
31330 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
31340 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
31350 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
31360 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
31370 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
31380 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
31390 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
313a0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
313b0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
313c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313d0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
313e0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
313f0 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
31400 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
31410 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
31420 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
31430 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
31440 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
31450 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
31460 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
31470 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
31480 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
31490 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
314a0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
314b0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
314c0 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
314d0 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
314e0 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
314f0 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
31500 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
31510 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
31520 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
31530 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
31540 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
31550 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
31560 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
31570 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
31580 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
31590 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
315a0 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
315b0 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
315c0 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
315d0 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
315e0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
315f0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
31600 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      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 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
31630 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
31640 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
31650 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
31660 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
31670 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
31680 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
31690 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
316a0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
316b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
316c0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
316d0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
316e0 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
316f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
31700 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
31710 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
31720 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
31730 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
31740 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
31750 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
31760 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
31770 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 66==sqlite3Log
31780 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20  Est(100) );.    
31790 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
317a0 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c  Row>66 ) p->nSel
317b0 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20  ectRow = 66;.   
317c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
317d0 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
317e0 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20  LogEst(1) );.   
317f0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
31800 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
31810 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
31820 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20  both a GROUP BY 
31830 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20  and an ORDER BY 
31840 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20  clause and they 
31850 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74  are.    ** ident
31860 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61  ical, then it ma
31870 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  y be possible to
31880 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
31890 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20  ER BY clause .  
318a0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75    ** on the grou
318b0 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f  nds that the GRO
318c0 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65  UP BY will cause
318d0 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d   elements to com
318e0 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e  e out .    ** in
318f0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
31900 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20  er. It also may 
31910 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20  not - the GROUP 
31920 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20  BY might use a. 
31930 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
31940 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73  ndex that causes
31950 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75   rows to be grou
31960 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20  ped together as 
31970 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20  required.    ** 
31980 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
31990 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20   sorted. Either 
319a0 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20  way, record the 
319b0 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20  fact that the.  
319c0 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e    ** ORDER BY an
319d0 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  d GROUP BY claus
319e0 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  es are the same 
319f0 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f  by setting the o
31a00 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a  rderByGrp.    **
31a10 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20   variable.  */. 
31a20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
31a30 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47  prListCompare(pG
31a40 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f  roupBy, sSort.pO
31a50 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29  rderBy, -1)==0 )
31a60 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47  {.      orderByG
31a70 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a  rp = 1;.    }. .
31a80 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
31a90 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
31aa0 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
31ab0 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
31ac0 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
31ad0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
31ae0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
31af0 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
31b00 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
31b10 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
31b20 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
31b30 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
31b40 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
31b50 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
31b60 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
31b70 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
31b80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
31b90 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
31ba0 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
31bb0 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
31bc0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
31bd0 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
31be0 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
31bf0 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
31c00 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
31c10 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d  sAggInfo.mnReg =
31c20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
31c30 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
31c40 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
31c50 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
31c60 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  By->nExpr : 0;. 
31c70 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
31c80 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
31c90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
31ca0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
31cb0 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
31cc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
31cd0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
31ce0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
31cf0 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  );.    if( pHavi
31d00 6e 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ng ){.      if( 
31d10 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
31d20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 68 65      assert( pWhe
31d30 72 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b  re==p->pWhere );
31d40 0a 20 20 20 20 20 20 20 20 68 61 76 69 6e 67 54  .        havingT
31d50 6f 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 70  oWhere(pParse, p
31d60 47 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67  GroupBy, pHaving
31d70 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
31d80 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20         pWhere = 
31d90 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  p->pWhere;.     
31da0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
31db0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
31dc0 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
31dd0 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
31de0 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
31df0 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
31e00 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f  .nColumn;.    fo
31e10 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
31e20 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  o.nFunc; i++){. 
31e30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
31e40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41  prHasProperty(sA
31e50 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
31e60 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
31e70 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
31e80 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f  C.ncFlags |= NC_
31e90 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20  InAggFunc;.     
31ea0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
31eb0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
31ec0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
31ed0 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  i].pExpr->x.pLis
31ee0 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63  t);.      sNC.nc
31ef0 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41  Flags &= ~NC_InA
31f00 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20  ggFunc;.    }.  
31f10 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67    sAggInfo.mxReg
31f20 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
31f30 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
31f40 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
31f50 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
31f60 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
31f70 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
31f80 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
31f90 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
31fa0 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
31fb0 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
31fc0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
31fd0 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
31fe0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
31ff0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
32000 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
32010 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
32020 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
32030 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
32040 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
32050 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
32060 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
32070 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
32080 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
32090 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
320a0 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
320b0 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
320c0 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
320d0 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
320e0 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
320f0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
32100 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
32110 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
32120 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
32130 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
32140 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
32150 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
32160 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
32170 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
32180 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
32190 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
321a0 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
321b0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
321c0 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
321d0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
321e0 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
321f0 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
32200 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
32210 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
32220 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
32230 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
32240 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
32250 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
32260 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
32270 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
32280 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
32290 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
322a0 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
322b0 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
322c0 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
322d0 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
322e0 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
322f0 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
32300 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
32310 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
32320 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
32330 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69   OP_SorterOpen i
32340 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
32350 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
32360 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
32370 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
32380 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
32390 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
323a0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
323b0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
323c0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
323d0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
323e0 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f   0, sAggInfo.nCo
323f0 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64  lumn);.      add
32400 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71  rSortingIdx = sq
32410 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
32420 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
32430 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  , .          sAg
32440 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
32450 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74  , sAggInfo.nSort
32460 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20  ingColumn, .    
32470 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29        0, (char*)
32480 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
32490 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  INFO);..      /*
324a0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
324b0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
324c0 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
324d0 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
324e0 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
324f0 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
32500 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
32510 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
32520 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
32530 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52        regOutputR
32540 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ow = ++pParse->n
32550 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  Mem;.      addrO
32560 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
32570 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
32580 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73  v);.      regRes
32590 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
325a0 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52  Mem;.      addrR
325b0 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
325c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
325d0 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
325e0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
325f0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
32600 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
32610 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
32620 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
32630 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
32640 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
32650 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
32660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32670 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
32680 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
32690 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
326a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
326b0 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
326c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
326d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
326e0 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
326f0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
32700 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
32710 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
32720 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
32730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32740 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
32750 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b  0, iAMem, iAMem+
32760 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
32770 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  1);..      /* Be
32780 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
32790 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
327a0 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
327b0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
327c0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
327d0 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
327e0 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
327f0 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
32800 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
32810 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
32820 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
32830 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
32840 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
32850 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
32860 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
32870 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
32880 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
32890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
328a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
328b0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
328c0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
328d0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
328e0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
328f0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
32900 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  ere, pGroupBy, 0
32910 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  ,.          WHER
32920 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64  E_GROUPBY | (ord
32930 65 72 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f  erByGrp ? WHERE_
32940 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29  SORTBYGROUP : 0)
32950 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
32960 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
32970 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
32980 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  nd;.      if( sq
32990 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
329a0 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72  red(pWInfo)==pGr
329b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  oupBy->nExpr ){.
329c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
329d0 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
329e0 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
329f0 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
32a00 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
32a10 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
32a20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
32a30 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
32a40 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
32a50 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
32a60 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
32a70 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
32a80 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
32a90 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
32aa0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
32ab0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
32ac0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
32ad0 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
32ae0 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
32af0 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
32b00 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
32b10 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
32b20 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
32b30 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
32b40 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
32b50 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
32b60 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
32b70 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
32b80 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
32b90 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
32ba0 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
32bb0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32bc0 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
32bd0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
32be0 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
32bf0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
32c00 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
32c10 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54          explainT
32c20 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
32c30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73   .            (s
32c40 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
32c50 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26  && (p->selFlags&
32c60 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29  SF_Distinct)==0)
32c70 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
32c80 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54         "DISTINCT
32c90 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b  " : "GROUP BY");
32ca0 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ..        groupB
32cb0 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
32cc0 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47     nGroupBy = pG
32cd0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
32ce0 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47         nCol = nG
32cf0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
32d00 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  j = nGroupBy;.  
32d10 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
32d20 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
32d30 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
32d40 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e     if( sAggInfo.
32d50 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43  aCol[i].iSorterC
32d60 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
32d70 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a          nCol++;.
32d80 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
32d90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
32db0 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
32dc0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
32dd0 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  rse, nCol);.    
32de0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
32df0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
32e00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32e10 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
32e20 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
32e30 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c  pBy, regBase, 0,
32e40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d   0);.        j =
32e50 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
32e60 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
32e70 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
32e80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
32e90 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
32ea0 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
32eb0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
32ec0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
32ed0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ->iSorterColumn>
32ee0 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
32ef0 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72    int r1 = j + r
32f00 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
32f10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
32f20 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  odeGetColumnToRe
32f30 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
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 20 20 20 70 43 6f 6c 2d 3e            pCol->
32f60 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
32f70 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
32f80 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
32f90 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
32fa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
32fb0 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64         regRecord
32fc0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
32fd0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
32fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32ff0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
33000 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
33010 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f  e, nCol, regReco
33020 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
33030 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
33040 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
33050 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
33060 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
33070 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
33080 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
33090 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
330a0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
330b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
330c0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
330d0 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
330e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
330f0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
33100 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
33110 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d  sortingIdxPTab =
33120 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72   sortPTab = pPar
33130 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
33140 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71      sortOut = sq
33150 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
33160 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
33170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33180 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
33190 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73  udo, sortPTab, s
331a0 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20  ortOut, nCol);. 
331b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
331c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
331d0 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49  orterSort, sAggI
331e0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
331f0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
33200 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
33210 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74  , "GROUP BY sort
33220 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ")); VdbeCoverag
33230 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41  e(v);.        sA
33240 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
33250 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
33260 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
33270 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
33280 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ..      }..     
33290 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
332a0 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61   or temporary ta
332b0 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ble used by the 
332c0 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20  GROUP BY sort.  
332d0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75      ** will natu
332e0 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f  rally deliver ro
332f0 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ws in the order 
33300 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
33310 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a  ORDER BY.      *
33320 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c  * clause, cancel
33330 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
33340 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20  able open coded 
33350 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a  earlier..      *
33360 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
33370 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
33380 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74  on - the correct
33390 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72   answer should r
333a0 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73  esult regardless
333b0 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74  ..      ** Use t
333c0 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  he SQLITE_GroupB
333d0 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68  yOrder flag with
333e0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
333f0 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20  _OPTIMIZER to . 
33400 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
33410 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
33420 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  n for testing pu
33430 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20  rposes.  */.    
33440 20 20 69 66 28 20 6f 72 64 65 72 42 79 47 72 70    if( orderByGrp
33450 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
33460 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
33470 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29  TE_GroupByOrder)
33480 20 0a 20 20 20 20 20 20 20 26 26 20 28 67 72 6f   .       && (gro
33490 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69  upBySort || sqli
334a0 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
334b0 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20  (pWInfo)).      
334c0 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
334d0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
334e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
334f0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
33500 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
33510 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a  Index);.      }.
33520 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
33530 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
33540 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
33550 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
33560 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
33570 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
33580 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
33590 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
335a0 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
335b0 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
335c0 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
335d0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
335e0 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
335f0 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
33600 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
33610 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
33620 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
33630 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
33640 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
33650 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
33660 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
33670 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
33680 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
33690 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
336a0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
336b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
336c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
336d0 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
336e0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
336f0 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
33700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
33710 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62  ortOut, sortPTab
33720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33730 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
33740 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
33750 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
33760 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
33770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
33780 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
33790 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
337a0 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
337b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
337c0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
337d0 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
337e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
337f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
33800 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
33810 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
33820 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33830 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
33840 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
33850 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
33860 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
33870 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
33880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33890 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
338a0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
338b0 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
338c0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72  NFO);.      addr
338d0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
338e0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
338f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33900 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
33910 70 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c 20 61  p, addr1+1, 0, a
33920 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76  ddr1+1); VdbeCov
33930 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
33940 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
33950 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
33960 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
33970 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
33980 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74   ** Changes in t
33990 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20  he GROUP BY are 
339a0 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
339b0 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
339c0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49      ** block.  I
339d0 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
339e0 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c  changes, this bl
339f0 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  ock is skipped..
33a00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
33a10 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69  * This code copi
33a20 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70  es current group
33a30 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c   by terms in b0,
33a40 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20  b1,b2,....      
33a50 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31  ** over to a0,a1
33a60 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61  ,a2.  It then ca
33a70 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73  lls the output s
33a80 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
33a90 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  ** and resets th
33aa0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
33ab0 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
33ac0 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  s in preparation
33ad0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
33ae0 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20  e next GROUP BY 
33af0 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  batch..      */.
33b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
33b10 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
33b20 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20  , iBMem, iAMem, 
33b30 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29  pGroupBy->nExpr)
33b40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
33b50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
33b60 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
33b70 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
33b80 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
33b90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
33ba0 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
33bb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33bc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
33bd0 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
33be0 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f  addrEnd); VdbeCo
33bf0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
33c00 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
33c10 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
33c20 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
33c30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
33c40 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
33c50 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
33c60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
33c70 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
33c80 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
33c90 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
33ca0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
33cb0 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
33cc0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
33cd0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
33ce0 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
33cf0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
33d00 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
33d10 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
33d20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
33d30 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
33d40 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
33d50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
33d60 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
33d70 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
33d80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
33d90 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
33da0 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
33db0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
33dc0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
33dd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
33de0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
33df0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33e00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
33e10 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49  orterNext, sAggI
33e20 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
33e30 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a  addrTopOfLoop);.
33e40 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
33e50 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
33e60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
33e70 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
33e80 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
33e90 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
33ea0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
33eb0 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20  rtingIdx);.     
33ec0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
33ed0 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
33ee0 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
33ef0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
33f00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
33f10 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
33f20 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
33f30 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
33f40 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
33f50 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22  utput final row"
33f60 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  ));..      /* Ju
33f70 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72  mp over the subr
33f80 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f  outines.      */
33f90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
33fa0 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e  beGoto(v, addrEn
33fb0 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
33fc0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
33fd0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
33fe0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
33ff0 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
34000 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
34010 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
34020 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
34030 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
34040 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
34050 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
34060 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
34070 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
34080 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
34090 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
340a0 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
340b0 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
340c0 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
340d0 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
340e0 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
340f0 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
34100 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
34110 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
34120 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
34130 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
34140 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
34150 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
34160 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
34170 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
34180 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34190 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
341a0 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
341b0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
341c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
341d0 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
341e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
341f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
34200 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
34210 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
34220 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
34230 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
34240 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
34250 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
34260 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
34270 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
34280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34290 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
342a0 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
342b0 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
342c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
342d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
342e0 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
342f0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
34300 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
34310 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34320 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
34330 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
34340 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
34350 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
34360 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
34370 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
34380 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
34390 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
343a0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
343b0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
343c0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
343d0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
343e0 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a   p, -1, &sSort,.
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34400 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74        &sDistinct
34410 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
34420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
34430 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
34440 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20  addrSetAbort);. 
34450 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34460 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
34470 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
34480 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
34490 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67  mment((v, "end g
344a0 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
344b0 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  nerator"));..   
344c0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
344d0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
344e0 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20   will reset the 
344f0 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c  group-by accumul
34500 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ator.      */.  
34510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
34520 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
34530 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
34540 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
34550 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
34560 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
34570 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
34580 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
34590 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20  eset);.     .   
345a0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f   } /* endif pGro
345b0 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67  upBy.  Begin agg
345c0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77  regate queries w
345d0 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a  ithout GROUP BY:
345e0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
345f0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
34600 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  Del = 0;.#ifndef
34610 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
34620 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
34630 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
34640 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
34650 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
34660 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
34670 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
34680 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
34690 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
346a0 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
346b0 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
346c0 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
346d0 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
346e0 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
346f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
34700 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
34710 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
34720 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
34730 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
34740 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
34750 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
34760 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
34770 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
34780 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
34790 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
347a0 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
347b0 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
347c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
347d0 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
347e0 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
347f0 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
34800 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
34810 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
34820 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
34830 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
34840 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
34850 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
34860 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
34870 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
34880 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
34890 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
348a0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
348b0 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
348c0 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
348d0 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
348e0 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
348f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34900 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
34910 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
34920 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
34930 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
34940 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
34950 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
34960 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
34970 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
34980 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
34990 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 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 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
349c0 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
349d0 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
349e0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
349f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34a00 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
34a10 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
34a20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
34a30 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
34a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
34a50 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
34a60 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
34a70 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
34a80 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
34a90 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
34aa0 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
34ab0 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
34ac0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
34ad0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
34ae0 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
34af0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
34b00 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
34b10 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
34b20 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
34b30 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
34b40 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
34b50 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  as the lowest sc
34b60 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20  an cost..       
34b70 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
34b80 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
34b90 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
34ba0 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
34bb0 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
34bc0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
34bd0 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e  2013-10-03) Do n
34be0 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74  ot count the ent
34bf0 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61  ries in a partia
34c00 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  l index..       
34c10 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
34c20 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
34c30 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
34c40 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
34c50 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
34c60 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
34c70 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
34c80 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
34c90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
34ca0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
34cb0 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c  b) ) pBest = sql
34cc0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
34cd0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
34ce0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
34cf0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
34d00 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
34d10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
34d20 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
34d30 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
34d40 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  && pIdx->szIdxRo
34d50 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
34d60 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
34d70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
34d80 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  re==0.          
34d90 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
34da0 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42  Idx->szIdxRow<pB
34db0 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20  est->szIdxRow). 
34dc0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
34dd0 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
34de0 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
34df0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
34e00 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
34e10 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
34e20 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
34e30 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
34e40 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
34e50 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
34e60 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
34e70 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
34e80 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
34e90 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
34ea0 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
34eb0 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
34ec0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
34ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
34ee0 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  t(v, OP_OpenRead
34ef0 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
34f00 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Db, 1);.        
34f10 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
34f20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
34f30 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
34f40 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
34f50 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
34f60 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  O);.        }.  
34f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34f80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
34f90 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
34fa0 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
34fb0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
34fc0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
34fd0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
34fe0 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
34ff0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
35000 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
35010 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
35020 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
35030 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
35040 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
35050 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
35060 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
35070 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
35080 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
35090 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
350a0 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
350b0 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
350c0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
350d0 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
350e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
350f0 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
35100 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
35110 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
35120 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
35130 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  sults.        **
35140 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
35150 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
35160 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
35170 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
35180 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65         ** If whe
35190 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
351a0 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
351b0 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
351c0 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
351d0 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
351e0 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
351f0 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
35200 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
35210 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  e .        ** fi
35220 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
35230 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
35240 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
35250 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20  loop is .       
35260 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
35270 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
35280 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
35290 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
352a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c   .        ** val
352b0 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
352c0 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
352d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
352e0 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
352f0 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
35300 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
35310 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
35320 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20  lightly.        
35330 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
35340 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  or as follows:. 
35350 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
35360 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20    **   + If the 
35370 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45  query is a "SELE
35380 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e  CT min(x)", then
35390 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20   the loop coded 
353a0 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  by.        **   
353b0 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64    where.c should
353c0 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65   not iterate ove
353d0 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74  r any values wit
353e0 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20  h a NULL value. 
353f0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f         **     fo
35400 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  r x..        **.
35410 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54          **   + T
35420 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64  he optimizer cod
35430 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68  e in where.c (th
35440 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63  e thing that dec
35450 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ides which.     
35460 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
35470 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73  or indices to us
35480 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20  e) should place 
35490 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f  a different prio
354a0 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20  rity on .       
354b0 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69   **     satisfyi
354c0 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59  ng the 'ORDER BY
354d0 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74  ' clause than it
354e0 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63   does in other c
354f0 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ases..        **
35500 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f       Refer to co
35510 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  de and comments 
35520 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64  in where.c for d
35530 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20  etails..        
35540 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  */.        ExprL
35550 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30  ist *pMinMax = 0
35560 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61  ;.        u8 fla
35570 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  g = WHERE_ORDERB
35580 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  Y_NORMAL;.      
35590 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72    .        asser
355a0 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
355b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
355c0 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a  ert( flag==0 );.
355d0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
355e0 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20  Having==0 ){.   
355f0 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69         flag = mi
35600 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49  nMaxQuery(&sAggI
35610 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a  nfo, &pMinMax);.
35620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35630 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
35640 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30  0 || (pMinMax!=0
35650 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   && pMinMax->nEx
35660 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20  pr==1) );..     
35670 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20     if( flag ){. 
35680 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
35690 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
356a0 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61  stDup(db, pMinMa
356b0 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  x, 0);.         
356c0 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b   pDel = pMinMax;
356d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
356e0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
356f0 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d  led || pMinMax!=
35700 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
35710 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
35720 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
35730 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
35740 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c  ].sortOrder = fl
35750 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag!=WHERE_ORDERB
35760 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20  Y_MIN ?1:0;.    
35770 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
35780 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[0].pExpr->op 
35790 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
357a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
357b0 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
357c0 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
357d0 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
357e0 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
357f0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
35800 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
35810 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
35820 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
35830 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
35840 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   row.        ** 
35850 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
35860 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
35870 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
35880 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
35890 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  );.        pWInf
358a0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
358b0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
358c0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
358d0 70 4d 69 6e 4d 61 78 2c 20 30 2c 66 6c 61 67 2c  pMinMax, 0,flag,
358e0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
358f0 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
35900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
35910 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
35920 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
35930 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
35940 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
35950 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
35960 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
35970 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
35980 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d     assert( pMinM
35990 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78  ax==0 || pMinMax
359a0 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
359b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
359c0 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
359d0 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20  pWInfo)>0 ){.   
359e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
359f0 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65  beGoto(v, sqlite
35a00 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
35a10 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  (pWInfo));.     
35a20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
35a30 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e  ((v, "%s() by in
35a40 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  dex",.          
35a50 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45        (flag==WHE
35a60 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22  RE_ORDERBY_MIN?"
35a70 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20  min":"max")));. 
35a80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35a90 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
35aa0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
35ab0 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
35ac0 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
35ad0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
35ae0 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   }..      sSort.
35af0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
35b00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
35b10 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
35b20 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c  Having, addrEnd,
35b30 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
35b40 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
35b50 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
35b60 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  e, p, -1, 0, 0, 
35b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35b80 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64         pDest, ad
35b90 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b  drEnd, addrEnd);
35ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
35bb0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
35bc0 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
35bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
35be0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
35bf0 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
35c00 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
35c10 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  te query */..  i
35c20 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e  f( sDistinct.eTn
35c30 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
35c40 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
35c50 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
35c60 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
35c70 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
35c80 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
35c90 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
35ca0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
35cb0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
35cc0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
35cd0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
35ce0 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
35cf0 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
35d00 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
35d10 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
35d20 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
35d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35d40 20 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42         sSort.nOB
35d50 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50  Sat>0 ? "RIGHT P
35d60 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22  ART OF ORDER BY"
35d70 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20  :"ORDER BY");.  
35d80 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
35d90 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73  il(pParse, p, &s
35da0 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Sort, pEList->nE
35db0 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
35dc0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
35dd0 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
35de0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
35df0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
35e00 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
35e10 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68 61  /* The SELECT ha
35e20 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66  s been coded. If
35e30 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
35e40 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20  or in the Parse 
35e50 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20  structure,.  ** 
35e60 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
35e70 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77  ode to 1. Otherw
35e80 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d  ise 0. */.  rc =
35e90 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30   (pParse->nErr>0
35ea0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  );..  /* Control
35eb0 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
35ec0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
35ed0 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
35ee0 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
35ef0 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
35f00 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
35f10 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
35f20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
35f30 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
35f40 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
35f50 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 73 71 6c  electId);..  sql
35f60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
35f70 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
35f80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
35f90 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  b, sAggInfo.aFun
35fa0 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  c);.#if SELECTTR
35fb0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45  ACE_ENABLED.  SE
35fc0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
35fd0 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65  se,p,("end proce
35fe0 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50  ssing\n"));.  pP
35ff0 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
36000 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20  ent--;.#endif.  
36010 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.