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

Artifact 660ef7977841fb462f24c8561e4212615bb6e5c9835fd3556257ce8316c50fee:


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 20 20 69 66 28 20 6e 43 6f  0 );.    if( nCo
efe0: 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d  l>32767 ) nCol =
eff0: 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b   32767;.  }else{
f000: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
f010: 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
f020: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d  .  assert( nCol=
f030: 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20  =(i16)nCol );.  
f040: 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  *pnCol = nCol;. 
f050: 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a   *paCol = aCol;.
f060: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
f070: 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26  =aCol; i<nCol &&
f080: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
f090: 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ed; i++, pCol++)
f0a0: 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
f0b0: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
f0c0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
f0d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
f0e0: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
f0f0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
f100: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
f110: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
f120: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
f130: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
f140: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
f150: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
f160: 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78      Expr *pColEx
f170: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
f180: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
f190: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
f1a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
f1b0: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
f1c0: 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
f1d0: 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
f1e0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
f1f0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
f200: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
f210: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 6f  }.      if( (pCo
f220: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
f230: 4c 55 4d 4e 20 7c 7c 20 70 43 6f 6c 45 78 70 72  LUMN || pColExpr
f240: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
f250: 55 4d 4e 29 0a 20 20 20 20 20 20 20 26 26 20 70  UMN).       && p
f260: 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30  ColExpr->pTab!=0
f270: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
f280: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
f290: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
f2a0: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
f2b0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
f2c0: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
f2d0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  mn;.        Tabl
f2e0: 65 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78  e *pTab = pColEx
f2f0: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
f300: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
f310: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
f320: 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  y;.        zName
f330: 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61   = iCol>=0 ? pTa
f340: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
f350: 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20  ame : "rowid";. 
f360: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
f370: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
f380: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ID ){.        as
f390: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
f3a0: 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c  operty(pColExpr,
f3b0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
f3c0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
f3d0: 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f   pColExpr->u.zTo
f3e0: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ken;.      }else
f3f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
f400: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
f410: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
f420: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
f430: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
f440: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73     zName = pELis
f450: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
f460: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f470: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
f480: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
f490: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
f4a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
f4b0: 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  e{.      zName =
f4c0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
f4d0: 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b  db,"column%d",i+
f4e0: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
f4f0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
f500: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
f510: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
f520: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
f530: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
f540: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74   an integer to t
f550: 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20  he name so that 
f560: 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75  it becomes uniqu
f570: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e  e..    */.    cn
f580: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
f590: 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74  ( zName && sqlit
f5a0: 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20  e3HashFind(&ht, 
f5b0: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
f5c0: 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74     nName = sqlit
f5d0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
f5e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61  );.      if( nNa
f5f0: 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  me>0 ){.        
f600: 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a  for(j=nName-1; j
f610: 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 64  >0 && sqlite3Isd
f620: 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20  igit(zName[j]); 
f630: 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69  j--){}.        i
f640: 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27  f( zName[j]==':'
f650: 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20   ) nName = j;.  
f660: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d      }.      zNam
f670: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
f680: 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22  tf(db, "%.*z:%u"
f690: 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  , nName, zName, 
f6a0: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  ++cnt);.      if
f6b0: 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65  ( cnt>3 ) sqlite
f6c0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
f6d0: 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b  eof(cnt), &cnt);
f6e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
f6f0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
f700: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
f710: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
f720: 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20  ame(0, pCol);.  
f730: 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73    if( zName && s
f740: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
f750: 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f  (&ht, zName, pCo
f760: 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20  l)==pCol ){.    
f770: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
f780: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
f790: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
f7a0: 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20  ear(&ht);.  if( 
f7b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f7c0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
f7d0: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
f7e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f7f0: 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  db, aCol[j].zNam
f800: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
f810: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f820: 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f  aCol);.    *paCo
f830: 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f  l = 0;.    *pnCo
f840: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
f850: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
f860: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
f870: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f880: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
f890: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
f8a0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
f8b0: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
f8c0: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
f8d0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
f8e0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
f8f0: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
f900: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
f910: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
f920: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
f930: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
f940: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
f950: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
f960: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
f970: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
f980: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
f990: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
f9a0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
f9b0: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
f9c0: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
f9d0: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
f9e0: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
f9f0: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
fa00: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
fa10: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
fa20: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
fa30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fa40: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
fa50: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
fa60: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
fa70: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
fa80: 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
fa90: 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
faa0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
fab0: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
fac0: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
fad0: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
fae0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
faf0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
fb00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
fb10: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
fb20: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
fb30: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
fb40: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
fb50: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
fb60: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
fb70: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  a;..  assert( pS
fb80: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
fb90: 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
fba0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
fbb0: 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
fbc0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
fbd0: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
fbe0: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
fbf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
fc00: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
fc10: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
fc20: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
fc30: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
fc40: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
fc50: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
fc60: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
fc70: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
fc80: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
fc90: 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  b->aCol; i<pTab-
fca0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
fcb0: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
fcc0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
fcd0: 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20  int n, m;.    p 
fce0: 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[i].pExpr;.  
fcf0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
fd00: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
fd10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70   0, 0);.    /* p
fd20: 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e  Col->szEst = ...
fd30: 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20   // Column size 
fd40: 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20 74  est for SELECT t
fd50: 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65 64  ables never used
fd60: 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66   */.    pCol->af
fd70: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
fd80: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
fd90: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20 29  .    if( zType )
fda0: 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c 69  {.      m = sqli
fdb0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
fdc0: 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  e);.      n = sq
fdd0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43  lite3Strlen30(pC
fde0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
fdf0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
fe00: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
fe10: 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  OrFree(db, pCol-
fe20: 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a  >zName, n+m+2);.
fe30: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
fe40: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
fe50: 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a   memcpy(&pCol->z
fe60: 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65  Name[n+1], zType
fe70: 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , m+1);.        
fe80: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
fe90: 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50  = COLFLAG_HASTYP
fea0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
feb0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
fec0: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
fed0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
fee0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
fef0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ff00: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ff10: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
ff20: 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d  ( pColl && pCol-
ff30: 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >zColl==0 ){.   
ff40: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
ff50: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ff60: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
ff70: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
ff80: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
ff90: 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a   1; /* Any non-z
ffa0: 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73 20  ero value works 
ffb0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  */.}../*.** Give
ffc0: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
ffd0: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
ffe0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
fff0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
10000 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
10010 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
10020 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
10030 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
10040 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
10050 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
10060 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
10070 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
10080 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10090 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
100a0 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
100b0 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
100c0 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
100d0 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
100e0 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
100f0 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
10100 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
10110 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
10120 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
10130 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
10140 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
10150 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
10160 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
10170 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
10180 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
10190 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
101a0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
101b0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
101c0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
101d0 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
101e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
101f0 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
10200 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
10210 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
10220 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
10230 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
10240 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
10250 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
10260 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
10270 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d  sable );.  pTab-
10280 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
10290 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
102a0 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  .  pTab->nRowLog
102b0 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
102c0 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
102d0 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
102e0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
102f0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
10300 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
10310 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
10320 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
10330 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
10340 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
10350 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
10360 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63  se, pTab, pSelec
10370 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65  t);.  pTab->iPKe
10380 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  y = -1;.  if( db
10390 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
103a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  {.    sqlite3Del
103b0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
103c0 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  b);.    return 0
103d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
103e0 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Tab;.}../*.** Ge
103f0 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65  t a VDBE for the
10400 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f   given parser co
10410 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61  ntext.  Create a
10420 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
10430 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20  ssary..** If an 
10440 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
10450 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65  turn NULL and le
10460 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e  ave a message in
10470 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65   pParse..*/.Vdbe
10480 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65   *sqlite3GetVdbe
10490 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
104a0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
104b0 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Vdbe ){.    retu
104c0 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  rn pParse->pVdbe
104d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
104e0 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
104f0 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
10500 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
10510 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63  e->db,SQLITE_Fac
10520 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29  torOutConst).  )
10530 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b  {.    pParse->ok
10540 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b  ConstFactor = 1;
10550 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
10560 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
10570 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pParse);.}.../*.
10580 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
10590 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
105a0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
105b0 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
105c0 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
105d0 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
105e0 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
105f0 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
10600 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
10610 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
10620 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
10630 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
10640 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
10650 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
10660 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
10670 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
10680 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
10690 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
106a0 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
106b0 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
106c0 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
106d0 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
106e0 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
106f0 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
10700 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
10710 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
10720 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
10730 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
10740 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
10750 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10760 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
10770 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
10780 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
10790 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
107a0 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
107b0 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
107c0 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
107d0 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
107e0 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
107f0 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
10800 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
10810 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29  lt values (zero)
10820 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
10830 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
10840 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66  e..**.** The iOf
10850 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69  fset register (i
10860 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
10870 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
10880 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
10890 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20  he OFFSET.  The 
108a0 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20  iLimit register 
108b0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
108c0 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74  o LIMIT.  Regist
108d0 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20  er.** iOffset+1 
108e0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
108f0 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a  o LIMIT+OFFSET..
10900 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  **.** Only if pL
10910 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
10920 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
10930 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
10940 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
10950 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
10960 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
10970 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
10980 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
10990 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
109a0 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
109b0 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
109c0 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
109d0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
109e0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
109f0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
10a00 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
10a10 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10a20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
10a30 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
10a40 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
10a50 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e  iOffset;.  int n
10a60 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
10a70 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  t ) return;..  /
10a80 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
10a90 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
10aa0 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
10ab0 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
10ac0 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20  ntroversy about 
10ad0 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
10ae0 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
10af0 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
10b00 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
10b10 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
10b20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
10b30 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
10b40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
10b50 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
10b60 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
10b70 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  p->pOffset==0 ||
10b80 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b   p->pLimit!=0 );
10b90 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
10ba0 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
10bb0 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
10bc0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
10bd0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
10be0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
10bf0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10c00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10c10 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
10c20 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a  >pLimit, &n) ){.
10c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10c40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
10c50 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74  teger, n, iLimit
10c60 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
10c70 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
10c80 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
10c90 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
10ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10cb0 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b 29  eGoto(v, iBreak)
10cc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10cd0 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65  ( n>=0 && p->nSe
10ce0 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c  lectRow>sqlite3L
10cf0 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29 7b  ogEst((u64)n) ){
10d00 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
10d10 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
10d20 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b 0a  LogEst((u64)n);.
10d30 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
10d40 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c  ags |= SF_FixedL
10d50 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
10d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
10d70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10d80 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
10d90 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
10da0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10db0 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
10dc0 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  nt, iLimit); Vdb
10dd0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10de0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
10df0 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
10e00 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
10e10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10e20 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d  , OP_IfNot, iLim
10e30 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
10e40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10e50 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
10e60 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
10e70 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
10e80 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
10e90 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
10ea0 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
10eb0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
10ec0 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
10ed0 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
10ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10ef0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10f00 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  ->pOffset, iOffs
10f10 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
10f20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10f30 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
10f40 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
10f50 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
10f60 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10f70 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
10f80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10f90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10fa0 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c  _OffsetLimit, iL
10fb0 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c  imit, iOffset+1,
10fc0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
10fd0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10fe0 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
10ff0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
11000 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11010 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
11020 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
11030 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
11040 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
11050 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
11060 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
11070 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
11080 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
11090 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
110a0 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
110b0 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
110c0 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
110d0 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
110e0 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
110f0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
11100 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
11110 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
11120 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
11130 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
11140 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
11150 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
11160 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
11170 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
11180 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
11190 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
111a0 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
111b0 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
111c0 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
111d0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
111e0 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
111f0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
11200 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
11210 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
11220 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
11230 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
11240 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d  0 );.  /* iCol m
11250 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ust be less than
11260 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
11270 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e  r.  Otherwise an
11280 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a   error would.  *
11290 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f  * have been thro
112a0 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72  wn during name r
112b0 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65  esolution and we
112c0 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20   would not have 
112d0 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  gotten.  ** this
112e0 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52   far */.  if( pR
112f0 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  et==0 && ALWAYS(
11300 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
11310 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52  nExpr) ){.    pR
11320 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
11330 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11340 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
11350 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
11360 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
11370 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
11380 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
11390 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
113a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
113b0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
113c0 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
113d0 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
113e0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
113f0 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
11400 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
11410 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
11420 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
11430 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
11440 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
11450 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
11460 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
11470 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
11480 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
11490 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
114a0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
114b0 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
114c0 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
114d0 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
114e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
114f0 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
11500 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
11510 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
11520 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
11530 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
11540 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
11550 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
11560 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
11570 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
11580 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11590 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
115a0 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
115b0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
115c0 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
115d0 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
115e0 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
115f0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
11600 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
11610 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
11620 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
11630 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
11640 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
11650 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
11660 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
11670 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
11680 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
11690 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
116a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
116b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
116c0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
116d0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
116e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
116f0 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
11700 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
11710 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
11720 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
11730 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
11740 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
11750 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
11760 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
11770 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
11780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
11790 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
117a0 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
117b0 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
117c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
117d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
117e0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
117f0 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
11800 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
11810 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
11820 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
11830 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
11840 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
11850 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
11860 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
11870 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
11880 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
11890 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
118a0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
118b0 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
118c0 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
118d0 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
118e0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
118f0 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
11900 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
11910 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
11920 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
11930 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
11960 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
11970 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
119a0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
119b0 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
119c0 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
119d0 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
119e0 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
119f0 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
11a00 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
11a10 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
11a20 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
11a30 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
11a40 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
11a50 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
11a60 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
11a70 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
11a80 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
11a90 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
11aa0 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
11ab0 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
11ac0 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
11ad0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11ae0 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
11af0 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
11b00 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
11b10 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
11b20 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
11b30 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
11b40 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
11b50 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
11b60 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
11b70 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
11b80 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
11b90 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
11ba0 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
11bb0 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
11bc0 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
11bd0 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
11be0 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
11bf0 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
11c00 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
11c10 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
11c20 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
11c30 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
11c40 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
11c50 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
11c60 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
11c70 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
11c80 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
11c90 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
11ca0 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
11cb0 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
11cc0 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
11cd0 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
11ce0 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
11cf0 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
11d00 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
11d10 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
11d20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
11d30 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
11d40 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
11d50 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
11d60 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
11d70 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
11d80 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
11d90 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
11da0 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
11db0 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
11dc0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11dd0 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
11de0 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
11df0 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
11e00 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
11e10 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
11e20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
11e30 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
11e40 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
11e50 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
11e60 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
11e70 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
11e80 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
11e90 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
11ea0 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
11eb0 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
11ec0 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
11ed0 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
11ee0 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
11ef0 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
11f00 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
11f10 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
11f20 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
11f30 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
11f40 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
11f50 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
11f60 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
11f70 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
11f80 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
11f90 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
11fa0 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
11fb0 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
11fc0 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
11fd0 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
11fe0 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
11ff0 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
12000 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
12010 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
12020 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
12030 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12040 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
12050 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
12060 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12070 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
12080 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
12090 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
120a0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
120b0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
120c0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
120d0 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
120e0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
120f0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
12100 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
12110 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
12120 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
12130 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
12140 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
12150 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
12160 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
12170 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
12180 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
12190 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
121a0 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
121b0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
121c0 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
121d0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
121e0 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
121f0 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
12200 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
12210 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
12220 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
12230 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
12240 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
12250 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
12260 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
12270 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
12280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12290 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
122a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
122b0 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
122c0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
122d0 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
122e0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
122f0 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
12300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12310 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
12320 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
12330 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12340 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
12350 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
12360 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
12370 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
12380 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
12390 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
123a0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
123b0 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
123c0 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
123d0 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
123e0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
123f0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
12400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12410 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
12420 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12440 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12450 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
12460 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
12470 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
12480 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
12490 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
124a0 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  *pOffset;       
124b0 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
124c0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
124d0 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
124e0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
124f0 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
12500 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
12510 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
12520 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
12530 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
12540 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
12550 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
12560 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
12570 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
12580 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
12590 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
125a0 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
125b0 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
125c0 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
125d0 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
125e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
125f0 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
12600 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
12610 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
12620 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
12630 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
12640 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
12650 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
12660 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20  imit;.  pOffset 
12670 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
12680 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  regLimit = p->iL
12690 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65  imit;.  regOffse
126a0 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
126b0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d    p->pLimit = p-
126c0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
126d0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  p->iLimit = p->i
126e0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f  Offset = 0;.  pO
126f0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
12700 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  erBy;..  /* Loca
12710 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
12720 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72  mber of the Curr
12730 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ent table */.  f
12740 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
12750 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b  <pSrc->nSrc); i+
12760 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63  +){.    if( pSrc
12770 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75  ->a[i].fg.isRecu
12780 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
12790 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  Current = pSrc->
127a0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
127b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
127c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
127d0 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62  ate cursors numb
127e0 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e  ers for Queue an
127f0 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65  d Distinct.  The
12800 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
12810 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74  or.  ** the Dist
12820 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20  inct table must 
12830 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67  be exactly one g
12840 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75  reater than Queu
12850 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20  e in order.  ** 
12860 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74  for the SRT_Dist
12870 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73  Fifo and SRT_Dis
12880 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69  tQueue destinati
12890 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a  ons to work. */.
128a0 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73    iQueue = pPars
128b0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28  e->nTab++;.  if(
128c0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
128d0 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20   ){.    eDest = 
128e0 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44  pOrderBy ? SRT_D
128f0 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44  istQueue : SRT_D
12900 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69  istFifo;.    iDi
12910 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
12920 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
12930 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
12940 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65  rderBy ? SRT_Que
12950 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20  ue : SRT_Fifo;. 
12960 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
12970 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
12980 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51  Queue, eDest, iQ
12990 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ueue);..  /* All
129a0 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
129b0 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65  r Current, Queue
129c0 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  , and Distinct. 
129d0 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20  */.  regCurrent 
129e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
129f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12a00 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
12a10 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74  Pseudo, iCurrent
12a20 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43  , regCurrent, nC
12a30 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ol);.  if( pOrde
12a40 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
12a50 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d  fo *pKeyInfo = m
12a60 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
12a70 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
12a80 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   p, 1);.    sqli
12a90 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12aa0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
12ab0 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  l, iQueue, pOrde
12ac0 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
12ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12ae0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
12af0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
12b00 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65  FO);.    destQue
12b10 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  ue.pOrderBy = pO
12b20 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
12b30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12b40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
12b50 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
12b60 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20  ue, nCol);.  }. 
12b70 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12b80 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29   "Queue table"))
12b90 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63  ;.  if( iDistinc
12ba0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72  t ){.    p->addr
12bb0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71  OpenEphm[0] = sq
12bc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12bd0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
12be0 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20  ral, iDistinct, 
12bf0 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  0);.    p->selFl
12c00 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
12c10 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20  hemeral;.  }..  
12c20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52  /* Detach the OR
12c30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
12c40 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  om the compound 
12c50 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70  SELECT */.  p->p
12c60 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
12c70 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
12c80 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75  ults of the setu
12c90 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65  p-query in Queue
12ca0 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70  . */.  pSetup->p
12cb0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Next = 0;.  rc =
12cc0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
12cd0 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26  Parse, pSetup, &
12ce0 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53  destQueue);.  pS
12cf0 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  etup->pNext = p;
12d00 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
12d10 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76   end_of_recursiv
12d20 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46  e_query;..  /* F
12d30 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
12d40 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e   in the Queue an
12d50 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f  d output that ro
12d60 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  w */.  addrTop =
12d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12d80 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
12d90 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65   iQueue, addrBre
12da0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
12db0 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  e(v);..  /* Tran
12dc0 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
12dd0 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
12de0 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
12df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e00 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
12e10 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
12e20 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
12e30 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
12e40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
12e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12e60 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
12e70 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
12e80 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
12e90 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
12ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12eb0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
12ec0 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
12ed0 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
12ee0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12ef0 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
12f00 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
12f10 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
12f20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
12f30 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
12f40 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
12f50 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66  bel(v);.  codeOf
12f60 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65  fset(v, regOffse
12f70 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  t, addrCont);.  
12f80 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
12f90 70 50 61 72 73 65 2c 20 70 2c 20 69 43 75 72 72  pParse, p, iCurr
12fa0 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c  ent,.      0, 0,
12fb0 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74   pDest, addrCont
12fc0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
12fd0 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a  if( regLimit ){.
12fe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12ff0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
13000 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d  JumpZero, regLim
13010 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  it, addrBreak);.
13020 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
13030 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
13040 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13050 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  el(v, addrCont);
13060 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74  ..  /* Execute t
13070 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
13080 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73  ECT taking the s
13090 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
130a0 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65  rent as.  ** the
130b0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72   value for the r
130c0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20  ecursive-table. 
130d0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
130e0 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a  s in the Queue..
130f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
13100 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
13110 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c  egate ){.    sql
13120 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13130 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20  rse, "recursive 
13140 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
13150 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  s not supported"
13160 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13170 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
13180 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
13190 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
131a0 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73  tQueue);.    ass
131b0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
131c0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  0 );.    p->pPri
131d0 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d  or = pSetup;.  }
131e0 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
131f0 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
13200 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
13210 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
13220 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
13230 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
13240 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
13250 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
13260 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  ..end_of_recursi
13270 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69  ve_query:.  sqli
13280 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
13290 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  e(pParse->db, p-
132a0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d  >pOrderBy);.  p-
132b0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
132c0 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  erBy;.  p->pLimi
132d0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d  t = pLimit;.  p-
132e0 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
132f0 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  et;.  return;.}.
13300 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13310 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a  _OMIT_CTE */../*
13320 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
13330 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces */.static in
13340 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
13350 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
13360 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
13370 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
13380 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
13390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
133a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
133b0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
133c0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
133d0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
133e0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
133f0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13400 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61   */.);../*.** Ha
13410 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c  ndle the special
13420 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f   case of a compo
13430 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
13440 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
13450 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75  a.** VALUES clau
13460 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67  se.  By handling
13470 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
13480 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69  al case, we avoi
13490 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73  d deep.** recurs
134a0 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f  ion, and thus do
134b0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66   not need to enf
134c0 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f  orce the SQLITE_
134d0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
134e0 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41  ELECT.** on a VA
134f0 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  LUES clause..**.
13500 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53  ** Because the S
13510 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69  elect object ori
13520 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56  ginates from a V
13530 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a  ALUES clause:.**
13540 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f     (1) It has no
13550 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54   LIMIT or OFFSET
13560 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65  .**   (2) All te
13570 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c  rms are UNION AL
13580 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65  L.**   (3) There
13590 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
135a0 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63  clause.*/.static
135b0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
135c0 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20  Values(.  Parse 
135d0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
135e0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
135f0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
13600 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
13610 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
13620 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
13630 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
13640 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
13650 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
13660 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
13670 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ts */.){.  Selec
13680 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74  t *pPrior;.  int
13690 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74   nRow = 1;.  int
136a0 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   rc = 0;.  asser
136b0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
136c0 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
136d0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
136e0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
136f0 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
13700 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
13710 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
13720 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
13730 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
13740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
13750 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20  >pLimit==0 );.  
13760 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
13770 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  fset==0 );.    a
13780 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
13790 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  =0 || p->pEList-
137a0 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74  >nExpr==p->pNext
137b0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
137c0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50  );.    if( p->pP
137d0 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  rior==0 ) break;
137e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
137f0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70  pPrior->pNext==p
13800 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   );.    p = p->p
13810 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b  Prior;.    nRow+
13820 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a  +;.  }while(1);.
13830 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
13840 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
13850 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72  rior;.    p->pPr
13860 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ior = 0;.    rc 
13870 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
13880 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
13890 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
138a0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69   = pPrior;.    i
138b0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
138c0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
138d0 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d   = nRow;.    p =
138e0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
138f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13900 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13910 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
13920 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
13930 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
13940 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
13950 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
13960 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
13970 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
13980 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
13990 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
139a0 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
139b0 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
139c0 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
139d0 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
139e0 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
139f0 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
13a00 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
13a10 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
13a20 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
13a30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
13a40 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
13a50 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
13a60 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
13a70 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
13a80 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
13a90 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
13aa0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
13ab0 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
13ac0 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
13ad0 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
13ae0 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
13af0 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
13b00 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
13b10 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
13b20 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
13b30 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
13b40 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
13b50 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
13b60 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
13b70 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
13b80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
13b90 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
13ba0 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
13bb0 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
13bc0 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
13bd0 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
13bf0 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
13c00 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
13c10 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
13c20 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
13c30 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
13c40 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
13c50 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
13c60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13c70 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
13c80 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
13c90 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
13ca0 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
13cb0 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
13cc0 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
13cd0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
13ce0 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
13cf0 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
13d00 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
13d10 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
13d20 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
13d30 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
13d40 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
13d50 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
13d60 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
13d70 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
13d80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13d90 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13da0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
13db0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
13dc0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
13dd0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
13de0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
13df0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
13e00 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
13e10 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
13e20 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
13e30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
13e40 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
13e50 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
13e60 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
13e70 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
13e80 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
13e90 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
13ea0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
13eb0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
13ec0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
13ed0 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
13ee0 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
13ef0 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
13f00 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
13f10 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
13f20 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74    Select *pDelet
13f30 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e  e = 0;  /* Chain
13f40 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63   of simple selec
13f50 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ts to delete */.
13f60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
13f70 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
13f80 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
13f90 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13fa0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
13fb0 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20  int iSub1 = 0;  
13fc0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
13fd0 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
13fe0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
13ff0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  2 = 0;        /*
14000 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
14010 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
14020 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
14030 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
14040 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
14050 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
14060 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
14070 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
14080 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
14090 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
140a0 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
140b0 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
140c0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
140d0 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
140e0 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
140f0 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
14100 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
14110 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
14120 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
14130 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e  rsive)==0 || p->
14140 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d  op==TK_ALL || p-
14150 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
14160 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
14170 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
14180 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74  ->pPrior;.  dest
14190 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
141a0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
141b0 79 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69  y || pPrior->pLi
141c0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
141d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
141e0 65 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f  e,"%s clause sho
141f0 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
14200 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
14210 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72       pPrior->pOr
14220 64 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45  derBy!=0 ? "ORDE
14230 52 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c  R BY" : "LIMIT",
14240 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
14250 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
14260 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
14270 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
14280 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
14290 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
142a0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
142b0 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
142c0 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
142d0 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
142e0 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
142f0 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
14300 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
14310 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
14320 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
14330 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
14340 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
14350 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
14360 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14370 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
14380 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
14390 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
143a0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
143b0 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
143c0 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
143d0 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c  /* Special handl
143e0 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ing for a compou
143f0 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
14400 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56  riginates as a V
14410 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20  ALUES clause..  
14420 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
14430 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
14440 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  alue ){.    rc =
14450 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
14460 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
14470 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
14480 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
14490 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
144a0 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
144b0 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
144c0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
144d0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
144e0 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
144f0 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
14500 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
14510 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
14520 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73  ->pEList );.  as
14530 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
14540 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e  >nExpr==pPrior->
14550 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
14560 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14570 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
14580 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
14590 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
145a0 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
145b0 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
145c0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
145d0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
145e0 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
145f0 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
14600 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
14610 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
14620 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
14630 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
14640 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
14650 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
14660 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
14670 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
14680 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
14690 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
146a0 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
146b0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
146c0 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
146d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
146e0 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
146f0 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
14700 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
14710 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
14720 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
14730 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
14740 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
14750 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
14760 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
14770 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  et;.      pPrior
14780 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
14790 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
147a0 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
147b0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
147c0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
147d0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
147e0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
147f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14800 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14810 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
14820 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14830 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
14840 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
14850 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
14860 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
14870 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
14880 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
14890 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
148a0 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
148b0 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
148c0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
148d0 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
148e0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
148f0 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
14900 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14910 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
14920 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
14930 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14940 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
14950 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
14960 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
14970 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
14980 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
14990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
149a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
149b0 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
149c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
149e0 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
149f0 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
14a00 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
14a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
14a20 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14a30 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
14a40 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
14a50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14a60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14a70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
14a80 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14a90 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14aa0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
14ab0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14ac0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
14ad0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
14ae0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
14af0 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
14b00 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
14b10 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
14b20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
14b30 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
14b40 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
14b50 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
14b60 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
14b70 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
14b80 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
14b90 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  > sqlite3LogEst(
14ba0 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20  (u64)nLimit) .  
14bb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
14bc0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
14bd0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
14be0 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
14bf0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
14c00 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
14c10 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14c20 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
14c30 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14c40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14c50 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
14c60 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
14c70 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
14c80 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
14c90 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
14ca0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
14cb0 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
14cc0 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
14cd0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
14ce0 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
14cf0 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
14d00 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
14d10 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
14d20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
14d30 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
14d40 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
14d50 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
14d60 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
14d70 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
14d80 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
14d90 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
14da0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
14db0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
14dc0 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
14dd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
14de0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
14df0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14e00 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14e10 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
14e20 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
14e30 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
14e40 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
14e50 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
14e60 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
14e70 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
14e80 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
14e90 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
14ea0 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
14eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14ec0 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
14ed0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
14ee0 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
14ef0 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
14f00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14f10 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
14f20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
14f30 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
14f40 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
14f50 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
14f60 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
14f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14f80 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
14f90 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
14fa0 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
14fb0 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
14fc0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
14fd0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
14fe0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
14ff0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
15000 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
15010 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15020 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
15030 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
15040 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15050 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
15060 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
15070 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
15080 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
15090 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
150a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
150b0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
150c0 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64  dr;.        find
150d0 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
150e0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
150f0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
15100 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15110 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
15120 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
15130 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
15140 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
15150 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
15160 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
15170 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
15180 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
15190 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
151a0 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
151b0 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
151c0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
151d0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
151e0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
151f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15200 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
15210 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
15220 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
15230 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
15240 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
15250 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
15260 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
15270 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
15280 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
15290 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
152a0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
152b0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
152c0 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
152d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
152e0 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
152f0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
15300 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
15310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15320 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
15330 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
15340 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
15350 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
15360 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
15370 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
15380 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
15390 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
153a0 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
153b0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
153c0 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
153d0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
153e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
153f0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
15400 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
15410 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
15420 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
15430 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
15440 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
15450 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
15460 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
15470 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
15480 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
15490 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
154a0 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
154b0 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
154c0 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
154d0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
154e0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
154f0 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
15500 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
15510 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
15520 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
15530 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
15540 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
15550 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
15560 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
15570 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
15580 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
15590 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
155a0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
155b0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
155c0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
155d0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
155e0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
155f0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
15600 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
15610 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
15620 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
15630 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->iOffset = 0;..
15640 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
15650 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
15660 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15670 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
15680 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
15690 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
156a0 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
156b0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
156c0 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74  ( unionTab==dest
156d0 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74  .iSDParm || dest
156e0 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
156f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
15700 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
15710 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
15720 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
15730 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
15740 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
15750 20 29 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65   );.        iBre
15760 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
15770 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15780 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
15790 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
157a0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
157b0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
157c0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
157d0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
157e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
157f0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
15800 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
15810 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
15820 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  (v);.        iSt
15830 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
15840 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15850 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49  .        selectI
15860 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
15870 20 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20   p, unionTab,.  
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15890 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
158a0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
158b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
158c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
158d0 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
158e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
158f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
15900 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
15910 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
15920 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
15930 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15940 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
15950 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
15960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15970 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
15980 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
15990 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
159a0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
159b0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
159c0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
159d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
159e0 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
159f0 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
15a00 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
15a10 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
15a20 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
15a30 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
15a40 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
15a50 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
15a60 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
15a70 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
15a80 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
15a90 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
15aa0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
15ab0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
15ac0 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
15ad0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
15ae0 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
15af0 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
15b00 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
15b10 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
15b20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
15b30 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15b40 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
15b50 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
15b60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
15b70 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
15b80 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15b90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15ba0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15bb0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
15bc0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
15bd0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
15be0 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
15bf0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
15c00 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e   addr;.      fin
15c10 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73  dRightmost(p)->s
15c20 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
15c30 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
15c40 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
15c50 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f  List );..      /
15c60 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
15c70 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
15c80 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
15c90 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
15ca0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
15cb0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
15cc0 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c  (&intersectdest,
15cd0 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
15ce0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
15cf0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
15d00 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
15d10 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
15d20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
15d30 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
15d40 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
15d50 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
15d60 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
15d70 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
15d80 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
15d90 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
15da0 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
15db0 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
15dc0 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
15dd0 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  /.      addr = s
15de0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15df0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
15e00 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
15e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15e20 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
15e30 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
15e40 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15e50 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  1] = addr;.     
15e60 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
15e70 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
15e80 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
15e90 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
15ea0 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
15eb0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
15ec0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
15ed0 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74  .      intersect
15ee0 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74  dest.iSDParm = t
15ef0 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab2;.      expla
15f00 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
15f10 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
15f20 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
15f30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15f40 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
15f50 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
15f60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15f80 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
15f90 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
15fa0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
15fb0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
15fc0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70   p->nSelectRow>p
15fd0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
15fe0 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
15ff0 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
16000 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
16010 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
16020 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
16030 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
16040 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
16050 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
16060 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  fset;..      /* 
16070 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16080 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
16090 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
160a0 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
160b0 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
160c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
160d0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
160e0 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
160f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
16100 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
16110 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
16120 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
16130 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
16140 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
16150 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
16160 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16170 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16180 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
16190 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
161a0 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  e(v);.      r1 =
161b0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
161c0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
161d0 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
161e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
161f0 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31  OP_RowData, tab1
16200 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
16210 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
16220 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
16230 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
16240 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  1, 0); VdbeCover
16250 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
16260 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16270 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
16280 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
16290 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
162a0 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20  , tab1,.        
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
162c0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
162d0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
162e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
162f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
16300 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16310 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16320 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
16330 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
16340 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
16350 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
16360 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
16370 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16390 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
163a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
163b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
163c0 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
163d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
163e0 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69   }.  }..  explai
163f0 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
16400 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
16410 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54   iSub2, p->op!=T
16420 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f  K_ALL);..  /* Co
16430 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  mpute collating 
16440 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62  sequences used b
16450 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  y .  ** temporar
16460 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20  y tables needed 
16470 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
16480 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
16490 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68  ..  ** Attach th
164a0 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
164b0 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f  ure to all tempo
164c0 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a  rary tables..  *
164d0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
164e0 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
164f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
16500 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
16510 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
16520 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
16530 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
16540 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
16550 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
16560 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
16570 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
16580 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
16590 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
165a0 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
165b0 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
165c0 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
165d0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
165e0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
165f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16610 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
16620 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
16630 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
16640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
16650 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16660 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
16670 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
16680 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
16690 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
166a0 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
166b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
166c0 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  s */.    CollSeq
166d0 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20   **apColl;      
166e0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
166f0 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b  oping through pK
16700 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20  eyInfo->aColl[] 
16710 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16730 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16740 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  f columns in res
16750 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20  ult set */..    
16760 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74  assert( p->pNext
16770 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20  ==0 );.    nCol 
16780 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
16790 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  pr;.    pKeyInfo
167a0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
167b0 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c  oAlloc(db, nCol,
167c0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b   1);.    if( !pK
167d0 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
167e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
167f0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
16800 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
16810 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  end;.    }.    f
16820 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
16830 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
16840 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
16850 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
16860 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
16870 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
16880 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
16890 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
168a0 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
168b0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
168c0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
168d0 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
168e0 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
168f0 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
16900 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
16910 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
16920 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
16930 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
16940 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
16950 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
16960 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
16970 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
16980 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
16990 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
169a0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
169b0 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
169c0 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
169d0 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
169e0 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
169f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
16a00 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
16a10 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
16a20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16a30 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
16a40 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
16a50 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
16a60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16a70 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
16a80 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ddr, (char*)sqli
16a90 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
16aa0 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  eyInfo),.       
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
16ad0 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
16ae0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
16af0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
16b00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16b10 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
16b20 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
16b30 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
16b40 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
16b50 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44  dest.iSdst;.  pD
16b60 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73  est->nSdst = des
16b70 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74  t.nSdst;.  sqlit
16b80 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
16b90 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
16ba0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
16bb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16bc0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
16bd0 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f  T */../*.** Erro
16be0 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68  r message for wh
16bf0 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  en two or more t
16c00 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75  erms of a compou
16c10 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64  nd select have d
16c20 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65  ifferent.** size
16c30 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f   result sets..*/
16c40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
16c50 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73  ectWrongNumTerms
16c60 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
16c70 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
16c80 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
16c90 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
16ca0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
16cb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
16cc0 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68  ll VALUES must h
16cd0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
16ce0 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a  ber of terms");.
16cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
16d00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16d10 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
16d20 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
16d30 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
16d40 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
16d50 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
16d60 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
16d70 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
16d80 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  p->op));.  }.}..
16d90 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75  /*.** Code an ou
16da0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
16db0 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  for a coroutine 
16dc0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
16dd0 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
16de0 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  atment..**.** Th
16df0 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74  e data to be out
16e00 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  put is contained
16e10 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20   in pIn->iSdst. 
16e20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
16e30 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73  n->nSdst columns
16e40 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
16e50 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
16e60 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
16e70 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
16e80 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
16e90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
16ea0 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
16eb0 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
16ec0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
16ed0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
16ee0 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
16ef0 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67  is the first reg
16f00 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f  ister in a vecto
16f10 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64  r that.** record
16f20 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  s the previous o
16f30 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50  utput.  mem[regP
16f40 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74  rev] is a flag t
16f50 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20  hat is false.** 
16f60 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
16f70 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75  n no previous ou
16f80 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65  tput.  If regPre
16f90 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  v>0 then code is
16fa0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f  .** generated to
16fb0 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   suppress duplic
16fc0 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20  ates.  pKeyInfo 
16fd0 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70  is used for comp
16fe0 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a  aring.** keys..*
16ff0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49  *.** If the LIMI
17000 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c  T found in p->iL
17010 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
17020 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
17030 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a  y to.** iBreak..
17040 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
17050 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
17060 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20  outine(.  Parse 
17070 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
17080 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
17090 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
170a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
170b0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
170c0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
170d0 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20  electDest *pIn, 
170e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74         /* Corout
170f0 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61  ine supplying da
17100 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
17110 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
17120 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64  /* Where to send
17130 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   the data */.  i
17140 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20  nt regReturn,   
17150 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
17160 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
17170 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
17180 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  egPrev,         
17190 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
171a0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20  esult register. 
171b0 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69   No uniqueness i
171c0 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  f 0 */.  KeyInfo
171d0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
171e0 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e   /* For comparin
171f0 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  g with previous 
17200 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
17210 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
17220 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
17230 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
17240 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
17250 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
17260 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
17270 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
17280 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
17290 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
172a0 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
172b0 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
172c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
172d0 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
172e0 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
172f0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
17300 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
17310 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
17320 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
17330 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20  ddr2;.    addr1 
17340 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
17350 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
17360 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43   regPrev); VdbeC
17370 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17380 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
17390 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
173a0 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
173b0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
173c0 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
173f0 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
17400 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
17410 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
17420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17430 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
17440 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  r2+2, iContinue,
17450 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43   addr2+2); VdbeC
17460 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17470 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
17480 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
17490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
174a0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
174b0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
174c0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
174d0 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
174e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
174f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
17500 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
17510 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
17520 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
17530 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
17540 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
17550 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
17560 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
17570 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
17580 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
17590 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
175a0 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73  ontinue);..  ass
175b0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
175c0 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b  t!=SRT_Exists );
175d0 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
175e0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  ->eDest!=SRT_Tab
175f0 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  le );.  switch( 
17600 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
17610 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
17620 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
17630 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
17640 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
17650 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
17660 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
17670 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17680 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17690 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
176a0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
176b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
176c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
176d0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
176e0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
176f0 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
17700 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17710 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
17720 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
17730 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
17740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17750 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
17760 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
17770 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
17780 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17790 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
177a0 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
177b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
177c0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
177d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
177e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
177f0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
17800 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
17810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17820 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
17830 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
17840 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
17850 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
17860 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f  CT ...)"..    */
17870 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
17880 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
17890 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1;.      testcas
178a0 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20  e( pIn->nSdst>1 
178b0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
178c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
178d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
178e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
178f0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
17900 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
17910 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20  In->nSdst, .    
17920 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d        r1, pDest-
17930 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e  >zAffSdst, pIn->
17940 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
17950 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
17960 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
17970 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
17980 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
179a0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
179b0 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
179c0 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20  >iSDParm, r1,.  
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53           pIn->iS
179f0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
17a00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
17a10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17a20 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
17a30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17a40 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
17a50 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
17a60 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
17a70 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
17a80 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
17a90 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
17aa0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
17ab0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
17ac0 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
17ad0 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
17ae0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
17af0 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
17b00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
17b10 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50  ->nSdst==1 || pP
17b20 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20  arse->nErr>0 ); 
17b30 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
17b40 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20  nSdst!=1 );.    
17b50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
17b60 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
17b70 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
17b80 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20  >iSDParm, 1);.  
17b90 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
17ba0 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
17bb0 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
17bc0 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
17bd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
17be0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
17bf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
17c00 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
17c10 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
17c20 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
17c30 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
17c40 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
17c50 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64  ng at pDest->iSd
17c60 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  st.  Then the co
17c70 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e  -routine yields.
17c80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
17c90 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
17ca0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  {.      if( pDes
17cb0 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
17cc0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53         pDest->iS
17cd0 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dst = sqlite3Get
17ce0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
17cf0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17d00 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53         pDest->nS
17d10 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74  dst = pIn->nSdst
17d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17d30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
17d40 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
17d50 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
17d60 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17d70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17d80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
17d90 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
17da0 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62  SDParm);.      b
17db0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
17dc0 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
17dd0 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  he above, then t
17de0 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e  he result destin
17df0 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20  ation must be.  
17e00 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e    ** SRT_Output.
17e10 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
17e20 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  s never called w
17e30 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20  ith any other.  
17e40 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e    ** destination
17e50 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
17e60 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f  ones handled abo
17e70 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  ve or SRT_Output
17e80 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17e90 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20  For SRT_Output, 
17ea0 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
17eb0 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
17ec0 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20   of registers.  
17ed0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  .    ** Then the
17ee0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70   OP_ResultRow op
17ef0 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
17f00 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74  cause sqlite3_st
17f10 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72  ep() to.    ** r
17f20 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72  eturn the next r
17f30 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20  ow of result..  
17f40 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
17f50 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
17f60 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
17f70 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
17f80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17f90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
17fa0 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73  ltRow, pIn->iSds
17fb0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17fd0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
17fe0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
17ff0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
18000 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
18010 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
18020 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
18030 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
18040 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
18050 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
18060 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
18070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18080 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
18090 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
180a0 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
180b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
180c0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
180d0 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
180e0 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
180f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18100 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
18110 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
18120 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
18130 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
18140 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
18150 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
18160 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
18170 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
18180 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
18190 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
181a0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
181b0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
181c0 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
181d0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
181e0 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
181f0 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
18200 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
18210 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
18220 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
18230 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
18240 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
18250 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
18260 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
18270 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
18280 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
18290 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
182a0 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
182b0 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
182c0 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
182d0 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
182e0 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
182f0 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
18300 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
18310 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
18320 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
18330 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
18340 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
18350 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
18360 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
18370 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
18380 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
18390 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
183a0 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
183b0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
183c0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
183d0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
183e0 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
183f0 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
18400 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
18410 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
18420 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
18430 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
18440 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
18450 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
18460 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
18470 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
18480 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
18490 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
184a0 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
184b0 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
184c0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
184d0 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
184e0 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
184f0 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
18500 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
18510 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
18520 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
18530 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
18540 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
18550 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
18560 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
18570 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
18580 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
18590 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
185a0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
185b0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
185c0 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
185d0 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
185e0 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
185f0 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
18600 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
18610 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
18620 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
18630 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
18640 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
18650 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
18660 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
18670 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
18680 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
18690 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
186a0 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
186b0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
186c0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
186d0 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
186e0 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
186f0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
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 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
18730 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
18740 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
18750 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
18760 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
18770 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
18780 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
18790 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
187a0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
187b0 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
187c0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
187d0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
187e0 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
187f0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
18800 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
18810 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
18820 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
18830 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
18840 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
18850 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
18860 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
18870 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
18880 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
18890 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
188a0 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
188b0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
188c0 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
188d0 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
188e0 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
188f0 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
18900 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
18910 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
18920 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
18930 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
18940 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
18950 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
18960 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
18970 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
18980 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
18990 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
189a0 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
189b0 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
189c0 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
189d0 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
189e0 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
189f0 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
18a00 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
18a10 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
18a20 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
18a30 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
18a40 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
18a50 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
18a60 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
18a70 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
18a80 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
18a90 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
18aa0 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
18ab0 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
18ac0 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
18ad0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
18ae0 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
18af0 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
18b00 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
18b10 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
18b20 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
18b30 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
18b40 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
18b50 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
18b60 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
18b70 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
18b80 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
18b90 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
18ba0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
18bb0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
18bc0 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
18bd0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
18be0 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
18bf0 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
18c00 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
18c10 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
18c20 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
18c30 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
18c40 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
18c50 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
18c60 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
18c70 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
18c80 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
18c90 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
18ca0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
18cb0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
18cc0 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
18cd0 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
18ce0 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
18cf0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
18d00 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
18d10 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
18d20 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
18d30 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
18d40 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
18d50 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
18d60 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
18d70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
18d80 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
18d90 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
18da0 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
18db0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
18dc0 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
18dd0 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
18de0 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
18df0 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
18e00 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
18e10 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
18e20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
18e30 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
18e40 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
18e50 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
18e60 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
18e70 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
18e80 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
18e90 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
18ea0 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
18eb0 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
18ec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18ed0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
18ee0 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
18ef0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
18f00 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
18f10 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
18f20 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
18f30 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
18f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18f50 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
18f60 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
18f70 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
18f80 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
18f90 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
18fa0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
18fb0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18fd0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
18fe0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
18ff0 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
19000 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
19010 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
19020 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
19030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19040 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
19050 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
19060 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
19070 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
19080 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
19090 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
190a0 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
190b0 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
190c0 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
190d0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
190e0 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
190f0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
19100 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
19110 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
19120 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
19130 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
19140 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
19150 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
19160 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
19170 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
19180 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
19190 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
191a0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
191b0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
191c0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
191d0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
191e0 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
191f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
19200 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
19210 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
19220 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19230 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
19240 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
19250 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
19260 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
19270 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
19280 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
19290 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
192a0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
192b0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
192c0 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
192d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
192e0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
192f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
19300 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
19310 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
19320 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
19330 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
19340 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
19350 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
19360 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
19370 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
19380 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
19390 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
193a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
193b0 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
193c0 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
193d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
193e0 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
193f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
19400 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
19410 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
19420 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
19430 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
19440 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
19450 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
19460 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
19470 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
19480 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
19490 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
194a0 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
194b0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
194c0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
194d0 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
194e0 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
194f0 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
19500 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
19510 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
19520 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
19530 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
19540 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
19550 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
19560 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
19570 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
19580 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
19590 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
195a0 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
195b0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
195c0 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
195d0 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
195e0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
195f0 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
19600 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
19610 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
19620 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
19630 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
19640 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
19650 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
19660 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
19670 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
19680 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
19690 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
196a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
196b0 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
196c0 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
196d0 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
196e0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
196f0 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
19700 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
19710 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
19720 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
19730 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
19740 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
19750 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
19760 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
19770 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
19780 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
19790 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
197a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
197b0 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
197c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
197d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
197e0 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
197f0 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
19800 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
19810 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
19820 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
19830 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
19840 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
19850 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
19860 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
19870 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
19880 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
19890 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
198a0 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
198b0 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
198c0 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
198d0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
198e0 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
198f0 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
19900 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
19910 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
19920 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
19930 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
19940 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
19950 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
19960 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
19970 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
19980 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
19990 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
199a0 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
199b0 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
199c0 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
199d0 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
199e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
199f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
19a00 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
19a10 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
19a20 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
19a30 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
19a40 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
19a50 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
19a60 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
19a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
19a80 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
19a90 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
19aa0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
19ab0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
19ac0 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
19ad0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
19ae0 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
19af0 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
19b00 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
19b10 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
19b20 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
19b30 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
19b40 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
19b50 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
19b60 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
19b70 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
19b80 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
19b90 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
19ba0 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
19bb0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
19bc0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
19bd0 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
19be0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
19bf0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
19c00 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19c10 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
19c20 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
19c30 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
19c40 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
19c50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19c60 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
19c70 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
19c80 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
19c90 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  x.iOrderByCol==i
19ca0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
19cb0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
19cc0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
19cd0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
19ce0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
19cf0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
19d00 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
19d10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
19d20 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
19d30 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
19d40 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
19d50 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
19d60 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
19d70 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
19d80 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d  rBy = pOrderBy =
19d90 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
19da0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
19db0 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a  OrderBy, pNew);.
19dc0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64          if( pOrd
19dd0 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
19de0 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75  >a[nOrderBy++].u
19df0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
19e00 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
19e10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19e20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
19e30 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
19e40 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
19e50 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
19e60 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
19e70 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64  tation used to d
19e80 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
19e90 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  next.  ** row of
19ea0 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66   results comes f
19eb0 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73  rom selectA or s
19ec0 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64  electB.  Also ad
19ed0 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20  d explicit.  ** 
19ee0 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68  collations to th
19ef0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19f00 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20  e terms so that 
19f10 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  when the subquer
19f20 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ies.  ** to the 
19f30 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65  right and the le
19f40 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ft are evaluated
19f50 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63  , they use the c
19f60 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c  orrect.  ** coll
19f70 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50  ation..  */.  aP
19f80 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33  ermute = sqlite3
19f90 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
19fa0 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e  , sizeof(int)*(n
19fb0 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20  OrderBy + 1));. 
19fc0 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b   if( aPermute ){
19fd0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
19fe0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19ff0 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30  ;.    aPermute[0
1a000 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  ] = nOrderBy;.  
1a010 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d    for(i=1, pItem
1a020 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
1a030 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  =nOrderBy; i++, 
1a040 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1a050 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
1a060 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
1a070 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a080 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1a090 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  derByCol<=p->pEL
1a0a0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1a0b0 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20      aPermute[i] 
1a0c0 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  = pItem->u.x.iOr
1a0d0 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20  derByCol - 1;.  
1a0e0 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
1a0f0 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  e = multiSelectO
1a100 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
1a110 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d  arse, p, 1);.  }
1a120 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65  else{.    pKeyMe
1a130 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rge = 0;.  }..  
1a140 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20  /* Reattach the 
1a150 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1a160 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  to the query..  
1a170 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
1a180 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
1a190 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
1a1a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1a1b0 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
1a1c0 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a   pOrderBy, 0);..
1a1d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
1a1e0 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61  range of tempora
1a1f0 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ry registers and
1a200 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65   the KeyInfo nee
1a210 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ded.  ** for the
1a220 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f   logic that remo
1a230 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65  ves duplicate re
1a240 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74  sult rows when t
1a250 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  he.  ** operator
1a260 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50   is UNION, EXCEP
1a270 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20  T, or INTERSECT 
1a280 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41  (but not UNION A
1a290 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LL)..  */.  if( 
1a2a0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1a2b0 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20    regPrev = 0;. 
1a2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1a2d0 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  nExpr = p->pELis
1a2e0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73  t->nExpr;.    as
1a2f0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d  sert( nOrderBy>=
1a300 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
1a310 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1a320 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
1a330 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
1a340 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1a350 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69  Expr+1;.    sqli
1a360 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a370 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1a380 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b  regPrev);.    pK
1a390 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b  eyDup = sqlite3K
1a3a0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
1a3b0 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69  nExpr, 1);.    i
1a3c0 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20  f( pKeyDup ){.  
1a3d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1a3e0 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
1a3f0 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29  eable(pKeyDup) )
1a400 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1a410 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
1a420 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
1a430 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
1a440 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
1a450 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
1a460 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
1a470 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30  SortOrder[i] = 0
1a480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a490 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72    }. .  /* Separ
1a4a0 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64  ate the left and
1a4b0 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79   the right query
1a4c0 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65   from one anothe
1a4d0 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69  r.  */.  p->pPri
1a4e0 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72  or = 0;.  pPrior
1a4f0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73  ->pNext = 0;.  s
1a500 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
1a510 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
1a520 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
1a530 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66  , "ORDER");.  if
1a540 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
1a550 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1a560 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1a570 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
1a580 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
1a590 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
1a5a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
1a5b0 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65  ute the limit re
1a5c0 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d  gisters */.  com
1a5d0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
1a5e0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61  rs(pParse, p, la
1a5f0 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  belEnd);.  if( p
1a600 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d  ->iLimit && op==
1a610 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1a620 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72  gLimitA = ++pPar
1a630 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
1a640 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72  gLimitB = ++pPar
1a650 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1a660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a670 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69  v, OP_Copy, p->i
1a680 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66  Offset ? p->iOff
1a690 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69  set+1 : p->iLimi
1a6a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6c0 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b       regLimitA);
1a6d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a6e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
1a6f0 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65  y, regLimitA, re
1a700 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73  gLimitB);.  }els
1a710 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  e{.    regLimitA
1a720 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30   = regLimitB = 0
1a730 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1a740 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
1a750 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
1a760 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Limit = 0;.  sql
1a770 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1a780 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  b, p->pOffset);.
1a790 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1a7a0 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20  ;..  regAddrA = 
1a7b0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a7c0 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70    regAddrB = ++p
1a7d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1a7e0 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73  egOutA = ++pPars
1a7f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
1a800 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
1a810 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Mem;.  sqlite3Se
1a820 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
1a830 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stA, SRT_Corouti
1a840 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ne, regAddrA);. 
1a850 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1a860 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53  stInit(&destB, S
1a870 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
1a880 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47  gAddrB);..  /* G
1a890 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
1a8a0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
1a8b0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1a8c0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
1a8d0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
1a8e0 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
1a8f0 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
1a900 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
1a910 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctA = sqlite3Vdb
1a920 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
1a930 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  + 1;.  addr1 = s
1a940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a950 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
1a960 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20  tine, regAddrA, 
1a970 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  0, addrSelectA);
1a980 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
1a990 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22  v, "left SELECT"
1a9a0 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
1a9b0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
1a9c0 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ;.  explainSetIn
1a9d0 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
1a9e0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
1a9f0 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Id);.  sqlite3Se
1aa00 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
1aa10 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
1aa20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
1aa30 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64  routine(v, regAd
1aa40 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
1aa50 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1aa60 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddr1);..  /* Gen
1aa70 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1aa80 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1aa90 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1aaa0 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
1aab0 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
1aac0 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
1aad0 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
1aae0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1aaf0 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64  dr(v) + 1;.  add
1ab00 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
1ab10 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
1ab20 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
1ab30 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrB, 0, addrSel
1ab40 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectB);.  VdbeCom
1ab50 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20  ment((v, "right 
1ab60 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
1ab70 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
1ab80 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
1ab90 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
1aba0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
1abb0 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
1abc0 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
1abd0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
1abe0 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
1abf0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
1ac00 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1ac10 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
1ac20 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
1ac30 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
1ac40 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
1ac50 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
1ac60 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
1ac70 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42  tine(v, regAddrB
1ac80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1ac90 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1aca0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
1acb0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
1acc0 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
1acd0 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
1ace0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
1acf0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
1ad00 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1ad10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
1ad20 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
1ad30 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
1ad40 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1ad50 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1ad60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1ad70 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
1ad80 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ada0 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1adb0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
1adc0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1add0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1ade0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1adf0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
1ae00 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1ae10 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1ae20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1ae30 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1ae40 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1ae50 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
1ae60 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
1ae70 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
1ae80 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
1ae90 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
1aea0 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
1aeb0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
1aec0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1aed0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
1aee0 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
1aef0 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
1af00 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
1af10 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
1af20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
1af30 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
1af40 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
1af50 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1af60 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
1af70 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
1af80 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
1af90 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
1afa0 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
1afb0 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
1afc0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  /.  if( op==TK_E
1afd0 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
1afe0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1aff0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1b000 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c  addrEofA = label
1b010 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
1b020 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1b030 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
1b040 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1b050 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
1b060 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b070 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1b080 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1b090 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
1b0a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b0b0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b0c0 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65  , regAddrB, labe
1b0d0 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  lEnd);.         
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
1b100 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b110 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1b120 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  (v, addrEofA);. 
1b130 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
1b140 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1b150 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
1b160 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
1b170 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ctRow);.  }..  /
1b180 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1b190 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1b1a0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1b1b0 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
1b1c0 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1b1d0 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1b1e0 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
1b1f0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1b200 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1b210 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
1b220 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
1b230 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
1b240 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
1b250 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
1b260 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
1b270 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
1b280 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1b290 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1b2a0 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
1b2b0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1b2c0 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
1b2d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1b2e0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1b2f0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
1b300 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b310 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b320 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20  drA, labelEnd); 
1b330 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b340 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b350 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42  Goto(v, addrEofB
1b360 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1b370 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1b380 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1b390 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
1b3a0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1b3b0 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
1b3c0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
1b3d0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1b3e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1b3f0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1b400 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
1b410 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b420 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1b430 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1b440 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b450 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1b460 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1b470 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b480 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1b490 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
1b4a0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1b4b0 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
1b4c0 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1b4d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1b4e0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1b4f0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1b500 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
1b510 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
1b520 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1b530 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
1b540 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1b550 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
1b560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b570 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1b580 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1b590 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1b5a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1b5b0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b5c0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
1b5d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1b5e0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1b5f0 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
1b600 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1b610 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
1b620 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1b630 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
1b640 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1b650 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
1b660 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1b670 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1b680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b690 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1b6a0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1b6b0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1b6c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b6d0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1b6e0 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1b6f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b700 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1b710 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1b720 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
1b730 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
1b740 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
1b750 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
1b760 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1b770 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
1b780 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b790 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1b7a0 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  rA, addrEofA_noB
1b7b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b7c0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1b7d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b7e0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1b7f0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1b800 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1b810 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d   Implement the m
1b820 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20  ain merge loop. 
1b830 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1b840 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b850 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73   labelCmpr);.  s
1b860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1b870 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  (v, OP_Permutati
1b880 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  on, 0, 0, 0, (ch
1b890 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34  ar*)aPermute, P4
1b8a0 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71  _INTARRAY);.  sq
1b8b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1b8c0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64  v, OP_Compare, d
1b8d0 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74  estA.iSdst, dest
1b8e0 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42  B.iSdst, nOrderB
1b8f0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1b900 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1b910 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
1b920 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
1b930 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1b940 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  (v, OPFLAG_PERMU
1b950 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TE);.  sqlite3Vd
1b960 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
1b970 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
1b980 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
1b990 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1b9a0 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  (v);..  /* Jump 
1b9b0 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
1b9c0 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
1b9d0 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
1b9e0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1b9f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1ba00 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
1ba10 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
1ba20 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1ba30 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
1ba40 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
1ba50 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
1ba60 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1ba70 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
1ba80 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
1ba90 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1baa0 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
1bab0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
1bac0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50  r = pPrior;.  pP
1bad0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
1bae0 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
1baf0 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
1bb00 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
1bb10 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
1bb20 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
1bb30 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
1bb40 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
1bb50 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20  (pParse, p->op, 
1bb60 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29  iSub1, iSub2, 0)
1bb70 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
1bb80 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65  e->nErr!=0;.}.#e
1bb90 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
1bba0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1bbb0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1bbc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1bbd0 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e  _VIEW)../* An in
1bbe0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75  stance of the Su
1bbf0 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  bstContext objec
1bc00 74 20 64 65 73 63 72 69 62 65 73 20 61 6e 20 73  t describes an s
1bc10 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64 69 74  ubstitution edit
1bc20 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66 6f 72  .** to be perfor
1bc30 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65 20 74  med on a parse t
1bc40 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72  ree..**.** All r
1bc50 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
1bc60 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 54  umns in table iT
1bc70 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65 20 72  able are to be r
1bc80 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72 72 65  eplaced by corre
1bc90 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72  sponding.** expr
1bca0 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73  essions in pELis
1bcb0 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
1bcc0 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74 65 78  ruct SubstContex
1bcd0 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  t {.  Parse *pPa
1bce0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
1bcf0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1bd00 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
1bd10 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  iTable;         
1bd20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65        /* Replace
1bd30 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1bd40 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
1bd50 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20 20 20  nt iNewTable;   
1bd60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1bd70 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  table number */.
1bd80 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e    int isLeftJoin
1bd90 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
1bda0 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  dd TK_IF_NULL_RO
1bdb0 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61 63  W opcodes on eac
1bdc0 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f  h replacement */
1bdd0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1bde0 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ist;         /* 
1bdf0 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78 70 72  Replacement expr
1be00 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62  essions */.} Sub
1be10 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46  stContext;../* F
1be20 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1be30 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1be40 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1be50 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20  (SubstContext*, 
1be60 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
1be70 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
1be80 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74  ect(SubstContext
1be90 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29  *, Select*, int)
1bea0 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
1beb0 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
1bec0 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
1bed0 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
1bee0 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
1bef0 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
1bf00 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
1bf10 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
1bf20 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
1bf30 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
1bf40 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
1bf50 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
1bf60 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
1bf70 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
1bf80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
1bf90 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
1bfa0 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
1bfb0 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
1bfc0 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
1bfd0 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
1bfe0 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
1bff0 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
1c000 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1c010 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
1c020 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
1c030 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
1c040 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
1c050 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
1c060 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1c070 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73   makes the neces
1c080 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
1c090 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
1c0a0 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
1c0b0 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
1c0c0 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
1c0d0 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
1c0e0 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
1c0f0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
1c100 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  y..*/.static Exp
1c110 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20  r *substExpr(.  
1c120 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1c130 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63 72 69  ubst,  /* Descri
1c140 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1c150 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45  stitution */.  E
1c160 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
1c170 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
1c180 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
1c190 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b  ion occurs */.){
1c1a0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1c1b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1c1c0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1c1d0 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
1c1e0 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70 45 78 70  Join).   && pExp
1c1f0 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1c200 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1c210 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70  le.  ){.    pExp
1c220 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1c230 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65  le = pSubst->iNe
1c240 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  wTable;.  }.  if
1c250 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1c260 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
1c270 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1c280 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  >iTable ){.    i
1c290 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
1c2a0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
1c2b0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
1c2c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c2d0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
1c2e0 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79       Expr *pCopy
1c2f0 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73   = pSubst->pELis
1c300 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
1c310 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
1c320 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77    Expr ifNullRow
1c330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c340 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d  pSubst->pEList!=
1c350 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
1c360 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69  umn<pSubst->pELi
1c370 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1c380 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1c390 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
1c3a0 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
1c3b0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1c3c0 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
1c3d0 70 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20  pCopy) ){.      
1c3e0 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45    sqlite3VectorE
1c3f0 72 72 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e  rrorMsg(pSubst->
1c400 70 50 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a  pParse, pCopy);.
1c410 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c420 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1c430 20 3d 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73   = pSubst->pPars
1c440 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69  e->db;.        i
1c450 66 28 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66  f( pSubst->isLef
1c460 74 4a 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e  tJoin && pCopy->
1c470 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
1c480 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
1c490 74 28 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c  t(&ifNullRow, 0,
1c4a0 20 73 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f   sizeof(ifNullRo
1c4b0 77 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  w));.          i
1c4c0 66 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b  fNullRow.op = TK
1c4d0 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20  _IF_NULL_ROW;.  
1c4e0 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1c4f0 77 2e 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b  w.pLeft = pCopy;
1c500 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1c510 6c 52 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53  lRow.iTable = pS
1c520 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1c530 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 70 79  .          pCopy
1c540 20 3d 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20   = &ifNullRow;. 
1c550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c560 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1c570 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79  xprDup(db, pCopy
1c580 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
1c590 28 20 70 4e 65 77 20 26 26 20 70 53 75 62 73 74  ( pNew && pSubst
1c5a0 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  ->isLeftJoin ){.
1c5b0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
1c5c0 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  tProperty(pNew, 
1c5d0 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20  EP_CanBeNull);. 
1c5e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c5f0 20 69 66 28 20 70 4e 65 77 20 26 26 20 45 78 70   if( pNew && Exp
1c600 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c610 70 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  pr,EP_FromJoin) 
1c620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
1c630 77 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  w->iRightJoinTab
1c640 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67  le = pExpr->iRig
1c650 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20  htJoinTable;.   
1c660 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
1c670 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
1c680 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20  FromJoin);.     
1c690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1c6a0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1c6b0 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
1c6c0 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
1c6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c6e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1c6f0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46  pExpr->op==TK_IF
1c700 5f 4e 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78  _NULL_ROW && pEx
1c710 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62  pr->iTable==pSub
1c720 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20  st->iTable ){.  
1c730 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
1c740 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77  e = pSubst->iNew
1c750 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Table;.    }.   
1c760 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
1c770 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1c780 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1c790 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
1c7a0 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ht = substExpr(p
1c7b0 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52  Subst, pExpr->pR
1c7c0 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45  ight);.    if( E
1c7d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c7e0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1c7f0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
1c800 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c  stSelect(pSubst,
1c810 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1c820 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 1);.    }else
1c830 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1c840 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 45  rList(pSubst, pE
1c850 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
1c860 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c870 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
1c880 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1c890 4c 69 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e  List(.  SubstCon
1c8a0 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a  text *pSubst, /*
1c8b0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1c8c0 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1c8d0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1c8e0 70 4c 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c  pList       /* L
1c8f0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
1c900 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1c910 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
1c920 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1c930 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1c940 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1c950 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1c960 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
1c970 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
1c980 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1c990 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1c9a0 72 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  r);.  }.}.static
1c9b0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1c9c0 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  t(.  SubstContex
1c9d0 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65  t *pSubst, /* De
1c9e0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1c9f0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1ca00 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1ca10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
1ca20 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1ca30 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1ca40 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
1ca50 20 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20   int doPrior    
1ca60 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62         /* Do sub
1ca70 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70  stitutes on p->p
1ca80 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a  Prior too */.){.
1ca90 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1caa0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1cab0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1cac0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70   int i;.  if( !p
1cad0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b   ) return;.  do{
1cae0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1caf0 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45  st(pSubst, p->pE
1cb00 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
1cb10 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1cb20 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20   p->pGroupBy);. 
1cb30 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1cb40 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64  (pSubst, p->pOrd
1cb50 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48  erBy);.    p->pH
1cb60 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1cb70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61  r(pSubst, p->pHa
1cb80 76 69 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57  ving);.    p->pW
1cb90 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1cba0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65  (pSubst, p->pWhe
1cbb0 72 65 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  re);.    pSrc = 
1cbc0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73  p->pSrc;.    ass
1cbd0 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
1cbe0 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
1cbf0 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63  nSrc, pItem=pSrc
1cc00 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
1cc10 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
1cc20 75 62 73 74 53 65 6c 65 63 74 28 70 53 75 62 73  ubstSelect(pSubs
1cc30 74 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  t, pItem->pSelec
1cc40 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
1cc50 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
1cc60 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
1cc70 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1cc80 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e  ubst, pItem->u1.
1cc90 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20  pFuncArg);.     
1cca0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
1ccb0 65 28 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70  e( doPrior && (p
1ccc0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30   = p->pPrior)!=0
1ccd0 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   );.}.#endif /* 
1cce0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ccf0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1cd00 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1cd10 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1cd20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1cd30 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1cd40 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1cd50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1cd60 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
1cd70 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1cd80 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
1cd90 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
1cda0 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
1cdb0 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
1cdc0 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
1cdd0 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
1cde0 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
1cdf0 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
1ce00 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
1ce10 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
1ce20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
1ce30 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1ce40 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
1ce50 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1ce60 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
1ce70 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1ce80 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
1ce90 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
1cea0 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
1ceb0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
1cec0 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
1ced0 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
1cee0 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
1cef0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1cf00 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
1cf10 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
1cf20 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
1cf30 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
1cf40 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
1cf50 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
1cf60 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
1cf70 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
1cf80 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
1cf90 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1cfa0 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
1cfb0 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
1cfc0 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
1cfd0 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1cfe0 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
1cff0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1d000 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
1d010 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
1d020 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
1d030 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
1d040 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
1d050 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
1d060 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
1d070 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1d080 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
1d090 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
1d0a0 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
1d0b0 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74  this simplificat
1d0c0 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
1d0d0 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
1d0e0 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
1d0f0 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
1d100 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
1d110 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
1d120 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
1d130 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
1d140 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
1d150 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
1d160 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
1d170 61 74 74 65 6e 69 6e 67 20 69 73 20 73 75 62 6a  attening is subj
1d180 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ect to the follo
1d190 77 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73  wing constraints
1d1a0 3a 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  :.**.**  (**)  W
1d1b0 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1d1c0 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1d1d0 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1d1e0 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20  ies. Was:.**    
1d1f0 20 20 20 20 54 68 65 20 73 75 62 71 75 65 72 79      The subquery
1d200 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1d210 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68  uery cannot both
1d220 20 62 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a   be aggregates..
1d230 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1d240 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1d250 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1d260 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1d270 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  s. Was:.**      
1d280 20 20 28 32 29 20 49 66 20 74 68 65 20 73 75 62    (2) If the sub
1d290 71 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72  query is an aggr
1d2a0 65 67 61 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20  egate then.**   
1d2b0 20 20 20 20 20 28 32 61 29 20 74 68 65 20 6f 75       (2a) the ou
1d2c0 74 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e  ter query must n
1d2d0 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64  ot be a join and
1d2e0 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 62 29 20  .**        (2b) 
1d2f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d300 6d 75 73 74 20 6e 6f 74 20 75 73 65 20 73 75 62  must not use sub
1d310 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 20 20 20  queries.**      
1d320 20 20 20 20 20 20 20 6f 74 68 65 72 20 74 68 61         other tha
1d330 6e 20 74 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63  n the one FROM-c
1d340 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 74  lause subquery t
1d350 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61  hat is a candida
1d360 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  te.**           
1d370 20 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67    for flattening
1d380 2e 20 20 28 54 68 69 73 20 69 73 20 64 75 65 20  .  (This is due 
1d390 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37  to ticket [2f717
1d3a0 30 64 37 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a  0d73bf9abf80].**
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
1d3c0 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a  m 2015-02-09.).*
1d3d0 2a 0a 2a 2a 20 20 20 28 33 29 20 20 49 66 20 74  *.**   (3)  If t
1d3e0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
1d3f0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1d400 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
1d410 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1d420 33 61 29 20 74 68 65 20 73 75 62 71 75 65 72 79  3a) the subquery
1d430 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f   may not be a jo
1d440 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  in and.**       
1d450 20 28 33 62 29 20 74 68 65 20 46 52 4f 4d 20 63   (3b) the FROM c
1d460 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
1d470 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f  query may not co
1d480 6e 74 61 69 6e 20 61 20 76 69 72 74 75 61 6c 0a  ntain a virtual.
1d490 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 74  **             t
1d4a0 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20  able and.**     
1d4b0 20 20 20 28 33 63 29 20 74 68 65 20 6f 75 74 65     (3c) the oute
1d4c0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1d4d0 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  be an aggregate.
1d4e0 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
1d4f0 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 6e  e subquery can n
1d500 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a  ot be DISTINCT..
1d510 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
1d520 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
1d530 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
1d540 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
1d550 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
1d560 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
1d570 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
1d580 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
1d590 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
1d5a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
1d5b0 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
1d5c0 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
1d5d0 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
1d5e0 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
1d5f0 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  ueries..**.**  (
1d600 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1d610 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1d620 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1d630 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a  ubqueries.  Was:
1d640 0a 2a 2a 20 20 20 20 20 20 20 20 49 66 20 74 68  .**        If th
1d650 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 67  e subquery is ag
1d660 67 72 65 67 61 74 65 2c 20 74 68 65 20 6f 75 74  gregate, the out
1d670 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1d680 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a   be DISTINCT..**
1d690 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
1d6a0 75 62 71 75 65 72 79 20 6d 75 73 74 20 68 61 76  ubquery must hav
1d6b0 65 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  e a FROM clause.
1d6c0 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62    TODO:  For sub
1d6d0 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a  queries without.
1d6e0 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d  **        A FROM
1d6f0 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65   clause, conside
1d700 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20  r adding a FROM 
1d710 63 6c 61 75 73 65 20 77 69 74 68 20 74 68 65 20  clause with the 
1d720 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20  special.**      
1d730 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f    table sqlite_o
1d740 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74  nce that consist
1d750 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f  s of a single ro
1d760 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  w containing a.*
1d770 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20  *        single 
1d780 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  NULL..**.**   (8
1d790 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
1d7a0 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68  ry uses LIMIT th
1d7b0 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  en the outer que
1d7c0 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  ry may not be a 
1d7d0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
1d7e0 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
1d7f0 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68  ry uses LIMIT th
1d800 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  en the outer que
1d810 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 67  ry may not be ag
1d820 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20  gregate..**.**  
1d830 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f  (**)  Restrictio
1d840 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76  n (10) was remov
1d850 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65  ed from the code
1d860 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62   on 2005-02-05 b
1d870 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1d880 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69  accidently carri
1d890 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66  ed the comment f
1d8a0 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31  orward until 201
1d8b0 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e  4-09-15.  Origin
1d8c0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e  al.**        con
1d8d0 73 74 72 61 69 6e 74 3a 20 22 49 66 20 74 68 65  straint: "If the
1d8e0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67   subquery is agg
1d8f0 72 65 67 61 74 65 20 74 68 65 6e 20 74 68 65 20  regate then the 
1d900 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20  outer query .** 
1d910 20 20 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 75         may not u
1d920 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a  se LIMIT.".**.**
1d930 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
1d940 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1d950 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1d960 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
1d970 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
1d980 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d  **  (**)  Not im
1d990 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
1d9a0 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
1d9b0 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
1d9c0 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
1d9d0 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
1d9e0 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
1d9f0 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
1da00 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
1da10 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1da20 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
1da30 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 75 73   may not both us
1da40 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
1da50 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
1da60 72 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f  ry may not use O
1da70 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  FFSET..**.**  (1
1da80 35 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72  5)  If the outer
1da90 20 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f   query is part o
1daa0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
1dab0 65 63 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ect, then the.**
1dac0 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
1dad0 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d   may not use LIM
1dae0 49 54 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  IT..**        (S
1daf0 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20  ee ticket #2339 
1db00 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38  and ticket [02a8
1db10 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20  e81d44])..**.** 
1db20 20 28 31 36 29 20 20 49 66 20 74 68 65 20 6f 75   (16)  If the ou
1db30 74 65 72 20 71 75 65 72 79 20 69 73 20 61 67 67  ter query is agg
1db40 72 65 67 61 74 65 2c 20 74 68 65 6e 20 74 68 65  regate, then the
1db50 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
1db60 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
1db70 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
1db80 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
1db90 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
1dba0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
1dbb0 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
1dbc0 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
1dbd0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
1dbe0 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 49 66 20  **.**  (17)  If 
1dbf0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1dc00 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1dc10 74 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  t, then.**      
1dc20 20 20 28 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70    (17a) all comp
1dc30 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 73 20 6d  ound operators m
1dc40 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41  ust be a UNION A
1dc50 4c 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  LL, and.**      
1dc60 20 20 28 31 37 62 29 20 6e 6f 20 74 65 72 6d 73    (17b) no terms
1dc70 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62 71   within the subq
1dc80 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61  uery compound ma
1dc90 79 20 62 65 20 61 67 67 72 65 67 61 74 65 0a 2a  y be aggregate.*
1dca0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
1dcb0 72 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a  r DISTINCT, and.
1dcc0 2a 2a 20 20 20 20 20 20 20 20 28 31 37 63 29 20  **        (17c) 
1dcd0 65 76 65 72 79 20 74 65 72 6d 20 77 69 74 68 69  every term withi
1dce0 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  n the subquery c
1dcf0 6f 6d 70 6f 75 6e 64 20 6d 75 73 74 20 68 61 76  ompound must hav
1dd00 65 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  e a FROM clause.
1dd10 2a 2a 20 20 20 20 20 20 20 20 28 31 37 64 29 20  **        (17d) 
1dd20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1dd30 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20  may not be.**   
1dd40 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 31             (17d1
1dd50 29 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72 0a  ) aggregate, or.
1dd60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1dd70 28 31 37 64 32 29 20 44 49 53 54 49 4e 43 54 2c  (17d2) DISTINCT,
1dd80 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
1dd90 20 20 20 20 28 31 37 64 33 29 20 61 20 6a 6f 69      (17d3) a joi
1dda0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  n..**.**        
1ddb0 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
1ddc0 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
1ddd0 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
1dde0 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
1ddf0 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
1de00 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
1de10 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
1de20 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
1de30 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
1de40 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
1de50 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62  lauses.  The sub
1de60 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65  query cannot use
1de70 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1de80 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1de90 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
1dea0 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c  N ALL because al
1deb0 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70  l the other comp
1dec0 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1ded0 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e  perators have an
1dee0 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43   implied DISTINC
1def0 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c  T which is disal
1df00 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
1df10 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28     restriction (
1df20 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  4)..**.**       
1df30 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70   Also, each comp
1df40 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62  onent of the sub
1df50 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75  -query must retu
1df60 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  rn the same numb
1df70 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  er.**        of 
1df80 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
1df90 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79  This is actually
1dfa0 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66   a requirement f
1dfb0 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  or any compound.
1dfc0 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1dfd0 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
1dfe0 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72  all the code her
1dff0 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  e does is make s
1e000 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20  ure that no.**  
1e010 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65        such (ille
1e020 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69  gal) sub-query i
1e030 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65  s flattened. The
1e040 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74   caller will det
1e050 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ect the.**      
1e060 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61    syntax error a
1e070 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61  nd return a deta
1e080 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  iled message..**
1e090 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
1e0a0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1e0b0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1e0c0 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
1e0d0 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
1e0e0 20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73    ORDER BY claus
1e0f0 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
1e100 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
1e110 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
1e120 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
1e130 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1e140 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49  ..**.**  (19)  I
1e150 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1e160 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74  ses LIMIT then t
1e170 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1e180 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  ay not.**       
1e190 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
1e1a0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30  ause..**.**  (20
1e1b0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1e1c0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1e1d0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69  d select, then i
1e1e0 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a  t must not use.*
1e1f0 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45  *        an ORDE
1e200 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69  R BY clause.  Ti
1e210 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20  cket #3773.  We 
1e220 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73  could relax this
1e230 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
1e240 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62        somewhat b
1e250 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68  y saying that th
1e260 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  e terms of the O
1e270 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d  RDER BY clause m
1e280 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70  ust.**        ap
1e290 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69  pear as unmodifi
1e2a0 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ed result column
1e2b0 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
1e2c0 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a  uery.  But we.**
1e2d0 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68          have oth
1e2e0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1e2f0 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c   in mind to deal
1e300 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e   with that case.
1e310 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 49 66  .**.**  (21)  If
1e320 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1e330 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68  es LIMIT then th
1e340 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1e350 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20  y not be.**     
1e360 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53     DISTINCT.  (S
1e370 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31  ee ticket [752e1
1e380 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  646fc])..**.**  
1e390 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65  (22)  The subque
1e3a0 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  ry may not be a 
1e3b0 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a  recursive CTE..*
1e3c0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 53 75 62 73  *.**  (**)  Subs
1e3d0 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
1e3e0 63 74 69 6f 6e 20 28 31 37 64 33 29 2e 20 20 57  ction (17d3).  W
1e3f0 61 73 3a 20 49 66 20 74 68 65 20 6f 75 74 65 72  as: If the outer
1e400 20 71 75 65 72 79 20 69 73 0a 2a 2a 20 20 20 20   query is.**    
1e410 20 20 20 20 61 20 72 65 63 75 72 73 69 76 65 20      a recursive 
1e420 43 54 45 2c 20 74 68 65 6e 20 74 68 65 20 73 75  CTE, then the su
1e430 62 2d 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  b-query may not 
1e440 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
1e450 65 72 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54  ery..**        T
1e460 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
1e470 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73  is because trans
1e480 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20  forming the.**  
1e490 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20        parent to 
1e4a0 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
1e4b0 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f   confuses the co
1e4c0 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a  de that handles.
1e4d0 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73  **        recurs
1e4e0 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d  ive queries in m
1e4f0 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ultiSelect()..**
1e500 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1e510 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1e520 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1e530 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1e540 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20    Was:.**       
1e550 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   The subquery ma
1e560 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72  y not be an aggr
1e570 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20  egate that uses 
1e580 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
1e590 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20  () or .**       
1e5a0 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
1e5b0 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74  ons.  (Without t
1e5c0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c  his restriction,
1e5d0 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a   a query like:.*
1e5e0 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  *        "SELECT
1e5f0 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
1e600 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74  max(y), x FROM t
1e610 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65  1)" would not ne
1e620 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20  cessarily.**    
1e630 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76      return the v
1e640 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68  alue X for which
1e650 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29   Y was maximal.)
1e660 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  .**.**.** In thi
1e670 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
1e680 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1e690 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1e6a0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
1e6b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1e6c0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
1e6d0 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
1e6e0 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
1e6f0 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
1e700 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1e710 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1e720 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
1e730 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e740 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
1e750 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
1e760 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
1e770 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
1e780 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
1e790 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
1e7a0 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
1e7b0 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
1e7c0 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
1e7d0 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
1e7e0 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
1e7f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
1e800 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1e810 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
1e820 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1e830 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
1e840 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1e850 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1e860 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1e870 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
1e880 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
1e890 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
1e8a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1e8b0 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
1e8c0 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
1e8d0 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
1e8e0 69 73 41 67 67 20 20 20 20 20 20 20 20 20 20 20  isAgg           
1e8f0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
1e900 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
1e910 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1e920 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
1e930 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
1e940 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
1e950 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
1e960 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
1e970 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  t;    /* Current
1e980 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20   UNION ALL term 
1e990 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71 75 65  of the other que
1e9a0 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ry */.  Select *
1e9b0 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
1e9c0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
1e9d0 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
1e9e0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b    Select *pSub1;
1e9f0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1ea00 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73   to the rightmos
1ea10 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d  t select in sub-
1ea20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
1ea30 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
1ea40 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1ea50 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
1ea60 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1ea70 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
1ea80 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1ea90 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1eaa0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
1eab0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
1eac0 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1ead0 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
1eae0 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
1eaf0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50  e */.  int iNewP
1eb00 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65  arent = -1;/* Re
1eb10 70 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20  placement table 
1eb20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20  for iParent */. 
1eb30 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20   int isLeftJoin 
1eb40 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
1eb50 70 53 75 62 20 69 73 20 74 68 65 20 72 69 67 68  pSub is the righ
1eb60 74 20 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54  t side of a LEFT
1eb70 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69   JOIN */    .  i
1eb80 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1eb90 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1eba0 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
1ebb0 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
1ebc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ebd0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1ebe0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1ebf0 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
1ec00 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
1ec10 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1ec20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1ec30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1ec40 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
1ec50 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1ec60 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
1ec70 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1ec80 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
1ec90 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
1eca0 20 29 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   );.  if( Optimi
1ecb0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
1ecc0 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46  b, SQLITE_QueryF
1ecd0 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75  lattener) ) retu
1ece0 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
1ecf0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1ed00 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
1ed10 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
1ed20 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
1ed30 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
1ed40 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e  iFrom];.  iParen
1ed50 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
1ed60 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20  ursor;.  pSub = 
1ed70 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1ed80 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
1ed90 62 21 3d 30 20 29 3b 0a 0a 20 20 70 53 75 62 53  b!=0 );..  pSubS
1eda0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1edb0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
1edc0 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
1edd0 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
1ede0 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
1edf0 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
1ee00 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
1ee10 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
1ee20 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1ee30 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
1ee40 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
1ee50 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
1ee60 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
1ee70 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
1ee80 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
1ee90 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
1eea0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1eeb0 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
1eec0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1eed0 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
1eee0 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
1eef0 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
1ef00 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
1ef10 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1ef20 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
1ef30 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1ef40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ef50 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
1ef60 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
1ef70 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1efa0 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
1efb0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1efc0 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64  gs & SF_Compound
1efd0 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c  )!=0 && pSub->pL
1efe0 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75  imit ){.    retu
1eff0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f020 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1f030 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
1f040 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
1f050 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1f080 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
1f090 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1f0a0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
1f0b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1f0c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1f0d0 69 6f 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69 66  ion (4)  */.  if
1f0e0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1f0f0 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
1f100 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
1f110 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1f120 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f130 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20  ons (8)(9) */.  
1f140 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
1f150 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
1f160 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
1f170 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f1b0 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
1f1c0 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
1f1d0 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
1f1e0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f1f0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f200 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
1f210 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f220 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
1f230 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f240 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f250 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69  tion (19) */.  i
1f260 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f270 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
1f280 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1f290 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
1f2a0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1f2b0 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20  estriction (21) 
1f2c0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
1f2d0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  b->selFlags & (S
1f2e0 46 5f 52 65 63 75 72 73 69 76 65 29 20 29 7b 0a  F_Recursive) ){.
1f2f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1f300 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32   Restrictions (2
1f310 32 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  2) */.  }..  /*.
1f320 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71    ** If the subq
1f330 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1f340 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
1f350 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74  EFT JOIN, then t
1f360 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1f370 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f   may not be a jo
1f380 69 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20  in itself (3a). 
1f390 45 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74  Example of why t
1f3a0 68 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  his is not.  ** 
1f3b0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1f3c0 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1f3d0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
1f3e0 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
1f3f0 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
1f400 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
1f410 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
1f420 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
1f430 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1f440 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
1f450 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
1f460 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
1f470 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
1f480 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71    ** If the subq
1f490 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1f4a0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
1f4b0 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74  EFT JOIN, then t
1f4c0 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75  he outer.  ** qu
1f4d0 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  ery cannot be an
1f4e0 20 61 67 67 72 65 67 61 74 65 2e 20 28 33 63 29   aggregate. (3c)
1f4f0 20 20 54 68 69 73 20 69 73 20 61 6e 20 61 72 74    This is an art
1f500 69 66 61 63 74 20 6f 66 20 74 68 65 20 77 61 79  ifact of the way
1f510 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73  .  ** aggregates
1f520 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d   are processed -
1f530 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63   there is no mec
1f540 68 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d  hanism to determ
1f550 69 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  ine if.  ** the 
1f560 4c 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20  LEFT JOIN table 
1f570 73 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55  should be all-NU
1f580 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65  LL..  **.  ** Se
1f590 65 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23  e also tickets #
1f5a0 33 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23  306, #350, and #
1f5b0 33 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3300..  */.  if(
1f5c0 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a   (pSubitem->fg.j
1f5d0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1f5e0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73  ER)!=0 ){.    is
1f5f0 4c 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20  LeftJoin = 1;.  
1f600 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
1f610 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c  Src>1 || isAgg |
1f620 7c 20 49 73 56 69 72 74 75 61 6c 28 70 53 75 62  | IsVirtual(pSub
1f630 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20  Src->a[0].pTab) 
1f640 29 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61  ){.      /*  (3a
1f650 29 20 20 20 20 20 20 20 20 20 20 20 20 20 28 33  )             (3
1f660 63 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20  c)     (3b) */. 
1f670 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1f680 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
1f690 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e  SQLITE_EXTRA_IFN
1f6a0 55 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66  ULLROW.  else if
1f6b0 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73  ( iFrom>0 && !is
1f6c0 41 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  Agg ){.    /* Se
1f6d0 74 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e  tting isLeftJoin
1f6e0 20 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50   to -1 causes OP
1f6f0 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64  _IfNullRow opcod
1f700 65 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  es to be generat
1f710 65 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ed for.    ** ev
1f720 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
1f730 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75   any result colu
1f740 6d 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79  mn from subquery
1f750 20 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e   in a join, even
1f760 0a 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74  .    ** though t
1f770 68 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65  hey are not nece
1f780 73 73 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c  ssary.  This wil
1f790 6c 20 73 74 72 65 73 73 2d 74 65 73 74 20 74 68  l stress-test th
1f7a0 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a  e OP_IfNullRow .
1f7b0 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a      ** opcode. *
1f7c0 2f 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e  /.    isLeftJoin
1f7d0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69   = -1;.  }.#endi
1f7e0 66 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  f..  /* Restrict
1f7f0 69 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65  ion (17): If the
1f800 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1f810 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
1f820 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20   then it must.  
1f830 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  ** use only the 
1f840 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1f850 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20  or. And none of 
1f860 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63  the simple selec
1f870 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  t queries.  ** t
1f880 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
1f890 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1f8a0 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  are allowed to b
1f8b0 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64  e aggregate or d
1f8c0 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65  istinct.  ** que
1f8d0 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ries..  */.  if(
1f8e0 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b   pSub->pPrior ){
1f8f0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1f900 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1f910 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52   return 0;  /* R
1f920 65 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20  estriction (20) 
1f930 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
1f940 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65   isAgg || (p->se
1f950 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1f960 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63  inct)!=0 || pSrc
1f970 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20  ->nSrc!=1 ){.   
1f980 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
1f990 28 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20  (17d1), (17d2), 
1f9a0 6f 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20  or (17d3) */.   
1f9b0 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31   }.    for(pSub1
1f9c0 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53  =pSub; pSub1; pS
1f9d0 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f  ub1=pSub1->pPrio
1f9e0 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r){.      testca
1f9f0 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1fa00 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1fa10 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1fa20 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
1fa30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fa40 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
1fa50 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1fa60 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1fa70 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
1fa80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fa90 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29   pSub->pSrc!=0 )
1faa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fab0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
1fac0 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69  xpr==pSub1->pELi
1fad0 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1fae0 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73     if( (pSub1->s
1faf0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1fb00 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1fb10 61 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28  ate))!=0    /* (
1fb20 31 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c  17b) */.       |
1fb30 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  | (pSub1->pPrior
1fb40 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54   && pSub1->op!=T
1fb50 4b 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20  K_ALL)          
1fb60 20 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20         /* (17a) 
1fb70 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  */.       || pSu
1fb80 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31  b1->pSrc->nSrc<1
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20    /* (17c) */.  
1fbc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
1fbd0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1fbe0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fbf0 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
1fc00 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  rc>1 );.    }.. 
1fc10 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1fc20 6e 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69  n (18). */.    i
1fc30 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
1fc40 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
1fc50 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1fc60 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  ii<p->pOrderBy->
1fc70 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
1fc80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
1fc90 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78  derBy->a[ii].u.x
1fca0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20  .iOrderByCol==0 
1fcb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1fcc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1fcd0 20 2f 2a 20 45 78 2d 72 65 73 74 72 69 63 74 69   /* Ex-restricti
1fce0 6f 6e 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54 68  on (23):.  ** Th
1fcf0 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20  e only way that 
1fd00 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61  the recursive pa
1fd10 72 74 20 6f 66 20 61 20 43 54 45 20 63 61 6e 20  rt of a CTE can 
1fd20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f 75  contain a compou
1fd30 6e 64 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  nd.  ** subquery
1fd40 20 69 73 20 66 6f 72 20 74 68 65 20 73 75 62 71   is for the subq
1fd50 75 65 72 79 20 74 6f 20 62 65 20 6f 6e 65 20 74  uery to be one t
1fd60 65 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20  erm of a join.  
1fd70 42 75 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  But if the.  ** 
1fd80 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
1fd90 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 66 6c 61  in, then the fla
1fda0 74 74 65 6e 69 6e 67 20 68 61 73 20 61 6c 72 65  ttening has alre
1fdb0 61 64 79 20 62 65 65 6e 20 73 74 6f 70 70 65 64  ady been stopped
1fdc0 20 62 79 0a 20 20 2a 2a 20 72 65 73 74 72 69 63   by.  ** restric
1fdd0 74 69 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a 2f  tion (17d3).  */
1fde0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
1fdf0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
1fe00 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 53  ursive)==0 || pS
1fe10 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b  ub->pPrior==0 );
1fe20 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
1fe30 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1fe40 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
1fe50 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
1fe60 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  */.  SELECTTRACE
1fe70 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c  (1,pParse,p,("fl
1fe80 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d  atten %s.%p from
1fe90 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20   term %d\n",.   
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20  pSub->zSelName, 
1fec0 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a  pSub, iFrom));..
1fed0 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
1fee0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1fef0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1ff00 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
1ff10 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f  ->zName;.  TESTO
1ff20 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33  NLY(i =) sqlite3
1ff30 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1ff40 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
1ff50 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73   0, 0, 0);.  tes
1ff60 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45  tcase( i==SQLITE
1ff70 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73  _DENY );.  pPars
1ff80 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1ff90 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
1ffa0 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
1ffb0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1ffc0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1ffd0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
1ffe0 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
1fff0 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
20000 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
20010 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
20020 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
20030 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
20040 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
20050 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
20060 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
20070 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
20080 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
20090 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
200a0 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
200b0 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
200c0 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
200d0 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
200e0 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20   ** creates N-1 
200f0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
20100 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
20110 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
20120 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
20130 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
20140 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
20150 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
20160 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
20170 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
20180 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
20190 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
201a0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
201b0 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
201c0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
201d0 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
201e0 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
201f0 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  *.  ** Example:.
20200 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
20210 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a  LECT a+1 FROM (.
20220 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
20230 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT x FROM tab.  
20240 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
20250 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
20260 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61  SELECT y FROM ta
20270 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
20280 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
20290 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
202a0 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20  *2) FROM tab2.  
202b0 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61  **     ) WHERE a
202c0 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20  !=5 ORDER BY 1. 
202d0 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f   **.  ** Transfo
202e0 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rmed into:.  **.
202f0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
20300 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  x+1 FROM tab WHE
20310 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE x+1!=5.  **  
20320 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
20330 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31  *     SELECT y+1
20340 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
20350 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  y+1!=5.  **     
20360 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
20370 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
20380 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57  2)+1 FROM tab2 W
20390 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21  HERE abs(z*2)+1!
203a0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45  =5.  **     ORDE
203b0 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
203c0 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68   We call this th
203d0 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  e "compound-subq
203e0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22  uery flattening"
203f0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75  ..  */.  for(pSu
20400 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  b=pSub->pPrior; 
20410 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d  pSub; pSub=pSub-
20420 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65  >pPrior){.    Se
20430 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  lect *pNew;.    
20440 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
20450 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
20460 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d  ;.    Expr *pLim
20470 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
20480 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65      Expr *pOffse
20490 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
204a0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
204b0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
204c0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
204d0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  = 0;.    p->pSrc
204e0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72   = 0;.    p->pPr
204f0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ior = 0;.    p->
20500 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
20510 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
20520 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
20530 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
20540 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
20550 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
20560 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c  pNew, pSub->zSel
20570 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  Name);.    p->pO
20580 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
20590 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
205a0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
205b0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
205c0 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
205d0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
205e0 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
205f0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
20600 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
20610 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
20620 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
20630 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
20640 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
20650 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
20660 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
20670 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
20680 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
20690 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
206a0 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
206b0 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20  arse,p,.        
206c0 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   ("compound-subq
206d0 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63  uery flattener c
206e0 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
206f0 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  peer\n",.       
20700 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
20710 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
20720 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
20730 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
20740 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
20750 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
20760 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
20770 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
20780 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
20790 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
207a0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
207b0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
207c0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
207d0 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
207e0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
207f0 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
20800 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
20810 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
20820 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20830 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
20840 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
20850 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
20860 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
20870 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20880 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
20890 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
208a0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
208b0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
208c0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
208d0 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
208e0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
208f0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
20900 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
20910 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
20920 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
20930 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
20940 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
20950 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
20960 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
20970 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
20980 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
20990 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
209a0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
209b0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
209c0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
209d0 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
209e0 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
209f0 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
20a00 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
20a10 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
20a20 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
20a30 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
20a40 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
20a50 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
20a60 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
20a70 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
20a80 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61  ( pTabToDel->nTa
20a90 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  bRef==1 ){.     
20aa0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
20ab0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
20ac0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
20ad0 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
20ae0 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
20af0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
20b00 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
20b10 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
20b20 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
20b30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20b40 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61    pTabToDel->nTa
20b50 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  bRef--;.    }.  
20b60 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
20b70 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
20b80 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
20b90 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
20ba0 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
20bb0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
20bc0 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
20bd0 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
20be0 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
20bf0 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
20c00 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
20c10 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
20c20 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
20c30 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
20c40 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
20c50 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
20c60 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
20c70 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
20c80 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
20c90 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
20ca0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
20cb0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
20cc0 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
20cd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20ce0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
20cf0 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
20d00 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
20d10 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
20d20 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
20d30 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
20d40 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
20d50 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
20d60 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
20d70 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
20d80 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
20d90 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
20da0 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
20db0 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
20dc0 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
20dd0 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
20de0 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
20df0 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
20e00 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
20e10 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
20e20 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
20e30 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
20e40 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
20e50 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
20e60 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
20e70 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
20e80 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
20e90 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
20ea0 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
20eb0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
20ec0 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
20ed0 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
20ee0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
20ef0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
20f00 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
20f10 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
20f20 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
20f30 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
20f40 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
20f50 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
20f60 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
20f70 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
20f80 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
20f90 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
20fa0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
20fb0 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
20fc0 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
20fd0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
20fe0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
20ff0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
21000 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21010 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21020 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
21030 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
21040 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
21050 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
21060 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
21070 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
21080 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
21090 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
210a0 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
210b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
210c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
210d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
210e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
210f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
21100 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
21110 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
21120 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
21130 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
21140 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
21150 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
21160 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
21170 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
21180 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
21190 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
211a0 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
211b0 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
211c0 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
211d0 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
211e0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
211f0 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
21200 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
21210 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
21220 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
21230 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
21240 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
21250 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
21260 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
21270 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
21280 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
21290 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
212a0 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
212b0 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
212c0 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
212d0 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
212e0 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
212f0 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
21300 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
21310 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34  FROM clause to 4
21320 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
21330 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69  he middle slot i
21340 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
21350 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
21360 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20   to make space. 
21370 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77     ** for the tw
21380 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
21390 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
213a0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
213b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
213c0 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
213d0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
213e0 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
213f0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
21400 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
21410 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
21420 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
21430 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
21440 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
21450 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
21460 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
21470 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
21480 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
21490 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
214a0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
214b0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
214c0 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
214d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
214e0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
214f0 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
21500 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
21510 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
21520 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61  i+iFrom].fg.isTa
21530 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
21540 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
21550 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
21560 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61  i];.      iNewPa
21570 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e  rent = pSubSrc->
21580 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
21590 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
215a0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
215b0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
215c0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
215d0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
215e0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
215f0 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
21600 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
21610 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
21620 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
21630 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
21640 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
21650 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
21660 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
21670 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
21680 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
21690 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
216a0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
216b0 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
216c0 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
216d0 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
216e0 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21700 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
21710 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
21720 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
21730 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
21740 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
21750 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
21760 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21770 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
21780 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
21790 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
217a0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
217b0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
217c0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
217d0 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
217e0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
217f0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
21800 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
21810 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
21820 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
21830 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
21840 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
21850 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
21860 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
21870 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
21880 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
21890 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
218a0 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
218b0 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
218c0 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
218d0 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
218e0 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
218f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21900 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
21910 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
21920 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
21930 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
21940 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
21950 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
21960 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
21970 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
21980 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
21990 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
219a0 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
219b0 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
219c0 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
219d0 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
219e0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
219f0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
21a00 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
21a10 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
21a20 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
21a30 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
21a40 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
21a50 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
21a60 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
21a70 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
21a80 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
21a90 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
21aa0 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
21ab0 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
21ac0 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
21ad0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
21ae0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
21af0 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
21b00 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
21b10 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
21b20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
21b30 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
21b40 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
21b50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21b60 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
21b70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
21b80 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f  ert( pSub->pPrio
21b90 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  r==0 );.      pP
21ba0 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
21bb0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
21bc0 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
21bd0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
21be0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
21bf0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
21c00 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
21c10 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e    if( isLeftJoin
21c20 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a  >0 ){.      setJ
21c30 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20  oinExpr(pWhere, 
21c40 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20  iNewParent);.   
21c50 20 7d 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e   }.    pParent->
21c60 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
21c70 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65  ExprAnd(db, pWhe
21c80 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  re, pParent->pWh
21c90 65 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62  ere);.    if( db
21ca0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
21cb0 30 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74  0 ){.      Subst
21cc0 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20  Context x;.     
21cd0 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
21ce0 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
21cf0 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20  le = iParent;.  
21d00 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
21d10 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20  = iNewParent;.  
21d20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e      x.isLeftJoin
21d30 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20   = isLeftJoin;. 
21d40 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20       x.pEList = 
21d50 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  pSub->pEList;.  
21d60 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
21d70 26 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b  &x, pParent, 0);
21d80 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
21d90 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
21da0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
21db0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
21dc0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
21dd0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
21de0 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
21df0 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
21e00 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
21e10 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
21e20 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
21e30 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
21e40 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
21e50 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
21e60 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
21e70 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
21e80 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
21e90 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
21ea0 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
21eb0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
21ec0 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
21ed0 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
21ee0 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
21ef0 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
21f00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21f10 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
21f20 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
21f30 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
21f40 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
21f50 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
21f60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
21f70 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
21f80 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
21f90 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
21fa0 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
21fb0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
21fc0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
21fd0 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69  (db, pSub1);..#i
21fe0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
21ff0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
22000 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
22010 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
22020 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
22030 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
22040 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29   flattening:\n")
22050 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
22060 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
22070 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
22080 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  f..  return 1;.}
22090 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
220a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
220b0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
220c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
220d0 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69  T_VIEW) */....#i
220e0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
220f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
22100 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
22110 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
22120 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73  *.** Make copies
22130 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45   of relevant WHE
22140 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
22150 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
22160 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57  ry into.** the W
22170 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73  HERE clause of s
22180 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c  ubquery.  Exampl
22190 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e:.**.**    SELE
221a0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
221b0 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
221c0 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   y FROM t1) WHER
221d0 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
221e0 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  **.** Transforme
221f0 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  d into:.**.**   
22200 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
22210 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
22220 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20  -d AS y FROM t1 
22230 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d  WHERE a=5 AND c-
22240 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45  d=10).**     WHE
22250 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
22260 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20  .**.** The hope 
22270 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  is that the term
22280 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
22290 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20  nner query will 
222a0 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20  make it more.** 
222b0 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
222c0 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
222d0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
222e0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  n if:.**.**   (1
222f0 29 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74 72  ) (** This restr
22300 69 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76  iction was remov
22310 65 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39  ed on 2017-09-29
22320 2e 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a  .  We used to.**
22330 20 20 20 20 20 20 20 20 20 20 20 64 69 73 61 6c             disal
22340 6c 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  low this optimiz
22350 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65 67  ation for aggreg
22360 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2c 20  ate subqueries, 
22370 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20  but now.**      
22380 20 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f 77       it is allow
22390 65 64 20 62 79 20 70 75 74 74 69 6e 67 20 74 68  ed by putting th
223a0 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
223b0 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
223c0 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
223d0 20 54 68 65 20 61 64 64 65 64 20 48 41 56 49 4e   The added HAVIN
223e0 47 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69 6e  G clause is poin
223f0 74 6c 65 73 73 20 69 66 20 74 68 65 20 73 75 62  tless if the sub
22400 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20  query lacks.**  
22410 20 20 20 20 20 20 20 20 20 61 20 47 52 4f 55 50           a GROUP
22420 20 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75 74   BY clause.  But
22430 20 73 75 63 68 20 61 20 48 41 56 49 4e 47 20 63   such a HAVING c
22440 6c 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68 61  lause is also ha
22450 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 20  rmless.**       
22460 20 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f 65      so there doe
22470 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20  s not appear to 
22480 62 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f  be any reason to
22490 20 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69 63   add extra logic
224a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 6f  .**           to
224b0 20 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a 2a   suppress it. **
224c0 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68  ).**.**   (2) Th
224d0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
224e0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
224f0 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20  art of a common 
22500 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
22510 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68  ..**.**   (3) Th
22520 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61  e inner query ha
22530 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
22540 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e   (since the chan
22550 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  ges to the WHERE
22560 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20  .**       close 
22570 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
22580 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
22590 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
225a0 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
225b0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
225c0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
225d0 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63  FT JOIN.  (The c
225e0 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65  aller.**       e
225f0 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72 65 73  nforces this res
22600 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74  triction since t
22610 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
22620 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68   not have enough
22630 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d  .**       inform
22640 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a  ation to know.).
22650 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
22660 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
22670 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
22680 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
22690 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
226a0 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
226b0 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  JOIN..**.** Retu
226c0 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67  rn 0 if no chang
226d0 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20  es are made and 
226e0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20  non-zero if one 
226f0 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c  or more WHERE cl
22700 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72  ause.** terms ar
22710 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74  e duplicated int
22720 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  o the subquery..
22730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75  */.static int pu
22740 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
22750 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
22760 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
22770 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20  se context (for 
22780 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72  malloc() and err
22790 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f  or reporting) */
227a0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
227b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
227c0 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20 57  subquery whose W
227d0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
227e0 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a  o be augmented *
227f0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
22800 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
22810 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
22820 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
22830 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f   */.  int iCurso
22840 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  r           /* C
22850 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
22860 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
22870 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
22880 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
22890 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d  ;.  if( pWhere==
228a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
228b0 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
228c0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
228d0 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ve ) return 0;  
228e0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
228f0 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  2) */..#ifdef SQ
22900 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
22910 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 74  Only the first t
22920 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
22930 64 20 63 61 6e 20 68 61 76 65 20 61 20 57 49 54  d can have a WIT
22940 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 6d  H clause.  But m
22950 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f  ake.  ** sure no
22960 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61 72 65   other terms are
22970 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63 75 72   marked SF_Recur
22980 73 69 76 65 20 69 6e 20 63 61 73 65 20 73 6f 6d  sive in case som
22990 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 0a 20  ething changes. 
229a0 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74 75 72   ** in the futur
229b0 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  e..  */.  {.    
229c0 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20 20  Select *pX;  .  
229d0 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20    for(pX=pSubq; 
229e0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  pX; pX=pX->pPrio
229f0 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r){.      assert
22a00 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20  ( (pX->selFlags 
22a10 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 29  & (SF_Recursive)
22a20 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  )==0 );.    }.  
22a30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
22a40 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
22a50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
22a60 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
22a70 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68   (3) */.  }.  wh
22a80 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
22a90 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e  =TK_AND ){.    n
22aa0 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e  Chng += pushDown
22ab0 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
22ac0 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  e, pSubq, pWhere
22ad0 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f  ->pRight, iCurso
22ae0 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  r);.    pWhere =
22af0 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
22b00 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61    }.  if( ExprHa
22b10 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
22b20 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20  ,EP_FromJoin) ) 
22b30 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
22b40 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a  triction (5) */.
22b50 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22b60 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
22b70 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72  (pWhere, iCursor
22b80 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b  ) ){.    nChng++
22b90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75  ;.    while( pSu
22ba0 62 71 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73  bq ){.      Subs
22bb0 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20  tContext x;.    
22bc0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
22bd0 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
22be0 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  db, pWhere, 0);.
22bf0 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
22c00 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
22c10 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f  .iTable = iCurso
22c20 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54  r;.      x.iNewT
22c30 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
22c40 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f        x.isLeftJo
22c50 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e  in = 0;.      x.
22c60 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71 2d 3e  pEList = pSubq->
22c70 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4e  pEList;.      pN
22c80 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 26  ew = substExpr(&
22c90 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  x, pNew);.      
22ca0 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
22cb0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
22cc0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  te ){.        pS
22cd0 75 62 71 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ubq->pHaving = s
22ce0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
22cf0 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d  arse->db, pSubq-
22d00 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b  >pHaving, pNew);
22d10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22d20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68        pSubq->pWh
22d30 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
22d40 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
22d50 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20   pSubq->pWhere, 
22d60 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
22d70 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75       pSubq = pSu
22d80 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  bq->pPrior;.    
22d90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
22da0 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Chng;.}.#endif /
22db0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
22dc0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
22dd0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
22de0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
22df0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75  /../*.** The pFu
22e00 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  nc is the only a
22e10 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22e20 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  n in the query. 
22e30 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a   Check to see.**
22e40 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
22e50 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
22e60 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
22e70 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  imization. .**.*
22e80 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
22e90 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
22ea0 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
22eb0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e  timization, then
22ec0 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61   set.** *ppMinMa
22ed0 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44 45 52  x to be an ORDER
22ee0 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
22ef0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6f 70   used for the op
22f00 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  timization.** an
22f10 64 20 72 65 74 75 72 6e 20 65 69 74 68 65 72 20  d return either 
22f20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
22f30 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
22f40 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69 6e 67  BY_MAX depending
22f50 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72 20 70   on.** whether p
22f60 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28 29 20  Func is a min() 
22f70 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
22f80 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
22f90 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
22fa0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
22fb0 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
22fc0 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a  ation, return.**
22fd0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
22fe0 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d 75 73  ORMAL (which mus
22ff0 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a  t be zero)..**.*
23000 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
23010 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66  ust be called af
23020 74 65 72 20 61 67 67 72 65 67 61 74 65 20 66 75  ter aggregate fu
23030 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  nctions have bee
23040 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62 75 74  n.** located but
23050 20 62 65 66 6f 72 65 20 74 68 65 69 72 20 61 72   before their ar
23060 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65  guments have bee
23070 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f 20 61  n subjected to a
23080 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c  ggregate.** anal
23090 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ysis..*/.static 
230a0 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 73  u8 minMaxQuery(s
230b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
230c0 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c 69 73   *pFunc, ExprLis
230d0 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20  t **ppMinMax){. 
230e0 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52   int eRet = WHER
230f0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
23100 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
23110 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72   value */.  Expr
23120 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
23130 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Func->x.pList;  
23140 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
23150 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a  o agg function *
23160 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23170 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20  zFunc;          
23180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
23190 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
231a0 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f  unction pFunc */
231b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
231c0 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f 72 74  derBy;.  u8 sort
231d0 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Order;..  assert
231e0 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29  ( *ppMinMax==0 )
231f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 75 6e  ;.  assert( pFun
23200 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  c->op==TK_AGG_FU
23210 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20  NCTION );.  if( 
23220 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c  pEList==0 || pEL
23230 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
23240 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a  return eRet;.  z
23250 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e  Func = pFunc->u.
23260 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71  zToken;.  if( sq
23270 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
23280 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
23290 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
232a0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
232b0 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
232c0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20  QLITE_SO_ASC;.  
232d0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
232e0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
232f0 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
23300 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
23310 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73  DERBY_MAX;.    s
23320 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
23330 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c  E_SO_DESC;.  }el
23340 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65  se{.    return e
23350 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69  Ret;.  }.  *ppMi
23360 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42 79 20  nMax = pOrderBy 
23370 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
23380 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
23390 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
233a0 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 64 62  OrderBy!=0 || db
233b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
233c0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
233d0 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30   ) pOrderBy->a[0
233e0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
233f0 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74 75 72  rtOrder;.  retur
23400 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n eRet;.}../*.**
23410 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
23420 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
23430 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
23440 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  nt is an aggrega
23450 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  te query..** The
23460 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23470 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
23480 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
23490 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
234a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
234b0 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
234c0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
234d0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
234e0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
234f0 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
23500 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
23510 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
23520 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
23530 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
23540 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
23550 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
23560 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
23570 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
23580 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
23590 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
235a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
235b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
235c0 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
235d0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
235e0 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
235f0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
23600 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
23610 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
23620 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
23630 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
23640 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
23650 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
23660 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
23670 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
23680 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
23690 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
236a0 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
236b0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
236c0 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
236d0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
236e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
236f0 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
23700 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
23710 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
23720 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
23730 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
23740 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
23750 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
23760 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49   if( NEVER(pAggI
23770 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29  nfo->nFunc==0) )
23780 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
23790 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   (pAggInfo->aFun
237a0 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  c[0].pFunc->func
237b0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
237c0 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
237d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
237e0 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
237f0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
23800 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
23810 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
23820 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
23830 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
23840 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
23850 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
23860 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
23870 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
23880 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
23890 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
238a0 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
238b0 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
238c0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
238d0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
238e0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
238f0 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
23900 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
23910 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
23920 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
23930 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
23940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23950 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
23960 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
23970 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23980 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
23990 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
239a0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
239b0 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e  & pFrom->fg.isIn
239c0 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54  dexedBy ){.    T
239d0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
239e0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
239f0 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d  ar *zIndexedBy =
23a00 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pFrom->u1.zInde
23a10 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78  xedBy;.    Index
23a20 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
23a30 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
23a40 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
23a50 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
23a60 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
23a70 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20  zIndexedBy); .  
23a80 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
23a90 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
23aa0 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
23ab0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23ac0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
23ad0 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
23ae0 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29  , zIndexedBy, 0)
23af0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
23b00 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
23b10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23b20 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
23b30 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42  }.    pFrom->pIB
23b40 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
23b50 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
23b60 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
23b70 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
23b80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
23b90 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
23ba0 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
23bb0 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
23bc0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
23bd0 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
23be0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
23bf0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
23c00 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
23c10 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
23c20 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
23c30 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
23c40 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
23c50 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
23c60 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
23c70 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
23c80 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
23c90 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
23ca0 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
23cb0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
23cc0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
23cd0 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
23ce0 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
23cf0 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
23d00 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
23d10 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
23d20 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
23d30 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
23d40 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
23d50 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
23d60 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
23d70 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
23d80 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
23d90 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
23da0 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
23db0 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
23dc0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
23dd0 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
23de0 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
23df0 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
23e00 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
23e10 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
23e20 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
23e30 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
23e40 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
23e50 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
23e60 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
23e70 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
23e80 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
23e90 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
23ea0 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
23eb0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
23ec0 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
23ed0 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
23ee0 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
23ef0 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
23f00 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
23f10 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
23f20 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
23f30 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
23f40 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
23f50 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
23f60 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
23f70 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
23f80 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
23f90 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
23fa0 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
23fb0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23fc0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
23fd0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
23fe0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
23ff0 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
24000 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
24010 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
24020 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
24030 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
24040 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
24050 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
24060 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
24070 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
24080 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
24090 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
240a0 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
240b0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
240c0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
240d0 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
240e0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
240f0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
24100 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
24110 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
24120 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
24130 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
24140 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
24150 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
24160 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
24170 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
24180 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
24190 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
241a0 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
241b0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
241c0 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
241d0 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
241e0 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
241f0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
24200 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
24210 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
24220 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
24230 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
24240 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
24250 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
24260 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
24270 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
24280 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
24290 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
242a0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
242b0 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29   TK_ASTERISK, 0)
242c0 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
242d0 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
242e0 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
242f0 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
24300 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
24310 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
24320 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
24330 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  Prior = 0;.  p->
24340 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  pNext = 0;.  p->
24350 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  pWith = 0;.  p->
24360 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
24370 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65  Compound;.  asse
24380 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
24390 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29   & SF_Converted)
243a0 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
243b0 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65  lags |= SF_Conve
243c0 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  rted;.  assert( 
243d0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
243e0 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
243f0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
24400 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
24410 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  = 0;.  pNew->pOf
24420 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  fset = 0;.  retu
24430 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
24440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
24450 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52  to see if the FR
24460 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
24470 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76  From has table-v
24480 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a  alued function.*
24490 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66  * arguments.  If
244a0 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20   it does, leave 
244b0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
244c0 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
244d0 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
244e0 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69  o, since pFrom i
244f0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
24500 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75   be a table-valu
24510 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed function..*/.
24520 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f  static int canno
24530 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  tBeFunction(Pars
24540 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
24550 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24560 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
24570 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  rom->fg.isTabFun
24580 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
24590 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
245a0 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20   "'%s' is not a 
245b0 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d  function", pFrom
245c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
245d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
245e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
245f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
24600 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  TE./*.** Argumen
24610 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d  t pWith (which m
24620 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e  ay be NULL) poin
24630 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c  ts to a linked l
24640 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a  ist of nested .*
24650 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c  * WITH contexts,
24660 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f   from inner to o
24670 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65  utermost. If the
24680 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
24690 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c  d by .** FROM cl
246a0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74  ause element pIt
246b0 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63  em is really a c
246c0 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72  ommon-table-expr
246d0 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a  ession (CTE) .**
246e0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
246f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54  ointer to the CT
24700 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  E definition for
24710 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68   that table. Oth
24720 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
24730 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
24740 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
24750 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65   is returned, se
24760 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20  t *ppContext to 
24770 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74  point to the Wit
24780 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  h.** object that
24790 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54   the returned CT
247a0 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f  E belongs to..*/
247b0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43  .static struct C
247c0 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a  te *searchWith(.
247d0 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247f0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e    /* Current inn
24800 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  ermost WITH clau
24810 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
24820 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
24830 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  em,     /* FROM 
24840 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74  clause element t
24850 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57  o resolve */.  W
24860 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20  ith **ppContext 
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24880 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75  * OUT: WITH clau
24890 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  se return value 
248a0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b  belongs to */.){
248b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
248c0 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65  Name;.  if( pIte
248d0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
248e0 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65  && (zName = pIte
248f0 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  m->zName)!=0 ){.
24900 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20      With *p;.   
24910 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b   for(p=pWith; p;
24920 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20   p=p->pOuter){. 
24930 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
24940 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
24950 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
24960 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
24970 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d  trICmp(zName, p-
24980 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
24990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  ){.          *pp
249a0 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20  Context = p;.   
249b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70         return &p
249c0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
249d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
249e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
249f0 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67  }../* The code g
24a00 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69  enerator maintai
24a10 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63  ns a stack of ac
24a20 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65  tive WITH clause
24a30 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  s.** with the in
24a40 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c  ner-most WITH cl
24a50 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68  ause being at th
24a60 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
24a70 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
24a80 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68  outine pushes th
24a90 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61  e WITH clause pa
24aa0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
24ab0 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f  nd argument.** o
24ac0 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74  nto the top of t
24ad0 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67  he stack. If arg
24ae0 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74  ument bFree is t
24af0 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  rue, then this.*
24b00 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69  * WITH clause wi
24b10 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70  ll never be popp
24b20 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
24b30 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
24b40 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  it.** should be 
24b50 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  freed along with
24b60 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
24b70 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65  t. In other case
24b80 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65  s, when.** bFree
24b90 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62  ==0, the With ob
24ba0 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65  ject will be fre
24bb0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
24bc0 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61  e SELECT .** sta
24bd0 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63  tement with whic
24be0 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74  h it is associat
24bf0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
24c00 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73  te3WithPush(Pars
24c10 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20  e *pParse, With 
24c20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65  *pWith, u8 bFree
24c30 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72  ){.  assert( bFr
24c40 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  ee==0 || (pParse
24c50 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50  ->pWith==0 && pP
24c60 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
24c70 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  e==0) );.  if( p
24c80 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65  With ){.    asse
24c90 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
24ca0 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h!=pWith );.    
24cb0 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20  pWith->pOuter = 
24cc0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
24cd0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
24ce0 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
24cf0 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65  ( bFree ) pParse
24d00 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20  ->pWithToFree = 
24d10 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pWith;.  }.}../*
24d20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24d30 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
24d40 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
24d50 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
24d60 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
24d70 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
24d80 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
24d90 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
24da0 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
24db0 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
24dc0 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
24dd0 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
24de0 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
24df0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
24e00 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
24e10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
24e20 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
24e30 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
24e40 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
24e50 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
24e60 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
24e70 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
24e80 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
24e90 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
24ea0 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
24eb0 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
24ec0 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
24ed0 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
24ee0 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
24ef0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
24f00 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
24f10 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
24f20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24f30 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
24f40 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
24f50 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
24f60 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
24f70 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
24f80 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
24f90 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
24fa0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
24fb0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
24fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
24fd0 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
24fe0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
24ff0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
25000 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
25010 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
25020 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
25030 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
25040 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
25050 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25070 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
25080 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
25090 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
250a0 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
250b0 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
250c0 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
250d0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
250e0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
250f0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
25100 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
25110 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
25120 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
25130 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
25140 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
25150 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
25160 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
25170 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
25180 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
25190 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
251a0 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
251b0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
251c0 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
251d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
251e0 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
251f0 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
25200 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
25210 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
25220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25230 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
25240 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
25250 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
25260 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d  >zCteErr is non-
25270 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
25280 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
25290 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
252a0 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
252b0 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
252c0 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
252d0 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
252e0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
252f0 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
25300 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  CteErr is NULL, 
25310 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
25320 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
25330 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
25340 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
25350 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
25360 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  ( pCte->zCteErr 
25370 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25380 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25390 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20   pCte->zCteErr, 
253a0 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
253b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
253c0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
253d0 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46     if( cannotBeF
253e0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
253f0 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
25400 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
25410 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
25420 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
25430 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
25440 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
25450 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
25460 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
25470 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
25480 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
25490 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62  ;.    pTab->nTab
254a0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
254b0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
254c0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
254d0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
254e0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
254f0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
25500 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
25510 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
25520 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
25530 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  6) );.    pTab->
25540 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
25550 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f  phemeral | TF_No
25560 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
25570 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
25580 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
25590 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  Dup(db, pCte->pS
255a0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
255b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
255c0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
255d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
255e0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
255f0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  m->pSelect );.. 
25600 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
25610 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
25620 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70  ve CTE. */.    p
25630 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
25640 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65  lect;.    bMayRe
25650 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c  cursive = ( pSel
25660 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
25670 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  pSel->op==TK_UNI
25680 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  ON );.    if( bM
25690 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
256a0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
256b0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
256c0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
256d0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  ->pSrc;.      fo
256e0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
256f0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
25700 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
25710 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
25720 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pSrc->a[i];.   
25730 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
25740 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20  zDatabase==0 .  
25750 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
25760 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20  >zName!=0 .     
25770 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
25780 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e  3StrICmp(pItem->
25790 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61  zName, pCte->zNa
257a0 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  me).          ){
257b0 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
257c0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
257d0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
257e0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d  fg.isRecursive =
257f0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
25800 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
25810 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73           pSel->s
25820 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
25830 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20  cursive;.       
25840 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
25850 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  ..    /* Only on
25860 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
25870 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74  rence is permitt
25880 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20  ed. */ .    if( 
25890 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20  pTab->nTabRef>2 
258a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
258b0 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
258c0 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
258d0 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
258e0 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
258f0 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
25900 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
25910 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25920 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
25930 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
25940 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20  ->nTabRef==1 || 
25950 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70  .            ((p
25960 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
25970 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
25980 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20  Tab->nTabRef==2 
25990 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
259a0 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c  CteErr = "circul
259b0 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73  ar reference: %s
259c0 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74  ";.    pSavedWit
259d0 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  h = pParse->pWit
259e0 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
259f0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
25a00 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
25a10 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ive ){.      Sel
25a20 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53  ect *pPrior = pS
25a30 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
25a40 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
25a50 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
25a60 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74      pPrior->pWit
25a70 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b  h = pSel->pWith;
25a80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
25a90 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
25aa0 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20  , pPrior);.     
25ab0 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
25ac0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
25ad0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25ae0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
25af0 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
25b00 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25b10 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72   pWith;..    for
25b20 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
25b30 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
25b40 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
25b50 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
25b60 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
25b70 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
25b80 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
25b90 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
25ba0 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
25bb0 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
25bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25bd0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
25be0 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
25bf0 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
25c00 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
25c10 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
25c20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
25c30 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
25c40 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
25c50 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
25c60 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
25c70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
25c80 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25c90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
25ca0 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
25cb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
25cc0 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
25cd0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
25ce0 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
25cf0 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
25d00 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
25d10 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
25d20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46    if( pSel->selF
25d30 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
25d40 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ive ){.        p
25d50 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
25d60 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
25d70 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25  ve references: %
25d80 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
25d90 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
25da0 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73  CteErr = "recurs
25db0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e  ive reference in
25dc0 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22   a subquery: %s"
25dd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25de0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25df0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
25e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65  ;.    }.    pCte
25e10 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ->zCteErr = 0;. 
25e20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
25e30 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
25e40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
25e50 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
25e60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25e70 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
25e80 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61  If the SELECT pa
25e90 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
25ea0 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  nd argument has 
25eb0 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49  an associated WI
25ec0 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70  TH .** clause, p
25ed0 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73  op it from the s
25ee0 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70  tack stored as p
25ef0 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65  art of the Parse
25f00 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
25f10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25f20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c  used as the xSel
25f30 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63  ectCallback2() c
25f40 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71  allback by.** sq
25f50 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
25f60 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67  d() when walking
25f70 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74   a SELECT tree t
25f80 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a  o resolve table.
25f90 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68  ** names and oth
25fa0 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  er FROM clause e
25fb0 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61  lements. .*/.sta
25fc0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50  tic void selectP
25fd0 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70  opWith(Walker *p
25fe0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
25ff0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
26000 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
26010 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
26020 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
26030 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26 26  Parse->pWith) &&
26040 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
26050 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68  .    With *pWith
26060 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
26070 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  (p)->pWith;.    
26080 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
26090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
260a0 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
260b0 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  th );.      pPar
260c0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
260d0 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d  h->pOuter;.    }
260e0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
260f0 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
26100 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
26110 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26120 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
26130 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
26140 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
26150 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
26160 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
26170 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
26180 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
26190 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
261a0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
261b0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
261c0 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
261d0 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
261e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
261f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
26200 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
26210 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
26220 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
26230 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
26240 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
26250 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
26260 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
26270 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
26280 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
26290 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
262a0 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
262b0 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
262c0 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
262d0 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
262e0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
262f0 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
26300 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
26310 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
26320 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
26330 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
26340 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
26350 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
26360 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
26370 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
26380 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
26390 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70  e persistent rep
263a0 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
263b0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
263c0 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
263d0 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
263e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
263f0 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
26400 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
26410 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
26420 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
26430 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
26440 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
26450 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
26460 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
26470 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
26480 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
26490 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
264a0 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
264b0 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
264c0 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
264d0 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
264e0 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
264f0 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
26500 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
26510 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
26520 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
26530 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
26540 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
26550 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
26560 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
26570 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
26580 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
26590 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
265a0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
265b0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
265c0 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
265d0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
265e0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
265f0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
26600 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
26610 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
26620 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
26630 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
26640 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
26650 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
26660 61 67 73 3b 0a 20 20 75 33 32 20 65 6c 69 73 74  ags;.  u32 elist
26670 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d  Flags = 0;..  p-
26680 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
26690 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20  Expanded;.  if( 
266a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
266b0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
266c0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
266d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
266e0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 73 65  !=0 );.  if( (se
266f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
26700 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
26710 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
26720 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
26730 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
26740 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
26750 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  ;.  if( OK_IF_AL
26760 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70 57 69  WAYS_TRUE(p->pWi
26770 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  th) ){.    sqlit
26780 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
26790 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b  e, p->pWith, 0);
267a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
267b0 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
267c0 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
267d0 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
267e0 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
267f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
26800 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
26810 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
26820 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
26830 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
26840 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
26850 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
26860 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
26870 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
26880 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
26890 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
268a0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
268b0 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
268c0 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
268d0 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
268e0 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
268f0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
26900 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
26910 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
26920 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
26930 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
26940 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
26950 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
26960 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
26970 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
26980 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e  sert( pFrom->fg.
26990 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c  isRecursive==0 |
269a0 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  | pFrom->pTab!=0
269b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
269c0 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  m->fg.isRecursiv
269d0 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
269e0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
269f0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e  >pTab==0 );.#ifn
26a00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26a10 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68  CTE.    if( with
26a20 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20  Expand(pWalker, 
26a30 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
26a40 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69  WRC_Abort;.    i
26a50 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  f( pFrom->pTab )
26a60 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a   {} else.#endif.
26a70 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
26a80 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
26a90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
26aa0 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
26ab0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
26ac0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
26ad0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
26ae0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
26af0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
26b00 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
26b10 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
26b20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26b30 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
26b40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61     if( sqlite3Wa
26b50 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
26b60 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e  , pSel) ) return
26b70 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
26b80 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
26b90 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
26ba0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
26bb0 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
26bc0 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
26bd0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
26be0 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
26bf0 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
26c00 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
26c10 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
26c20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
26c30 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
26c40 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  b, pFrom->zAlias
26c50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
26c60 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
26c70 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
26c80 69 6e 74 66 28 64 62 2c 20 22 73 75 62 71 75 65  intf(db, "subque
26c90 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70  ry_%p", (void*)p
26ca0 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
26cb0 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
26cc0 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
26cd0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
26ce0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  }.      sqlite3C
26cf0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
26d00 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
26d10 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
26d20 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
26d30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
26d40 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
26d50 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
26d60 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
26d70 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
26d80 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
26d90 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
26da0 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
26db0 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
26dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
26dd0 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
26de0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
26df0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
26e00 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
26e10 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
26e20 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
26e30 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
26e40 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
26e50 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
26e60 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
26e70 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
26e80 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26e90 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
26ea0 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20  nTabRef>=0xffff 
26eb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26ec0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26ed0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
26ee0 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
26ef0 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
26f00 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
26f10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
26f20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
26f30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
26f40 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26f50 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
26f60 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
26f70 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
26f80 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65  Tab) && cannotBe
26f90 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
26fa0 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
26fb0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
26fc0 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ort;.      }.#if
26fd0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
26fe0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
26ff0 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
27000 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
27010 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  E).      if( IsV
27020 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20  irtual(pTab) || 
27030 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
27040 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f  .        i16 nCo
27050 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  l;.        if( s
27060 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
27070 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
27080 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
27090 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
270a0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
270b0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
270c0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
270d0 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
270e0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
270f0 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
27100 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27110 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46  SelectSetName(pF
27120 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54  rom->pSelect, pT
27130 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
27140 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d      nCol = pTab-
27150 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
27160 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  Tab->nCol = -1;.
27170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
27180 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
27190 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
271a0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  t);.        pTab
271b0 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
271c0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
271d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
271e0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
271f0 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
27200 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
27210 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
27220 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
27230 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
27240 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
27250 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
27260 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
27270 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
27280 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
27290 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
272a0 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
272b0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
272c0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
272d0 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
272e0 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
272f0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
27300 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
27310 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
27320 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
27330 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
27340 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
27350 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
27360 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
27370 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
27380 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
27390 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
273a0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
273b0 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
273c0 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
273d0 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
273e0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
273f0 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f  ASTERISK operato
27400 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
27410 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
27420 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  the column.  ** 
27430 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  list.  The follo
27440 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
27450 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
27460 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a   TK_ASTERISK.  *
27470 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  * expressions an
27480 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e  d expand each on
27490 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
274a0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a   all columns in.
274b0 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e    ** all tables.
274c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
274d0 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
274e0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
274f0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
27500 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
27510 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
27520 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
27530 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
27540 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
27550 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
27560 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
27570 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ( pE->op==TK_AST
27580 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
27590 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
275a0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
275b0 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
275c0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
275d0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
275e0 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
275f0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
27600 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
27610 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
27620 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
27630 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
27640 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74 46 6c  eak;.    elistFl
27650 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73  ags |= pE->flags
27660 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
27670 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
27680 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
27690 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
276a0 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
276b0 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
276c0 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
276d0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
276e0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
276f0 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
27700 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
27710 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
27720 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
27730 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
27740 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
27750 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
27760 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
27770 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
27780 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
27790 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
277a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
277b0 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
277c0 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
277d0 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
277e0 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27800 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
27810 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
27820 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
27830 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
27840 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
27850 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
27860 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74 46 6c  r;.      elistFl
27870 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73  ags |= pE->flags
27880 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
27890 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20   pE->pRight;.   
278a0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
278b0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
278c0 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght!=0 );.      
278d0 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41  if( pE->op!=TK_A
278e0 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26  STERISK.       &
278f0 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
27900 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21  T || pRight->op!
27910 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20  =TK_ASTERISK).  
27920 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
27930 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
27940 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
27950 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
27960 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
27970 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
27980 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
27990 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
279a0 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
279b0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
279c0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
279d0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
279e0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
279f0 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
27a00 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
27a10 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
27a20 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
27a30 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
27a40 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
27a50 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
27a60 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
27a70 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
27a80 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
27a90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
27aa0 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
27ab0 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
27ac0 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
27ad0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
27ae0 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
27af0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
27b00 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
27b10 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
27b20 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
27b30 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
27b40 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20   *zTName = 0;   
27b50 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
27b60 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
27b70 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
27b80 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
27b90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27ba0 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a  pE->pLeft!=0 );.
27bb0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27bc0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
27bd0 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50  ty(pE->pLeft, EP
27be0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
27bf0 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
27c00 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54   pE->pLeft->u.zT
27c10 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oken;.        }.
27c20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
27c30 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
27c40 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
27c50 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
27c60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
27c70 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
27c80 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
27c90 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
27ca0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
27cb0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  t;.          cha
27cc0 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
27cd0 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
27ce0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
27cf0 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d  r *zSchemaName =
27d00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
27d10 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
27d20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
27d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27d40 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
27d50 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
27d60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
27d70 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
27d80 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ed ) break;.    
27d90 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d        if( pSub==
27da0 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46  0 || (pSub->selF
27db0 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
27dc0 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  From)==0 ){.    
27dd0 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30          pSub = 0
27de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27df0 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
27e00 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
27e10 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
27e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27e30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
27e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27e50 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
27e60 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
27e70 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
27e80 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
27e90 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44  zSchemaName = iD
27ea0 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69  b>=0 ? db->aDb[i
27eb0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22  Db].zDbSName : "
27ec0 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  *";.          }.
27ed0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
27ee0 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
27ef0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
27f00 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
27f10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
27f20 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
27f30 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
27f40 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
27f50 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
27f60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
27f70 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
27f80 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
27f90 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
27fa0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
27fb0 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
27fc0 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
27fd0 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
27fe0 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
28000 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20  rt( zName );.   
28010 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
28020 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20  ame && pSub.    
28030 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
28040 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65  te3MatchSpanName
28050 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61  (pSub->pEList->a
28060 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54  [j].zSpan, 0, zT
28070 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20  Name, 0)==0.    
28080 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
28090 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
280a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
280b0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
280c0 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
280d0 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
280e0 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d  n', omit it from
280f0 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
28100 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
28110 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c  ult-set list unl
28120 65 73 73 20 74 68 65 20 53 45 4c 45 43 54 20 68  ess the SELECT h
28130 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64  as the SF_Includ
28140 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20  eHidden.        
28150 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a      ** bit set..
28160 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
28170 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
28180 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
28190 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d  _IncludeHidden)=
281a0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
281b0 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  && IsHiddenColum
281c0 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
281d0 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
281e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
281f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
28200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28210 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
28220 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
28230 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
28240 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
28250 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d        if( (pFrom
28260 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
28270 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
28290 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
282a0 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
282b0 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
282d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
282e0 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
282f0 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
28300 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
28310 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
28320 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
28330 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
28340 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
28350 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
28360 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
28370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28380 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
28390 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
283a0 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
283b0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
283c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
283d0 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
283e0 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
283f0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
28410 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
28420 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
28430 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
28450 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
28460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
28480 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
28490 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
284a0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
284b0 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
284c0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
284d0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
284e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
284f0 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
28500 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
28510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
28520 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
28530 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
28540 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
28550 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
28560 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28570 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
28580 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
28590 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
285a0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
285b0 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61       if( zSchema
285c0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
285d0 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
285e0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
285f0 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61  TK_ID, zSchemaNa
28600 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
28610 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
28620 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
28630 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
28640 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
28650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28660 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
28670 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
28680 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
28690 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
286a0 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
286b0 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  TabName, zName);
286c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
286d0 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e   zToFree = zColn
286e0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
286f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
28700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28710 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
28720 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
28730 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
28740 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
28750 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
28760 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
28770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
28780 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
28790 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e  &sColname, zColn
287a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
287b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
287c0 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
287d0 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65   pNew, &sColname
287e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
287f0 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70    if( pNew && (p
28800 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
28810 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29  NestedFrom)!=0 )
28820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28830 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
28840 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77  item *pX = &pNew
28850 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
28860 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
28870 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20    if( pSub ){.  
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
28890 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
288a0 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53  3DbStrDup(db, pS
288b0 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
288c0 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  .zSpan);.       
288d0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
288e0 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
288f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
28900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28910 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
28920 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  n = sqlite3MPrin
28930 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73  tf(db, "%s.%s.%s
28940 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
28970 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e  chemaName, zTabN
28980 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  ame, zColname);.
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289a0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
289b0 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
289c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
289d0 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61          pX->bSpa
289e0 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  nIsTab = 1;.    
289f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
28a10 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29  ree(db, zToFree)
28a20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
28a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28a40 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
28a50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
28a60 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
28a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
28a80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
28a90 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
28aa0 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
28ab0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28ac0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28ad0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
28ae0 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
28af0 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
28b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28b10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28b20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
28b30 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
28b40 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
28b50 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
28b60 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 7b  if( p->pEList ){
28b70 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  .    if( p->pELi
28b80 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
28b90 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
28ba0 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
28bb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28bc0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
28bd0 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
28be0 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
28bf0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
28c00 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bort;.    }.    
28c10 69 66 28 20 28 65 6c 69 73 74 46 6c 61 67 73 20  if( (elistFlags 
28c20 26 20 28 45 50 5f 48 61 73 46 75 6e 63 7c 45 50  & (EP_HasFunc|EP
28c30 5f 53 75 62 71 75 65 72 79 29 29 21 3d 30 20 29  _Subquery))!=0 )
28c40 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c  {.      p->selFl
28c50 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65  ags |= SF_Comple
28c60 78 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 20  xResult;.    }. 
28c70 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
28c80 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
28c90 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
28ca0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
28cb0 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
28cc0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
28cd0 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
28ce0 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
28cf0 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
28d00 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
28d10 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
28d20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
28d30 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
28d40 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
28d50 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
28d60 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
28d70 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
28d80 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
28d90 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
28da0 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
28db0 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
28dc0 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
28dd0 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
28de0 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
28df0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
28e00 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
28e10 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
28e20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
28e30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
28e40 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
28e50 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
28e60 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
28e70 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
28e80 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
28e90 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72 20 53  ree walker for S
28ea0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
28eb0 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e  ..** subquery in
28ec0 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
28ed0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28ee0 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57  SelectWalkNoop(W
28ef0 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
28f00 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
28f10 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
28f20 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
28f30 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
28f40 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
28f50 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
28f60 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61  DEBUG./*.** Alwa
28f70 79 73 20 61 73 73 65 72 74 2e 20 20 54 68 69 73  ys assert.  This
28f80 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
28f90 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  2 implementation
28fa0 20 70 72 6f 76 65 73 20 74 68 61 74 20 74 68 65   proves that the
28fb0 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  .** xSelectCallb
28fc0 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20 69 6e  ack2 is never in
28fd0 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  voked..*/.void s
28fe0 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
28ff0 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72 20 2a  Assert2(Walker *
29000 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20  NotUsed, Select 
29010 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
29020 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
29030 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
29040 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 20  2);.  assert( 0 
29050 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a  );.}.#endif./*.*
29060 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
29070 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
29080 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
29090 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
290a0 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
290b0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
290c0 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
290d0 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
290e0 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
290f0 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
29100 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
29110 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
29120 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
29130 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
29140 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
29150 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
29160 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
29170 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
29180 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
29190 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
291a0 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
291b0 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
291c0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
291d0 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
291e0 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
291f0 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
29200 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
29210 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
29220 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
29230 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
29240 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
29250 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
29260 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
29270 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
29280 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
292a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
292b0 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
292c0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
292d0 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
292e0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
292f0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
29300 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
29310 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
29320 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41    if( OK_IF_ALWA
29330 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e  YS_TRUE(pParse->
29340 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a  hasCompound) ){.
29350 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
29360 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43  lback = convertC
29370 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
29380 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77 2e 78  ubquery;.    w.x
29390 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
293a0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
293b0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
293c0 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77  Select);.  }.  w
293d0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
293e0 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
293f0 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  r;.  w.xSelectCa
29400 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
29410 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74  PopWith;.  sqlit
29420 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
29430 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
29440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29450 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
29460 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
29470 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
29480 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
29490 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
294a0 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
294b0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
294c0 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
294d0 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
294e0 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
294f0 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
29500 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
29510 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
29520 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
29530 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
29540 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
29550 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
29560 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
29570 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
29580 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
29590 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
295a0 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
295b0 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
295c0 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
295d0 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
295e0 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
295f0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
29600 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
29610 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
29620 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
29630 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
29640 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
29650 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
29660 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
29670 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75  void selectAddSu
29680 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
29690 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
296a0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
296b0 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
296c0 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
296d0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
296e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
296f0 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
29700 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
29710 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
29720 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
29730 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
29740 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a  TypeInfo)==0 );.
29750 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
29760 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
29770 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
29780 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70  ker->pParse;.  p
29790 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
297a0 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  c;.  for(i=0, pF
297b0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
297c0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
297d0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
297e0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
297f0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
29800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
29810 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
29820 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
29830 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
29840 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
29850 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
29860 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
29870 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
29880 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
29890 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
298a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
298b0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
298c0 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
298d0 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  ) pSel = pSel->p
298e0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73  Prior;.        s
298f0 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43  qlite3SelectAddC
29900 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
29910 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
29920 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  ab, pSel);.     
29930 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23   }.    }.  }.}.#
29940 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
29950 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
29960 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
29970 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
29980 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
29990 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
299a0 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
299b0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
299c0 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
299d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
299e0 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
299f0 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
29a00 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
29a10 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
29a20 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
29a30 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
29a40 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
29a50 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
29a60 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
29a70 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
29a80 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
29a90 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ck = sqlite3Sele
29aa0 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  ctWalkNoop;.  w.
29ab0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
29ac0 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71   = selectAddSubq
29ad0 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20  ueryTypeInfo;.  
29ae0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
29af0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
29b00 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
29b10 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
29b20 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
29b30 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
29b40 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
29b50 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
29b60 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61   up a SELECT sta
29b70 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
29b80 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
29b90 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
29ba0 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
29bb0 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
29bc0 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
29bd0 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
29be0 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
29bf0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
29c00 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
29c10 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
29c20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
29c30 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
29c40 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
29c50 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
29c60 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
29c70 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
29c80 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
29c90 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
29ca0 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
29cb0 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
29cc0 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
29cd0 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
29ce0 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
29cf0 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
29d00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
29d10 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
29d20 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
29d30 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
29d40 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
29d50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
29d60 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
29d70 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
29d80 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
29d90 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
29da0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
29db0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
29dc0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
29dd0 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
29de0 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
29df0 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
29e00 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
29e10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
29e20 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
29e30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
29e40 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
29e50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29e60 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
29e70 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
29e80 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
29e90 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
29ea0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
29eb0 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
29ec0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
29ed0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
29ee0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
29ef0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
29f00 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
29f10 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
29f20 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
29f30 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
29f40 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
29f50 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
29f60 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
29f70 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
29f80 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
29f90 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
29fa0 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
29fb0 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
29fc0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
29fd0 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
29fe0 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
29ff0 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
2a000 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
2a010 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
2a020 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
2a030 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
2a040 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
2a050 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
2a060 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
2a070 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
2a080 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
2a090 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
2a0a0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
2a0b0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2a0c0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2a0d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2a0e0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
2a0f0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
2a100 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41  .  int nReg = pA
2a110 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20  ggInfo->nFunc + 
2a120 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2a130 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30  n;.  if( nReg==0
2a140 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65   ) return;.#ifde
2a150 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2a160 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
2a170 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69  all AggInfo regi
2a180 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e  sters are within
2a190 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69   the range speci
2a1a0 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67  fied by.  ** Agg
2a1b0 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49  Info.mnReg..AggI
2a1c0 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61  nfo.mxReg */.  a
2a1d0 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67  ssert( nReg==pAg
2a1e0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67  gInfo->mxReg-pAg
2a1f0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29  gInfo->mnReg+1 )
2a200 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2a210 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2a220 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2a230 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  rt( pAggInfo->aC
2a240 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  ol[i].iMem>=pAgg
2a250 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
2a260 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
2a270 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d  ->aCol[i].iMem<=
2a280 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
2a290 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
2a2a0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2a2b0 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  unc; i++){.    a
2a2c0 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
2a2d0 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d  >aFunc[i].iMem>=
2a2e0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2a2f0 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2a300 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
2a310 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
2a320 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  xReg );.  }.#end
2a330 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
2a340 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
2a350 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
2a360 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d  mnReg, pAggInfo-
2a370 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70  >mxReg);.  for(p
2a380 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
2a390 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
2a3a0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2a3b0 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
2a3c0 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
2a3d0 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
2a3e0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
2a3f0 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
2a400 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2a410 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
2a420 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2a430 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
2a440 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
2a450 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
2a460 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2a470 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2a480 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
2a490 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
2a4a0 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
2a4b0 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
2a4c0 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
2a4d0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
2a4e0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
2a4f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
2a500 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
2a510 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2a520 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
2a530 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  >x.pList, 0, 0);
2a540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a550 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2a560 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
2a570 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2a580 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2a5b0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2a5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a5d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
2a5e0 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
2a5f0 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
2a600 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
2a610 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
2a620 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
2a630 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
2a640 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
2a650 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
2a660 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2a670 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2a680 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2a690 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2a6a0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2a6b0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
2a6c0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2a6d0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2a6e0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2a6f0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
2a700 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
2a710 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
2a720 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2a730 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2a740 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
2a750 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2a760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a770 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
2a780 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
2a790 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
2a7a0 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  r : 0);.    sqli
2a7b0 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
2a7c0 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  v, pF->pFunc, P4
2a7d0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
2a7e0 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
2a7f0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
2a800 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
2a810 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
2a820 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
2a830 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
2a840 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2a850 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
2a860 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
2a870 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2a880 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2a890 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2a8a0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2a8b0 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
2a8c0 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
2a8d0 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
2a8e0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2a8f0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2a900 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
2a910 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2a920 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
2a930 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2a940 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2a950 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2a960 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
2a970 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
2a980 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
2a990 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
2a9a0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
2a9b0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
2a9c0 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
2a9d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2a9e0 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2a9f0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2aa00 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2aa10 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
2aa20 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
2aa30 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
2aa40 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2aa50 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
2aa60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2aa70 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2aa80 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
2aa90 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   0, SQLITE_ECEL_
2aaa0 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DUP);.    }else{
2aab0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
2aac0 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
2aad0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2aae0 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
2aaf0 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
2ab00 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
2ab10 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2ab20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2ab30 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72  Arg==0 );  /* Er
2ab40 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f  ror condition */
2ab50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2ab60 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20   nArg>1 );   /* 
2ab70 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f  Also an error */
2ab80 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
2ab90 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
2aba0 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
2abb0 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
2abc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2abd0 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  F->pFunc->funcFl
2abe0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
2abf0 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
2ac00 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
2ac10 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
2ac20 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2ac30 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
2ac40 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
2ac50 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
2ac60 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
2ac70 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
2ac80 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
2ac90 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
2aca0 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
2acb0 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
2acc0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2acd0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2ace0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2acf0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
2ad00 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
2ad10 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2ad20 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
2ad30 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
2ad40 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
2ad50 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
2ad60 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
2ad70 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
2ad80 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
2ad90 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2ada0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2adb0 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
2adc0 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
2add0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
2ade0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
2adf0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ae00 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  AddOp3(v, OP_Agg
2ae10 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67  Step0, 0, regAgg
2ae20 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  , pF->iMem);.   
2ae30 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
2ae40 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e  ndP4(v, pF->pFun
2ae50 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
2ae60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ae70 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
2ae80 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
2ae90 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
2aea0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
2aeb0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
2aec0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2aed0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
2aee0 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
2aef0 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
2af00 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
2af10 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2af20 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
2af30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2af40 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2af50 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
2af60 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
2af70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
2af80 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
2af90 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
2afa0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
2afb0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
2afc0 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
2afd0 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
2afe0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
2aff0 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
2b000 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
2b010 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
2b020 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
2b030 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
2b040 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
2b050 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
2b060 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
2b070 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
2b080 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
2b090 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
2b0a0 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
2b0b0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
2b0c0 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
2b0d0 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
2b0e0 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
2b0f0 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
2b100 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
2b110 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
2b120 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
2b130 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
2b140 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
2b150 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
2b160 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
2b170 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
2b180 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
2b190 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
2b1a0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
2b1b0 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f   regHit); VdbeCo
2b1c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
2b1d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2b1e0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2b1f0 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
2b200 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
2b210 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
2b220 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
2b230 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
2b240 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2b250 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
2b260 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
2b270 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
2b280 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
2b290 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2b2a0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64  arse);.  if( add
2b2b0 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20  rHitTest ){.    
2b2c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2b2d0 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65  ere(v, addrHitTe
2b2e0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
2b2f0 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
2b300 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
2b310 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
2b320 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
2b330 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
2b340 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
2b350 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
2b360 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
2b370 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2b380 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
2b390 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
2b3a0 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
2b3b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
2b3c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
2b3d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
2b3e0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b400 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
2b410 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
2b420 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
2b430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2b440 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
2b450 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
2b460 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
2b470 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
2b480 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76   ){.    int bCov
2b490 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26  er = (pIdx!=0 &&
2b4a0 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
2b4b0 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
2b4c0 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a  yIndex(pIdx)));.
2b4d0 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
2b4e0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2b4f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
2b500 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c  N TABLE %s%s%s",
2b510 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
2b520 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43  Name,.        bC
2b530 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43  over ? " USING C
2b540 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
2b550 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43  : "",.        bC
2b560 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61  over ? pIdx->zNa
2b570 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20  me : "".    );. 
2b580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b590 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50  dOp4(.        pP
2b5a0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
2b5b0 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
2b5c0 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
2b5d0 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d  , zEqp, P4_DYNAM
2b5e0 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  IC.    );.  }.}.
2b5f0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
2b600 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2b610 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
2b620 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f  ./*.** Context o
2b630 62 6a 65 63 74 20 66 6f 72 20 68 61 76 69 6e 67  bject for having
2b640 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 29 2e  ToWhereExprCb().
2b650 0a 2a 2f 0a 73 74 72 75 63 74 20 48 61 76 69 6e  .*/.struct Havin
2b660 67 54 6f 57 68 65 72 65 43 74 78 20 7b 0a 20 20  gToWhereCtx {.  
2b670 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 3b 0a  Expr **ppWhere;.
2b680 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
2b690 75 70 42 79 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  upBy;.};../*.** 
2b6a0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2b6b0 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  ) callback used 
2b6c0 62 79 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  by havingToWhere
2b6d0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
2b6e0 20 6e 6f 64 65 20 70 61 73 73 65 64 20 74 6f 20   node passed to 
2b6f0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  the callback is 
2b700 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72  a TK_AND node, r
2b710 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f  eturn .** WRC_Co
2b720 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73  ntinue to tell s
2b730 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
2b740 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2b750 75 67 68 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e  ugh child nodes.
2b760 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
2b770 2c 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75  , return WRC_Pru
2b780 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ne. In this case
2b790 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20 69 66 20  , also check if 
2b7a0 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72  the .** sub-expr
2b7b0 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74  ession matches t
2b7c0 68 65 20 63 72 69 74 65 72 69 61 20 66 6f 72 20  he criteria for 
2b7d0 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74  being moved to t
2b7e0 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75  he WHERE.** clau
2b7f0 73 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20 69  se. If so, add i
2b800 74 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  t to the WHERE c
2b810 6c 61 75 73 65 20 61 6e 64 20 72 65 70 6c 61 63  lause and replac
2b820 65 20 74 68 65 20 73 75 62 2d 65 78 70 72 65 73  e the sub-expres
2b830 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74  sion.** within t
2b840 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73  he HAVING expres
2b850 73 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 73  sion with a cons
2b860 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61  tant "1"..*/.sta
2b870 74 69 63 20 69 6e 74 20 68 61 76 69 6e 67 54 6f  tic int havingTo
2b880 57 68 65 72 65 45 78 70 72 43 62 28 57 61 6c 6b  WhereExprCb(Walk
2b890 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2b8a0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
2b8b0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
2b8c0 4e 44 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ND ){.    struct
2b8d0 20 48 61 76 69 6e 67 54 6f 57 68 65 72 65 43 74   HavingToWhereCt
2b8e0 78 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  x *p = pWalker->
2b8f0 75 2e 70 48 61 76 69 6e 67 43 74 78 3b 0a 20 20  u.pHavingCtx;.  
2b900 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2b910 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
2b920 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50  upBy(pWalker->pP
2b930 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 2d 3e  arse, pExpr, p->
2b940 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20  pGroupBy) ){.   
2b950 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
2b960 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2b970 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70 72  ->db;.      Expr
2b980 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
2b990 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
2b9a0 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
2b9b0 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20  e3IntTokens[1], 
2b9c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
2b9d0 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  ew ){.        Ex
2b9e0 70 72 20 2a 70 57 68 65 72 65 20 3d 20 2a 28 70  pr *pWhere = *(p
2b9f0 2d 3e 70 70 57 68 65 72 65 29 3b 0a 20 20 20 20  ->ppWhere);.    
2ba00 20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a      SWAP(Expr, *
2ba10 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20  pNew, *pExpr);. 
2ba20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2ba30 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
2ba40 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a   pWhere, pNew);.
2ba50 20 20 20 20 20 20 20 20 2a 28 70 2d 3e 70 70 57          *(p->ppW
2ba60 68 65 72 65 29 20 3d 20 70 4e 65 77 3b 0a 20 20  here) = pNew;.  
2ba70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2ba80 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2ba90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
2baa0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2bab0 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
2bac0 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72  ligible terms fr
2bad0 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  om the HAVING cl
2bae0 61 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c  ause of a query,
2baf0 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f   which is.** pro
2bb00 63 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f  cessed after gro
2bb10 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48  uping, to the WH
2bb20 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63  ERE clause, whic
2bb30 68 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62  h is processed b
2bb40 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e  efore.** groupin
2bb50 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  g. For example, 
2bb60 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
2bb70 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2bb80 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20   <tables> WHERE 
2bb90 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48  a=? GROUP BY b H
2bba0 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d  AVING b=? AND c=
2bbb0 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ?.**.** can be r
2bbc0 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a  ewritten as:.**.
2bbd0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2bbe0 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52  OM <tables> WHER
2bbf0 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52  E a=? AND b=? GR
2bc00 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
2bc10 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d  c=?.**.** A term
2bc20 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65   of the HAVING e
2bc30 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69  xpression is eli
2bc40 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66  gible for transf
2bc50 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74  er if it consist
2bc60 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66  s.** entirely of
2bc70 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65   constants and e
2bc80 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
2bc90 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42  are also GROUP B
2bca0 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20  Y terms that.** 
2bcb0 75 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22  use the "BINARY"
2bcc0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
2bcd0 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nce..*/.static v
2bce0 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72  oid havingToWher
2bcf0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
2bd00 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
2bd10 70 47 72 6f 75 70 42 79 2c 0a 20 20 45 78 70 72  pGroupBy,.  Expr
2bd20 20 2a 70 48 61 76 69 6e 67 2c 20 0a 20 20 45 78   *pHaving, .  Ex
2bd30 70 72 20 2a 2a 70 70 57 68 65 72 65 0a 29 7b 0a  pr **ppWhere.){.
2bd40 20 20 73 74 72 75 63 74 20 48 61 76 69 6e 67 54    struct HavingT
2bd50 6f 57 68 65 72 65 43 74 78 20 73 43 74 78 3b 0a  oWhereCtx sCtx;.
2bd60 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72    Walker sWalker
2bd70 3b 0a 0a 20 20 73 43 74 78 2e 70 70 57 68 65 72  ;..  sCtx.ppWher
2bd80 65 20 3d 20 70 70 57 68 65 72 65 3b 0a 20 20 73  e = ppWhere;.  s
2bd90 43 74 78 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  Ctx.pGroupBy = p
2bda0 47 72 6f 75 70 42 79 3b 0a 0a 20 20 6d 65 6d 73  GroupBy;..  mems
2bdb0 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20  et(&sWalker, 0, 
2bdc0 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29  sizeof(sWalker))
2bdd0 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72  ;.  sWalker.pPar
2bde0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
2bdf0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
2be00 62 61 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57  back = havingToW
2be10 68 65 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57  hereExprCb;.  sW
2be20 61 6c 6b 65 72 2e 75 2e 70 48 61 76 69 6e 67 43  alker.u.pHavingC
2be30 74 78 20 3d 20 26 73 43 74 78 3b 0a 20 20 73 71  tx = &sCtx;.  sq
2be40 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73  lite3WalkExpr(&s
2be50 57 61 6c 6b 65 72 2c 20 70 48 61 76 69 6e 67 29  Walker, pHaving)
2be60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2be70 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70   to see if the p
2be80 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54  This entry of pT
2be90 61 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66  abList is a self
2bea0 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72  -join of a prior
2beb0 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20   view..** If it 
2bec0 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  is, then return 
2bed0 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  the SrcList_item
2bee0 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76   for the prior v
2bef0 69 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e  iew.  If it is n
2bf00 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ot,.** then retu
2bf10 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
2bf20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2bf30 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56  tem *isSelfJoinV
2bf40 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  iew(.  SrcList *
2bf50 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
2bf60 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
2bf70 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20  r self-joins in 
2bf80 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  this FROM clause
2bf90 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
2bfa0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73  List_item *pThis
2bfb0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2bfc0 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65   prior reference
2bfd0 20 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72   to this subquer
2bfe0 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  y */.){.  struct
2bff0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2c000 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65  Item;.  for(pIte
2c010 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b  m = pTabList->a;
2c020 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49   pItem<pThis; pI
2c030 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
2c040 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
2c050 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2c060 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
2c070 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63  viaCoroutine ) c
2c080 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2c090 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
2c0a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c0b0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2c0c0 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74  icmp(pItem->zDat
2c0d0 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44  abase, pThis->zD
2c0e0 61 74 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f  atabase)!=0 ) co
2c0f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c100 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2c110 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54  pItem->zName, pT
2c120 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  his->zName)!=0 )
2c130 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2c140 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2c150 6d 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20  mpare(0, .      
2c160 20 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65      pThis->pSele
2c170 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65  ct->pWhere, pIte
2c180 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65  m->pSelect->pWhe
2c190 72 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a  re, -1) .    ){.
2c1a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65        /* The vie
2c1b0 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62  w was modified b
2c1c0 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74  y some other opt
2c1d0 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61  imization such a
2c1e0 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44  s.      ** pushD
2c1f0 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20  ownWhereTerms() 
2c200 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
2c210 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
2c220 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20  urn pItem;.  }. 
2c230 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
2c240 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e  fdef SQLITE_COUN
2c250 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
2c260 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  TION./*.** Attem
2c270 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  pt to transform 
2c280 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
2c290 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  orm.**.**    SEL
2c2a0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2c2b0 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
2c2c0 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
2c2d0 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a  LECT y FROM t2).
2c2e0 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a  **.** Into this:
2c2f0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2c300 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
2c310 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45  ) FROM t1)+(SELE
2c320 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2c330 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74   t2).**.** The t
2c340 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  ransformation on
2c350 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20  ly works if all 
2c360 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2c370 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
2c380 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65     *  The subque
2c390 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  ry is a UNION AL
2c3a0 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  L of two or more
2c3b0 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54   terms.**   *  T
2c3c0 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45  here is no WHERE
2c3d0 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20   or GROUP BY or 
2c3e0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f  HAVING clauses o
2c3f0 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
2c400 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74  .**   *  The out
2c410 65 72 20 71 75 65 72 79 20 69 73 20 61 20 73 69  er query is a si
2c420 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a  mple count(*).**
2c430 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2c440 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
2c450 69 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65  ion is undertake
2c460 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2c470 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69   countOfViewOpti
2c480 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  mization(Parse *
2c490 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2c4a0 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  p){.  Select *pS
2c4b0 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45  ub, *pPrior;.  E
2c4c0 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78  xpr *pExpr;.  Ex
2c4d0 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71  pr *pCount;.  sq
2c4e0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
2c4f0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2c500 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30  SF_Aggregate)==0
2c510 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f   ) return 0;   /
2c520 2a 20 54 68 69 73 20 69 73 20 61 6e 20 61 67 67  * This is an agg
2c530 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20  regate */.  if( 
2c540 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2c550 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
2c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c570 20 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   Single result c
2c580 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72  olumn */.  pExpr
2c590 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
2c5a0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
2c5b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
2c5c0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
2c5d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
2c5e0 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61 67   Result is an ag
2c5f0 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28  gregate */.  if(
2c600 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2c610 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
2c620 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74 75  ,"count") ) retu
2c630 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75  rn 0;  /* Is cou
2c640 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28 20 70 45  nt() */.  if( pE
2c650 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20  xpr->x.pList!=0 
2c660 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2c670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2c680 75 73 74 20 62 65 20 63 6f 75 6e 74 28 2a 29 20  ust be count(*) 
2c690 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  */.  if( p->pSrc
2c6a0 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
2c6b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c6c0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61         /* One ta
2c6d0 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a  ble in FROM  */.
2c6e0 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63    pSub = p->pSrc
2c6f0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
2c700 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
2c710 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c730 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
2c740 69 73 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  is a subquery */
2c750 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
2c760 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
2c770 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c780 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
2c790 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f  a compound ry */
2c7a0 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70  .  do{.    if( p
2c7b0 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20  Sub->op!=TK_ALL 
2c7c0 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  && pSub->pPrior 
2c7d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2c7e0 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c  Must be UNION AL
2c7f0 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  L */.    if( pSu
2c800 62 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  b->pWhere ) retu
2c810 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
2c830 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2c840 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73  .    if( pSub->s
2c850 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2c860 72 65 67 61 74 65 20 29 20 72 65 74 75 72 6e 20  regate ) return 
2c870 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e  0;     /* Not an
2c880 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
2c890 20 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70    pSub = pSub->p
2c8a0 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Prior;          
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8c0 20 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76      /* Repeat ov
2c8d0 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20  er compound */. 
2c8e0 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b   }while( pSub );
2c8f0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
2c900 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  ch this point th
2c910 65 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70  en it is OK to p
2c920 65 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73  erform the trans
2c930 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  formation */..  
2c940 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2c950 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70  .  pCount = pExp
2c960 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a  r;.  pExpr = 0;.
2c970 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63    pSub = p->pSrc
2c980 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
2c990 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e    p->pSrc->a[0].
2c9a0 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73  pSelect = 0;.  s
2c9b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
2c9c0 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29  ete(db, p->pSrc)
2c9d0 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71  ;.  p->pSrc = sq
2c9e0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
2c9f0 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
2ca00 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b  zeof(*p->pSrc));
2ca10 0a 20 20 77 68 69 6c 65 28 20 70 53 75 62 20 29  .  while( pSub )
2ca20 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65 72  {.    Expr *pTer
2ca30 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  m;.    pPrior = 
2ca40 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSub->pPrior;.  
2ca50 20 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d    pSub->pPrior =
2ca60 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e   0;.    pSub->pN
2ca70 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ext = 0;.    pSu
2ca80 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  b->selFlags |= S
2ca90 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
2caa0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
2cab0 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
2cac0 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65  .    pSub->nSele
2cad0 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73  ctRow = 0;.    s
2cae0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2caf0 6c 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70  lete(db, pSub->p
2cb00 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72  EList);.    pTer
2cb10 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c  m = pPrior ? sql
2cb20 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
2cb30 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f  pCount, 0) : pCo
2cb40 75 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  unt;.    pSub->p
2cb50 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
2cb60 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
2cb70 61 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b  arse, 0, pTerm);
2cb80 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c  .    pTerm = sql
2cb90 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2cba0 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20  , TK_SELECT, 0, 
2cbb0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  0);.    sqlite3P
2cbc0 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50  ExprAddSelect(pP
2cbd0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75  arse, pTerm, pSu
2cbe0 62 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  b);.    if( pExp
2cbf0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  r==0 ){.      pE
2cc00 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  xpr = pTerm;.   
2cc10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45   }else{.      pE
2cc20 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
2cc30 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c  pr(pParse, TK_PL
2cc40 55 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72  US, pTerm, pExpr
2cc50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  );.    }.    pSu
2cc60 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  b = pPrior;.  }.
2cc70 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30    p->pEList->a[0
2cc80 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
2cc90 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
2cca0 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b  = ~SF_Aggregate;
2ccb0 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
2ccc0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2ccd0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2cce0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
2ccf0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2cd00 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
2cd10 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69  fter count-of-vi
2cd20 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ew optimization:
2cd30 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
2cd40 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2cd50 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2cd60 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31  endif.  return 1
2cd70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2cd80 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57  LITE_COUNTOFVIEW
2cd90 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
2cda0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2cdb0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
2cdc0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
2cdd0 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
2cde0 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
2cdf0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
2ce00 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
2ce10 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
2ce20 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
2ce30 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
2ce40 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
2ce50 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
2ce60 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
2ce70 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2ce80 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
2ce90 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
2cea0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
2ceb0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
2cec0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
2ced0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2cee0 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
2cef0 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2cf00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2cf10 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
2cf20 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
2cf30 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
2cf40 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
2cf50 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
2cf60 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
2cf70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
2cf80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2cf90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2cfa0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2cfb0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
2cfc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cfd0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2cfe0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
2cff0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
2d000 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
2d010 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
2d020 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
2d030 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
2d040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d050 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2d060 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
2d070 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
2d080 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
2d090 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
2d0a0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
2d0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d0c0 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
2d0d0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
2d0e0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
2d0f0 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
2d100 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
2d110 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
2d120 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
2d130 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
2d140 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  = 0;  /* List of
2d150 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
2d160 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
2d170 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
2d180 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
2d190 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
2d1a0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
2d1b0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
2d1c0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2d1d0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2d1e0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2d1f0 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
2d200 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
2d210 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
2d220 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
2d230 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
2d240 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
2d250 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2d260 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
2d270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2d280 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
2d290 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
2d2a0 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
2d2b0 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
2d2c0 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
2d2d0 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
2d2e0 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53  T keyword */.  S
2d2f0 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20  ortCtx sSort;   
2d300 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e        /* Info on
2d310 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
2d320 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2d330 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
2d340 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
2d350 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
2d360 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
2d370 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
2d380 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
2d390 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2d3a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
2d3b0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
2d3c0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2d3d0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2d3e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2d3f0 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
2d400 61 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20  axOrderBy = 0;  
2d410 2f 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20 42  /* Added ORDER B
2d420 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75  Y for min/max qu
2d430 65 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69  eries */.  u8 mi
2d440 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20  nMaxFlag;       
2d450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
2d460 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75  g for min/max qu
2d470 65 72 69 65 73 20 2a 2f 0a 0a 23 69 66 6e 64 65  eries */..#ifnde
2d480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2d490 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73  PLAIN.  int iRes
2d4a0 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70  toreSelectId = p
2d4b0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2d4c0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  ;.  pParse->iSel
2d4d0 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
2d4e0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b  iNextSelectId++;
2d4f0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
2d500 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
2d510 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
2d520 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
2d530 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
2d540 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2d550 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
2d560 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
2d570 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
2d580 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
2d590 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
2d5a0 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
2d5b0 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
2d5c0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2d5d0 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e  BLED.  pParse->n
2d5e0 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a  SelectIndent++;.
2d5f0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2d600 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69  pParse,p, ("begi
2d610 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22  n processing:\n"
2d620 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
2d630 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2d640 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x100 ){.    sqli
2d650 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2d660 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
2d670 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2d680 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2d690 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d6a0 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  !=SRT_DistFifo )
2d6b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2d6c0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2d6d0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2d6e0 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
2d6f0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2d700 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d710 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  !=SRT_DistQueue 
2d720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2d730 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2d740 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2d750 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20  _Queue );.  if( 
2d760 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
2d770 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
2d780 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
2d790 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
2d7a0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2d7b0 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
2d7c0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2d7d0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
2d7e0 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
2d7f0 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c  t==SRT_Discard |
2d800 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2d810 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51  st->eDest==SRT_Q
2d820 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e  ueue  || pDest->
2d830 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
2d840 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ifo ||.         
2d850 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2d860 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c  SRT_DistQueue ||
2d870 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2d880 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a  RT_Fifo);.    /*
2d890 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
2d8a0 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
2d8b0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
2d8c0 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
2d8d0 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
2d8e0 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
2d8f0 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
2d900 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2d910 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
2d920 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
2d930 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
2d940 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2d950 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2d960 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
2d970 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
2d980 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  p, 0);.  memset(
2d990 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f  &sSort, 0, sizeo
2d9a0 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f  f(sSort));.  sSo
2d9b0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
2d9c0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
2d9d0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2d9e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2d9f0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
2da00 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
2da10 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2da20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
2da30 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  >pEList!=0 );.  
2da40 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
2da50 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2da60 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c  ate)!=0;.#if SEL
2da70 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2da80 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2da90 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2daa0 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2dab0 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2dac0 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d  e,p, ("after nam
2dad0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22  e resolution:\n"
2dae0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2daf0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2db00 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2db10 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70  if..  /* Get a p
2db20 6f 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20  ointer the VDBE 
2db30 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
2db40 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  on, allocating a
2db50 20 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65   new VDBE if one
2db60 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61  .  ** does not a
2db70 6c 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a  lready exist */.
2db80 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
2db90 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
2dba0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
2dbb0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 69 66  select_end;.  if
2dbc0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
2dbd0 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
2dbe0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
2dbf0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
2dc00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20  ;.  }..  /* Try 
2dc10 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
2dc20 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
2dc30 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f  M clause up into
2dc40 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a   the main query.
2dc50 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
2dc60 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
2dc70 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
2dc80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2dc90 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
2dca0 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69   !p->pPrior && i
2dcb0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2dcc0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2dcd0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2dce0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
2dcf0 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
2dd00 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
2dd10 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
2dd20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
2dd30 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
2dd40 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
2dd50 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43  tinue;..    /* C
2dd60 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e  atch mismatch in
2dd70 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f   the declared co
2dd80 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20  lumns of a view 
2dd90 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
2dda0 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  f.    ** columns
2ddb0 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f   in the SELECT o
2ddc0 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20  n the RHS */.   
2ddd0 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21   if( pTab->nCol!
2dde0 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e  =pSub->pEList->n
2ddf0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
2de00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2de10 61 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20  arse, "expected 
2de20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27  %d columns for '
2de30 25 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c  %s' but got %d",
2de40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2de50 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
2de60 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  l, pTab->zName, 
2de70 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2de80 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  xpr);.      goto
2de90 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2dea0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f   }..    /* Do no
2deb0 74 20 74 72 79 20 74 6f 20 66 6c 61 74 74 65 6e  t try to flatten
2dec0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75   an aggregate su
2ded0 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
2dee0 20 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67     ** Flattening
2def0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75   an aggregate su
2df00 62 71 75 65 72 79 20 69 73 20 6f 6e 6c 79 20 70  bquery is only p
2df10 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 6f  ossible if the o
2df20 75 74 65 72 20 71 75 65 72 79 0a 20 20 20 20 2a  uter query.    *
2df30 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  * is not a join.
2df40 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 75 74    But if the out
2df50 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
2df60 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
2df70 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a   subquery.    **
2df80 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65   will be impleme
2df90 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
2dfa0 74 69 6e 65 20 61 6e 64 20 74 68 65 72 65 20 69  tine and there i
2dfb0 73 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74  s no advantage t
2dfc0 6f 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e  o.    ** flatten
2dfd0 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65  ing in that case
2dfe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2dff0 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
2e000 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2e010 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
2e020 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
2e030 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
2e040 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2e050 6f 75 74 65 72 20 71 75 65 72 79 20 63 6f 6e 74  outer query cont
2e060 61 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65 78 22  ains a "complex"
2e070 20 72 65 73 75 6c 74 20 73 65 74 20 28 74 68 61   result set (tha
2e080 74 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20  t is,.    ** if 
2e090 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
2e0a0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
2e0b0 79 20 75 73 65 73 20 66 75 6e 63 74 69 6f 6e 73  y uses functions
2e0c0 20 6f 72 20 73 75 62 71 75 65 72 69 65 73 29 0a   or subqueries).
2e0d0 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68      ** and if th
2e0e0 65 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61  e subquery conta
2e0f0 69 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ins an ORDER BY 
2e100 63 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20  clause and if.  
2e110 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20    ** it will be 
2e120 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
2e130 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65   co-routine, the
2e140 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
2e150 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72  .  This.    ** r
2e160 65 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77  estriction allow
2e170 73 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73  s SQL constructs
2e180 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
2e190 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
2e1a0 54 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  T expensive_func
2e1b0 74 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20  tion(x).    **  
2e1c0 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78    FROM (SELECT x
2e1d0 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20   FROM tab ORDER 
2e1e0 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a  BY y LIMIT 10);.
2e1f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2e200 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  e expensive_func
2e210 74 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63  tion() is only c
2e220 6f 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31  omputed on the 1
2e230 30 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20  0 rows that.    
2e240 2a 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72  ** are output, r
2e250 61 74 68 65 72 20 74 68 61 6e 20 65 76 65 72 79  ather than every
2e260 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c   row of the tabl
2e270 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2e280 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
2e290 20 74 68 61 74 20 74 68 65 20 6f 75 74 65 72 20   that the outer 
2e2a0 71 75 65 72 79 20 68 61 76 65 20 61 20 63 6f 6d  query have a com
2e2b0 70 6c 65 78 20 72 65 73 75 6c 74 20 73 65 74 0a  plex result set.
2e2c0 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 61      ** means tha
2e2d0 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 64 6f 65  t flattening doe
2e2e0 73 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d 70 6c  s occur on simpl
2e2f0 65 72 20 53 51 4c 20 63 6f 6e 73 74 72 61 69 6e  er SQL constrain
2e300 74 73 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a  ts without.    *
2e310 2a 20 74 68 65 20 65 78 70 65 6e 73 69 76 65 5f  * the expensive_
2e320 66 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b 65 3a  function() like:
2e330 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2e340 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53  SELECT x FROM (S
2e350 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
2e360 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
2e370 54 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a 20 20  T 10);.    */.  
2e380 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
2e390 65 72 42 79 21 3d 30 0a 20 20 20 20 20 26 26 20  erBy!=0.     && 
2e3a0 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d  i==0.     && (p-
2e3b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
2e3c0 6f 6d 70 6c 65 78 52 65 73 75 6c 74 29 21 3d 30  omplexResult)!=0
2e3d0 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69  .     && (pTabLi
2e3e0 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
2e3f0 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73       || (pTabLis
2e400 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74  t->a[1].fg.joint
2e410 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ype&(JT_LEFT|JT_
2e420 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20  CROSS))!=0).    
2e430 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
2e440 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
2e450 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
2e460 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
2e470 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  isAgg) ){.      
2e480 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
2e490 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
2e4a0 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
2e4b0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 2d  . */.      i = -
2e4c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  1;.    }.    pTa
2e4d0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2e4e0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2e4f0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2e500 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2e510 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
2e520 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
2e530 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
2e540 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
2e550 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  rBy;.    }.  }.#
2e560 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
2e570 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
2e580 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
2e590 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20  Handle compound 
2e5a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2e5b0 73 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61  s using the sepa
2e5c0 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74  rate multiSelect
2e5d0 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72  ().  ** procedur
2e5e0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
2e5f0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
2e600 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  c = multiSelect(
2e610 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
2e620 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65  );.    explainSe
2e630 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
2e640 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
2e650 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 23  toreSelectId);.#
2e660 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2e670 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43  NABLED.    SELEC
2e680 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
2e690 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64  p,("end compound
2e6a0 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69  -select processi
2e6b0 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50 61  ng\n"));.    pPa
2e6c0 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
2e6d0 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt--;.#endif.   
2e6e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2e6f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72  #endif..  /* For
2e700 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
2e710 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64  e FROM clause, d
2e720 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20  o two things:.  
2e730 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65  ** (1) Authorize
2e740 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74  d unreferenced t
2e750 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47  ables.  ** (2) G
2e760 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2e770 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
2e780 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
2e790 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2e7a0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2e7b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2e7c0 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
2e7d0 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
2e7e0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
2e7f0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
2e800 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
2e810 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2e820 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2e830 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2e840 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  W).    const cha
2e850 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
2e860 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  text;.#endif..  
2e870 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54    /* Issue SQLIT
2e880 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61  E_READ authoriza
2e890 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b  tions with a fak
2e8a0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f  e column name fo
2e8b0 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62  r any.    ** tab
2e8c0 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65 66  les that are ref
2e8d0 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d  erenced but from
2e8e0 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73   which no values
2e8f0 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a   are extracted..
2e900 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20      ** Examples 
2e910 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20 6b  of where these k
2e920 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c  inds of null SQL
2e930 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69  ITE_READ authori
2e940 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77  zations.    ** w
2e950 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20  ould occur:.    
2e960 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  **.    **     SE
2e970 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2e980 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49  OM t1;   -- SQLI
2e990 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20  TE_READ t1."".  
2e9a0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2e9b0 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  t1.* FROM t1, t2
2e9c0 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
2e9d0 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a  AD t2."".    **.
2e9e0 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20      ** The fake 
2e9f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61  column name is a
2ea00 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
2ea10 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
2ea20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20  for a table to. 
2ea30 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c     ** have a col
2ea40 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65  umn named by the
2ea50 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69   empty string, i
2ea60 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
2ea70 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a  re is no way to.
2ea80 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69      ** distingui
2ea90 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e  sh between an un
2eaa0 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
2eab0 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72   and an actual r
2eac0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
2ead0 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e      ** "" column
2eae0 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  . The original d
2eaf0 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68  esign was for th
2eb00 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
2eb10 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c  me to be a NULL,
2eb20 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f  .    ** which wo
2eb30 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f  uld be unambiguo
2eb40 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20  us.  But legacy 
2eb50 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
2eb60 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20  llbacks might.  
2eb70 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20    ** assume the 
2eb80 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e  column name is n
2eb90 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66  on-NULL and segf
2eba0 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f  ault.  The use o
2ebb0 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a  f an empty.    *
2ebc0 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  * string for the
2ebd0 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
2ebe0 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20  e seems safer.. 
2ebf0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49     */.    if( pI
2ec00 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20  tem->colUsed==0 
2ec10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2ec20 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
2ec30 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70  , SQLITE_READ, p
2ec40 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c  Item->zName, "",
2ec50 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
2ec60 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  e);.    }..#if !
2ec70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2ec80 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2ec90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2eca0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20  _OMIT_VIEW).    
2ecb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2ecc0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
2ecd0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
2ece0 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20   clause.    */. 
2ecf0 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d     pSub = pItem-
2ed00 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
2ed10 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2ed20 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
2ed30 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
2ed40 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
2ed50 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2ed60 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
2ed70 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
2ed80 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
2ed90 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2eda0 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
2edb0 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
2edc0 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
2edd0 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
2ede0 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
2edf0 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
2ee00 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
2ee10 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
2ee20 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
2ee30 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
2ee40 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
2ee50 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
2ee60 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
2ee70 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
2ee80 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
2ee90 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
2eea0 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
2eeb0 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2eec0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
2eed0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2eee0 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2eef0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
2ef00 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65  * The subroutine
2ef10 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20   that manifests 
2ef20 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20 62  the view might b
2ef30 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75  e a one-time rou
2ef40 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tine,.        **
2ef50 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65   or it might nee
2ef60 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e  d to be rerun on
2ef70 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   each iteration 
2ef80 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20  because it.     
2ef90 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20     ** encodes a 
2efa0 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
2efb0 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ery. */.        
2efc0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
2efd0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49  3VdbeGetOp(v, pI
2efe0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2eff0 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e  )->opcode==OP_On
2f000 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ce );.        sq
2f010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f020 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
2f030 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
2f040 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2f050 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
2f060 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2f070 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
2f080 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
2f090 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
2f0a0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
2f0b0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
2f0c0 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
2f0d0 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
2f0e0 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
2f0f0 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
2f100 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
2f110 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2f120 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
2f130 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
2f140 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
2f150 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
2f160 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
2f170 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
2f180 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
2f190 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
2f1a0 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
2f1b0 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
2f1c0 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
2f1d0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
2f1e0 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
2f1f0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2f200 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
2f210 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
2f220 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d   constant WHERE-
2f230 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20  clause terms in 
2f240 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
2f250 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69  down.    ** insi
2f260 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  de the subquery.
2f270 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20    This can help 
2f280 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
2f290 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65  run more efficie
2f2a0 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ntly..    */.   
2f2b0 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e   if( (pItem->fg.
2f2c0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
2f2d0 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  TER)==0.     && 
2f2e0 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
2f2f0 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ms(pParse, pSub,
2f300 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65   p->pWhere, pIte
2f310 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20  m->iCursor).    
2f320 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
2f330 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
2f340 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2f350 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2f360 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  ){.        SELEC
2f370 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2f380 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48  rse,p,("After WH
2f390 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d  ERE-clause push-
2f3a0 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  down:\n"));.    
2f3b0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2f3c0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2f3d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
2f3e0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53  if.    }..    zS
2f3f0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
2f400 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
2f410 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61 72  ontext;.    pPar
2f420 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
2f430 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b   = pItem->zName;
2f440 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
2f450 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  e code to implem
2f460 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72 79  ent the subquery
2f470 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f480 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 69  he subquery is i
2f490 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
2f4a0 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74 68  co-routine if th
2f4b0 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 20 20  e subquery is.  
2f4c0 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
2f4d0 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72 20  to be the outer 
2f4e0 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69 74  loop (so that it
2f4f0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2f500 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  o be.    ** comp
2f510 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  uted more than o
2f520 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nce).    **.    
2f530 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68 65  ** TODO: Are the
2f540 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 73  re other reasons
2f550 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20 75   beside (1) to u
2f560 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a  se a co-routine.
2f570 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
2f580 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20  ation?.    */.  
2f590 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20 20    if( i==0.     
2f5a0 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
2f5b0 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20  rc==1.          
2f5c0 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e    || (pTabList->
2f5d0 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[1].fg.jointype
2f5e0 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f  &(JT_LEFT|JT_CRO
2f5f0 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31 29  SS))!=0)  /* (1)
2f600 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
2f610 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
2f620 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
2f630 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
2f640 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2f650 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2f660 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
2f670 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
2f680 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2f690 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2f6a0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
2f6b0 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70 49  ;.     .      pI
2f6c0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
2f6d0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2f6e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f6f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
2f700 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  nitCoroutine, pI
2f710 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2f720 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  0, addrTop);.   
2f730 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2f740 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  v, "%s", pItem->
2f750 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2f760 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
2f770 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f  FillSub = addrTo
2f780 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
2f790 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
2f7a0 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
2f7b0 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2f7c0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78  eturn);.      ex
2f7d0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2f7e0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
2f7f0 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
2f800 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
2f810 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2f820 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
2f830 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
2f840 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
2f850 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
2f860 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
2f870 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
2f880 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  outine = 1;.    
2f890 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75    pItem->regResu
2f8a0 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  lt = dest.iSdst;
2f8b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f8c0 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
2f8d0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2f8e0 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
2f8f0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2f900 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
2f910 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2f920 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2f930 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
2f940 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2f950 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2f960 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
2f970 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
2f980 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
2f990 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2f9a0 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
2f9b0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2f9c0 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
2f9d0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
2f9e0 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
2f9f0 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
2fa00 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
2fa10 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
2fa20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
2fa30 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
2fa40 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
2fa50 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
2fa60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
2fa70 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
2fa80 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
2fa90 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
2faa0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
2fab0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72  rcList_item *pPr
2fac0 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ior;..      asse
2fad0 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
2fae0 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20  illSub==0 );.   
2faf0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
2fb00 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
2fb10 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41  nMem;.      topA
2fb20 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2fb30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2fb40 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d  teger, 0, pItem-
2fb50 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2fb60 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
2fb70 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b  llSub = topAddr+
2fb80 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  1;.      if( pIt
2fb90 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61  em->fg.isCorrela
2fba0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
2fbb0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
2fbc0 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72  uery is not corr
2fbd0 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65  elated and if we
2fbe0 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20   are not inside 
2fbf0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  of.        ** a 
2fc00 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
2fc10 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
2fc20 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
2fc30 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
2fc40 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e          ** once.
2fc50 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   */.        once
2fc60 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
2fc70 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
2fc80 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
2fc90 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56  ge(v);.        V
2fca0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2fcb0 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
2fcc0 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
2fcd0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2fce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fcf0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
2fd00 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
2fd10 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
2fd20 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2fd30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
2fd40 72 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69  rior = isSelfJoi
2fd50 6e 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20  nView(pTabList, 
2fd60 70 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  pItem);.      if
2fd70 28 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ( pPrior ){.    
2fd80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fd90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
2fda0 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Dup, pItem->iCur
2fdb0 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75  sor, pPrior->iCu
2fdc0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 65  rsor);.        e
2fdd0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2fde0 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
2fdf0 64 2c 20 70 50 72 69 6f 72 2d 3e 69 53 65 6c 65  d, pPrior->iSele
2fe00 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20 61  ctId);.        a
2fe10 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
2fe20 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
2fe30 20 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65       pSub->nSele
2fe40 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
2fe50 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74  pSelect->nSelect
2fe60 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Row;.      }else
2fe70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fe80 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
2fe90 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
2fea0 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
2feb0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  sor);.        ex
2fec0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2fed0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
2fee0 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
2fef0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
2ff00 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2ff10 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
2ff20 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
2ff30 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  }.      pItem->p
2ff40 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2ff50 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
2ff60 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ow;.      if( on
2ff70 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  ceAddr ) sqlite3
2ff80 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2ff90 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20  onceAddr);.     
2ffa0 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74   retAddr = sqlit
2ffb0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2ffc0 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  OP_Return, pItem
2ffd0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2ffe0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2fff0 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49  (v, "end %s", pI
30000 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
30010 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
30020 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
30030 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64   topAddr, retAdd
30040 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
30050 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
30060 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
30070 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
30080 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
30090 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
300a0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
300b0 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
300c0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
300d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  .    pParse->zAu
300e0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
300f0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23  edAuthContext;.#
30100 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
30110 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73  Various elements
30120 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63   of the SELECT c
30130 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c  opied into local
30140 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20   variables for. 
30150 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20   ** convenience 
30160 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
30170 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72  >pEList;.  pWher
30180 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
30190 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
301a0 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
301b0 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
301c0 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  .  sDistinct.isT
301d0 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
301e0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
301f0 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43  )!=0;..#if SELEC
30200 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
30210 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
30220 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
30230 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
30240 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
30250 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52  p,("After all FR
30260 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73  OM-clause analys
30270 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  is:\n"));.    sq
30280 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
30290 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
302a0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
302b0 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
302c0 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
302d0 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
302e0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
302f0 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
30300 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e  ener|SQLITE_Coun
30310 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20 63  tOfView).   && c
30320 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
30330 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  zation(pParse, p
30340 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ).  ){.    if( d
30350 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
30360 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
30370 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  d;.    pEList = 
30380 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70  p->pEList;.    p
30390 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
303a0 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
303b0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
303c0 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
303d0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
303e0 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
303f0 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
30400 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
30410 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
30420 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
30430 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
30440 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
30450 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
30460 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
30470 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
30480 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
30490 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
304a0 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
304b0 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
304c0 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
304d0 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
304e0 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
304f0 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
30500 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79   xyz ORDER BY xy
30510 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  z.  **.  ** The 
30520 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70  second form is p
30530 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69  referred as a si
30540 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74  ngle index (or t
30550 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62  emp-table) may b
30560 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  e .  ** used for
30570 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20   both the ORDER 
30580 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
30590 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f  processing. As o
305a0 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20  riginally .  ** 
305b0 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72  written the quer
305c0 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d  y must use a tem
305d0 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c  p-table for at l
305e0 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
305f0 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61  ORDER .  ** BY a
30600 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64  nd DISTINCT, and
30610 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70   an index or sep
30620 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65  arate temp-table
30630 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a   for the other..
30640 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
30650 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
30660 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
30670 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
30680 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ct .   && sqlite
30690 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
306a0 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c  (sSort.pOrderBy,
306b0 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a   pEList, -1)==0.
306c0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
306d0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
306e0 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70  inct;.    pGroup
306f0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
30700 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
30710 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  stDup(db, pEList
30720 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74  , 0);.    /* Not
30730 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ice that even th
30740 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63  ought SF_Distinc
30750 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  t has been clear
30760 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c  ed from p->selFl
30770 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  ags,.    ** the 
30780 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
30790 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20   is still set.  
307a0 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65  Hence, isTnct re
307b0 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20  presents the.   
307c0 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74   ** original set
307d0 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44  ting of the SF_D
307e0 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f  istinct flag, no
307f0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  t the current se
30800 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73  tting */.    ass
30810 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69  ert( sDistinct.i
30820 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45  sTnct );..#if SE
30830 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
30840 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
30850 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
30860 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45  x400 ){.      SE
30870 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
30880 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73  pParse,p,("Trans
30890 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e  form DISTINCT in
308a0 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29  to GROUP BY:\n")
308b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
308c0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
308d0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , p, 0);.    }.#
308e0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
308f0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
30900 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
30910 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65  then create an e
30920 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
30930 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f  o.  ** do the so
30940 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73  rting.  But this
30950 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72   sorting ephemer
30960 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  al index might e
30970 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67  nd up.  ** being
30980 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
30990 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61  ata can be extra
309a0 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
309b0 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49  ed order..  ** I
309c0 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
309d0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f  se, then the OP_
309e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
309f0 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
30a00 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74  e.  ** changed t
30a10 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
30a20 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  e we figure out 
30a30 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
30a40 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e   index is.  ** n
30a50 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
30a60 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
30a70 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20  dex variable is 
30a80 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
30a90 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61  te.  ** that cha
30aa0 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
30ab0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
30ac0 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
30ad0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
30ae0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
30af0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
30b00 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  se, sSort.pOrder
30b10 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e  By, 0, pEList->n
30b20 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74  Expr);.    sSort
30b30 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  .iECursor = pPar
30b40 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
30b50 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
30b60 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
30b70 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
30b80 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
30b90 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f  l,.          sSo
30ba0 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f  rt.iECursor, sSo
30bb0 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  rt.pOrderBy->nEx
30bc0 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78  pr+1+pEList->nEx
30bd0 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
30be0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
30bf0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20  , P4_KEYINFO.   
30c00 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
30c10 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
30c20 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
30c30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
30c40 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
30c50 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
30c60 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
30c70 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
30c80 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
30c90 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
30ca0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
30cb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
30cc0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
30cd0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c  st->iSDParm, pEL
30ce0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
30cf0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
30d00 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
30d10 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
30d20 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
30d30 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
30d40 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
30d50 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  t)==0 ){.    p->
30d60 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30  nSelectRow = 320
30d70 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20  ;  /* 4 billion 
30d80 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f  rows */.  }.  co
30d90 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
30da0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
30db0 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
30dc0 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72  Limit==0 && sSor
30dd0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
30de0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
30df0 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
30e00 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  e(v, sSort.addrS
30e10 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72  ortIndex, OP_Sor
30e20 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53  terOpen);.    sS
30e30 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d  ort.sortFlags |=
30e40 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
30e50 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ter;.  }..  /* O
30e60 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  pen an ephemeral
30e70 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
30e80 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
30e90 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
30ea0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
30eb0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
30ec0 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
30ed0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
30ee0 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
30ef0 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
30f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
30f10 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
30f20 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
30f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f40 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
30f50 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
30f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f70 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
30f80 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
30f90 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
30fa0 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20  ist,0,0),.      
30fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fc0 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
30fd0 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
30fe0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
30ff0 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
31000 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
31010 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
31020 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
31030 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RED;.  }else{.  
31040 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
31050 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
31060 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d  STINCT_NOOP;.  }
31070 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  ..  if( !isAgg &
31080 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
31090 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65  .    /* No aggre
310a0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
310b0 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  nd no GROUP BY c
310c0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36  lause */.    u16
310d0 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73   wctrlFlags = (s
310e0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
310f0 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  ? WHERE_WANT_DIS
31100 54 49 4e 43 54 20 3a 20 30 29 3b 0a 20 20 20 20  TINCT : 0);.    
31110 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55 53  assert( WHERE_US
31120 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65  E_LIMIT==SF_Fixe
31130 64 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 77 63  dLimit );.    wc
31140 74 72 6c 46 6c 61 67 73 20 7c 3d 20 70 2d 3e 73  trlFlags |= p->s
31150 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78  elFlags & SF_Fix
31160 65 64 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a  edLimit;..    /*
31170 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
31180 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ase scan. */.   
31190 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
311a0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
311b0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
311c0 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  here, sSort.pOrd
311d0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311f0 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20       p->pEList, 
31200 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e  wctrlFlags, p->n
31210 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
31220 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
31230 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
31240 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
31250 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
31260 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d  unt(pWInfo) < p-
31270 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
31280 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
31290 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ow = sqlite3Wher
312a0 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
312b0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
312c0 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74     if( sDistinct
312d0 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74  .isTnct && sqlit
312e0 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
312f0 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  t(pWInfo) ){.   
31300 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
31310 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  ctType = sqlite3
31320 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
31330 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
31340 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72     if( sSort.pOr
31350 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
31360 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71  Sort.nOBSat = sq
31370 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
31380 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  red(pWInfo);.   
31390 20 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72 65     sSort.bOrdere
313a0 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71 6c  dInnerLoop = sql
313b0 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 65 64  ite3WhereOrdered
313c0 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66 6f  InnerLoop(pWInfo
313d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f  );.      if( sSo
313e0 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74  rt.nOBSat==sSort
313f0 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
31400 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72   ){.        sSor
31410 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
31420 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
31430 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
31440 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
31450 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
31460 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
31470 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
31480 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
31490 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
314a0 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
314b0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
314c0 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
314d0 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
314e0 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74  */.    if( sSort
314f0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
31500 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65  0 && sSort.pOrde
31510 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
31520 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
31530 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
31540 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
31550 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
31560 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
31570 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
31580 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
31590 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a  List==pEList );.
315a0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
315b0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
315c0 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73  1, &sSort, &sDis
315d0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315f0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f    sqlite3WhereCo
31600 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e  ntinueLabel(pWIn
31610 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
31620 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31630 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
31640 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f  pWInfo));..    /
31650 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
31660 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
31670 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
31680 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
31690 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
316a0 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e  * This case when
316b0 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67   there exist agg
316c0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
316d0 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63   or a GROUP BY c
316e0 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20  lause.    ** or 
316f0 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  both */.    Name
31700 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
31710 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
31720 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
31730 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
31740 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
31750 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
31760 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
31770 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
31780 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
31790 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
317a0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
317b0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
317c0 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
317d0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
317e0 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
317f0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
31800 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
31810 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
31820 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
31830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31840 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
31850 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
31860 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
31870 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
31880 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
31890 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
318a0 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
318b0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
318c0 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
318d0 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
318e0 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
318f0 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
31900 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
31910 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
31920 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
31930 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b      int addrEnd;
31940 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
31950 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  f processing for
31960 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
31970 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62      int sortPTab
31980 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64   = 0;   /* Pseud
31990 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64  otable used to d
319a0 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65  ecode sorting re
319b0 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  sults */.    int
319c0 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20   sortOut = 0;   
319d0 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73   /* Output regis
319e0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ter from the sor
319f0 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ter */.    int o
31a00 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f  rderByGrp = 0; /
31a10 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47 52  * True if the GR
31a20 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52  OUP BY and ORDER
31a30 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d 65   BY are the same
31a40 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   */..    /* Remo
31a50 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61  ve any and all a
31a60 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74  liases between t
31a70 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
31a80 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f  d the.    ** GRO
31a90 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
31aa0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
31ab0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
31ac0 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  nt k;           
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31ae0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
31af0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
31b00 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
31b10 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  m;  /* For loopi
31b20 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69  ng over expressi
31b30 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a  on in a list */.
31b40 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e  .      for(k=p->
31b50 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
31b60 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Item=p->pEList->
31b70 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
31b80 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
31b90 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
31ba0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
31bb0 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70      for(k=pGroup
31bc0 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  By->nExpr, pItem
31bd0 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e  =pGroupBy->a; k>
31be0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
31bf0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
31c00 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
31c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
31c20 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69 74  ssert( 66==sqlit
31c30 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b  e3LogEst(100) );
31c40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
31c50 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70 2d  electRow>66 ) p-
31c60 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36 36  >nSelectRow = 66
31c70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31c80 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
31c90 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29  lite3LogEst(1) )
31ca0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
31cb0 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  ctRow = 0;.    }
31cc0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
31cd0 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55  e is both a GROU
31ce0 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45  P BY and an ORDE
31cf0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
31d00 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20  they are.    ** 
31d10 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20  identical, then 
31d20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62  it may be possib
31d30 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  le to disable th
31d40 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
31d50 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  e .    ** on the
31d60 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68   grounds that th
31d70 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20  e GROUP BY will 
31d80 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74  cause elements t
31d90 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20  o come out .    
31da0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ** in the correc
31db0 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f  t order. It also
31dc0 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47   may not - the G
31dd0 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73  ROUP BY might us
31de0 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
31df0 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
31e00 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
31e10 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
31e20 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
31e30 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
31e40 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
31e50 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
31e60 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
31e70 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
31e80 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
31e90 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
31ea0 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
31eb0 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
31ec0 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
31ed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
31ee0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
31ef0 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
31f00 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
31f10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
31f20 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
31f30 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
31f40 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
31f50 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
31f60 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
31f70 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
31f80 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
31f90 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
31fa0 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
31fb0 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
31fc0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
31fd0 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
31fe0 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
31ff0 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
32000 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
32010 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
32020 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
32030 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
32040 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
32050 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
32060 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
32070 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
32080 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
32090 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
320a0 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
320b0 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
320c0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
320d0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
320e0 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
320f0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
32100 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
32110 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
32120 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
32130 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
32140 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
32150 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
32160 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
32170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
32180 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
32190 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
321a0 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
321b0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
321c0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
321d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
321e0 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68 65   pWhere==p->pWhe
321f0 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 68 61  re );.        ha
32200 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61 72  vingToWhere(pPar
32210 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70 48  se, pGroupBy, pH
32220 61 76 69 6e 67 2c 20 26 70 2d 3e 70 57 68 65 72  aving, &p->pWher
32230 65 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65  e);.        pWhe
32240 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
32250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
32260 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
32270 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
32280 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
32290 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
322a0 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
322b0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
322c0 20 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70     if( p->pGroup
322d0 42 79 3d 3d 30 20 26 26 20 70 2d 3e 70 48 61 76  By==0 && p->pHav
322e0 69 6e 67 3d 3d 30 20 26 26 20 73 41 67 67 49 6e  ing==0 && sAggIn
322f0 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  fo.nFunc==1 ){. 
32300 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20       minMaxFlag 
32310 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 64 62  = minMaxQuery(db
32320 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
32330 5b 30 5d 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e  [0].pExpr, &pMin
32340 4d 61 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  MaxOrderBy);.   
32350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69   }else{.      mi
32360 6e 4d 61 78 46 6c 61 67 20 3d 20 57 48 45 52 45  nMaxFlag = WHERE
32370 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
32380 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
32390 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
323a0 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
323b0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
323c0 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
323d0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
323e0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
323f0 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
32400 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
32410 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
32420 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
32430 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
32440 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
32450 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
32460 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
32470 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
32480 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
32490 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
324a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
324b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
324c0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
324d0 6c 65 63 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45  lect_end;.#if SE
324e0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
324f0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
32500 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
32510 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  x400 ){.      in
32520 74 20 69 69 3b 0a 20 20 20 20 20 20 53 45 4c 45  t ii;.      SELE
32530 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
32540 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61  arse,p,("After a
32550 67 67 72 65 67 61 74 65 20 61 6e 61 6c 79 73 69  ggregate analysi
32560 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73  s:\n"));.      s
32570 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
32580 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
32590 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
325a0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
325b0 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  mn; ii++){.     
325c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
325d0 72 69 6e 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d  rintf("agg-colum
325e0 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22  n[%d] iMem=%d\n"
325f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  ,.            ii
32600 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  , sAggInfo.aCol[
32610 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ii].iMem);.     
32620 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
32630 65 77 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e  ewExpr(0, sAggIn
32640 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70  fo.aCol[ii].pExp
32650 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
32660 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
32670 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
32680 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
32690 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
326a0 6e 74 66 28 22 61 67 67 2d 66 75 6e 63 5b 25 64  ntf("agg-func[%d
326b0 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20  ]: iMem=%d\n",. 
326c0 20 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73             ii, s
326d0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69  AggInfo.aFunc[ii
326e0 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
326f0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
32700 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f  Expr(0, sAggInfo
32710 2e 61 46 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72  .aFunc[ii].pExpr
32720 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
32730 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20    }.#endif...   
32740 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
32750 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
32760 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
32770 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
32780 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
32790 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
327a0 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
327b0 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
327c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
327d0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
327e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
327f0 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
32800 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
32810 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
32820 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
32830 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f  ddr1;          /
32840 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
32850 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
32860 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
32870 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
32880 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
32890 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
328a0 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
328b0 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
328c0 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
328d0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
328e0 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
328f0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
32900 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
32910 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
32920 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
32930 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
32940 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
32950 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
32960 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
32970 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
32980 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
32990 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
329a0 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
329b0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
329c0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
329d0 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
329e0 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
329f0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
32a00 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
32a10 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
32a20 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
32a30 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
32a40 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
32a50 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
32a60 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
32a70 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
32a80 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
32a90 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
32aa0 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
32ab0 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
32ac0 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
32ad0 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
32ae0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
32af0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
32b00 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
32b10 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  OP_SorterOpen in
32b20 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
32b30 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
32b40 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
32b50 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
32b60 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
32b70 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
32b80 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
32b90 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
32ba0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
32bb0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
32bc0 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  0, sAggInfo.nCol
32bd0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72  umn);.      addr
32be0 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
32bf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
32c00 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
32c10 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
32c20 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
32c30 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
32c40 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
32c50 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
32c60 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
32c70 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
32c80 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
32c90 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
32ca0 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
32cb0 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
32cc0 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
32cd0 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
32ce0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
32cf0 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
32d00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
32d10 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
32d20 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
32d30 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
32d40 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
32d50 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
32d60 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
32d70 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
32d80 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
32d90 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
32da0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
32db0 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
32dc0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
32dd0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
32de0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
32df0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
32e00 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
32e10 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
32e20 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
32e30 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
32e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32e50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
32e60 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
32e70 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
32e80 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
32e90 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
32ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32eb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
32ec0 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c  teger, 0, iUseFl
32ed0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
32ee0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
32ef0 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  cate accumulator
32f00 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20   empty"));.     
32f10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32f20 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
32f30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70  , iAMem, iAMem+p
32f40 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
32f50 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
32f60 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
32f70 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
32f80 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
32f90 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
32fa0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
32fb0 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
32fc0 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
32fd0 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
32fe0 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
32ff0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
33000 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
33010 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
33020 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
33030 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
33040 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
33050 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
33060 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
33070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33080 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
33090 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
330a0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
330b0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
330c0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
330d0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
330e0 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  re, pGroupBy, 0,
330f0 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
33100 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65  _GROUPBY | (orde
33110 72 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53  rByGrp ? WHERE_S
33120 4f 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c  ORTBYGROUP : 0),
33130 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
33140 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
33150 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
33160 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  d;.      if( sql
33170 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
33180 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f  ed(pWInfo)==pGro
33190 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  upBy->nExpr ){. 
331a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
331b0 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
331c0 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
331d0 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
331e0 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
331f0 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
33200 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
33210 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61  OpenEphemeral ta
33220 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
33230 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
33240 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
33250 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
33260 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
33270 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
33280 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
33290 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
332a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
332b0 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
332c0 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
332d0 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
332e0 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
332f0 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
33300 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
33310 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
33320 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
33330 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
33340 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
33350 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
33360 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
33370 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
33380 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
33390 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
333a0 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20    int regBase;. 
333b0 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65         int regRe
333c0 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  cord;.        in
333d0 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t nCol;.        
333e0 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20  int nGroupBy;.. 
333f0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65         explainTe
33400 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
33410 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44  .            (sD
33420 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
33430 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53  & (p->selFlags&S
33440 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20  F_Distinct)==0) 
33450 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
33460 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22        "DISTINCT"
33470 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a   : "GROUP BY");.
33480 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
33490 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
334a0 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
334b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
334c0 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
334d0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a  oupBy;.        j
334e0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
334f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
33500 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
33510 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
33520 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61    if( sAggInfo.a
33530 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f  Col[i].iSorterCo
33540 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
33550 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20         nCol++;. 
33560 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
33570 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
33590 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
335a0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
335b0 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
335c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
335d0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
335e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
335f0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
33600 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
33610 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20  By, regBase, 0, 
33620 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
33630 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
33640 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
33650 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
33660 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
33670 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
33680 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
33690 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
336a0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
336b0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
336c0 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
336d0 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
336e0 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
336f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
33700 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67  deGetColumnToReg
33710 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
33720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33730 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
33740 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75  Tab, pCol->iColu
33750 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  mn, pCol->iTable
33760 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
33770 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
33780 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
33790 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20        regRecord 
337a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
337b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
337c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
337d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
337e0 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
337f0 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72  , nCol, regRecor
33800 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
33810 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
33820 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
33830 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
33840 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64  ngIdx, regRecord
33850 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
33860 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
33870 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
33880 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
33890 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
338a0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
338b0 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  Base, nCol);.   
338c0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
338d0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
338e0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
338f0 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20  ortingIdxPTab = 
33900 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73  sortPTab = pPars
33910 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
33920 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c     sortOut = sql
33930 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
33940 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
33950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33960 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
33970 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f  do, sortPTab, so
33980 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rtOut, nCol);.  
33990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
339a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
339b0 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e  rterSort, sAggIn
339c0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
339d0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
339e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
339f0 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22   "GROUP BY sort"
33a00 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  )); VdbeCoverage
33a10 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  (v);.        sAg
33a20 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
33a30 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Idx = 1;.       
33a40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
33a50 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
33a60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33a70 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
33a80 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  or temporary tab
33a90 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47  le used by the G
33aa0 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20  ROUP BY sort.   
33ab0 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72     ** will natur
33ac0 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77  ally deliver row
33ad0 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72  s in the order r
33ae0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f  equired by the O
33af0 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a  RDER BY.      **
33b00 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20   clause, cancel 
33b10 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
33b20 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65  ble open coded e
33b30 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a  arlier..      **
33b40 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
33b50 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
33b60 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20  n - the correct 
33b70 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65  answer should re
33b80 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e  sult regardless.
33b90 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68  .      ** Use th
33ba0 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  e SQLITE_GroupBy
33bb0 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20  Order flag with 
33bc0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
33bd0 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20  OPTIMIZER to .  
33be0 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
33bf0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
33c00 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
33c10 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20  poses.  */.     
33c20 20 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20   if( orderByGrp 
33c30 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
33c40 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
33c50 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20  E_GroupByOrder) 
33c60 0a 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75  .       && (grou
33c70 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74  pBySort || sqlit
33c80 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28  e3WhereIsSorted(
33c90 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29  pWInfo)).      )
33ca0 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e  {.        sSort.
33cb0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
33cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33cd0 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
33ce0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
33cf0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ndex);.      }..
33d00 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
33d10 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
33d20 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64  OUP BY terms and
33d30 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31   store in b0, b1
33d40 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  , b2....      **
33d50 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c   (b0 is memory l
33d60 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c  ocation iBMem+0,
33d70 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20   b1 is iBMem+1, 
33d80 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20  and so forth).  
33d90 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70      ** Then comp
33da0 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
33db0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
33dc0 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50  gainst the GROUP
33dd0 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20   BY terms.      
33de0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  ** from the prev
33df0 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74  ious row current
33e00 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c  ly stored in a0,
33e10 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20   a1, a2....     
33e20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f   */.      addrTo
33e30 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  pOfLoop = sqlite
33e40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
33e50 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
33e60 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
33e70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
33e80 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
33e90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
33ea0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
33eb0 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73  OP_SorterData, s
33ec0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
33ed0 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
33ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f                so
33ef0 72 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29  rtOut, sortPTab)
33f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33f10 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
33f20 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
33f30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
33f40 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
33f50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33f60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
33f70 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c  olumn, sortPTab,
33f80 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20   j, iBMem+j);.  
33f90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33fa0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
33fb0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
33fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33fd0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
33fe0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
33ff0 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29  .pExpr, iBMem+j)
34000 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34010 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
34020 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
34030 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d  P_Compare, iAMem
34040 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iBMem, pGroupB
34050 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  y->nExpr,.      
34060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34070 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
34080 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
34090 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
340a0 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  FO);.      addr1
340b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
340c0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
340d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
340e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
340f0 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64  , addr1+1, 0, ad
34100 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  dr1+1); VdbeCove
34110 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
34120 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
34130 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
34140 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
34150 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
34160 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
34170 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
34180 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
34190 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
341a0 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
341b0 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
341c0 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
341d0 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
341e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
341f0 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
34200 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
34210 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
34220 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
34230 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
34240 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
34250 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
34260 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
34270 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
34280 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
34290 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
342a0 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
342b0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
342c0 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
342d0 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
342e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
342f0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
34300 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
34310 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
34320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34330 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
34340 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
34350 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
34360 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
34370 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
34380 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
34390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
343a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
343b0 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
343c0 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  ddrEnd); VdbeCov
343d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
343e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
343f0 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61  "check abort fla
34400 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
34410 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34420 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
34430 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
34440 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
34450 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63  nt((v, "reset ac
34460 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
34470 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
34480 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
34490 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
344a0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
344b0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
344c0 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
344d0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
344e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
344f0 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75   addr1);.      u
34500 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
34510 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
34520 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
34530 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
34540 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
34550 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
34560 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34570 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69  "indicate data i
34580 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
34590 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
345a0 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
345b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
345c0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
345d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
345e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
345f0 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e  rterNext, sAggIn
34600 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
34610 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
34620 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
34630 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
34640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
34650 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
34660 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
34670 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
34680 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
34690 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20  tingIdx);.      
346a0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70  }..      /* Outp
346b0 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ut the final row
346c0 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20   of result.     
346d0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
346e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
346f0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
34700 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
34710 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
34720 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
34730 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29  tput final row")
34740 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d  );..      /* Jum
34750 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f  p over the subro
34760 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a  utines.      */.
34770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34780 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64  eGoto(v, addrEnd
34790 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
347a0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
347b0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
347c0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
347d0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
347e0 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
347f0 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
34800 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
34810 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
34820 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
34830 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
34840 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
34850 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
34860 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
34870 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
34880 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
34890 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
348a0 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
348b0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
348c0 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
348d0 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
348e0 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
348f0 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
34900 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
34910 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
34920 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
34930 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
34940 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
34950 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
34960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34970 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
34980 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46  eger, 1, iAbortF
34990 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
349a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74  Comment((v, "set
349b0 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
349c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
349d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
349e0 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
349f0 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
34a00 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
34a10 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74  el(v, addrOutput
34a20 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72  Row);.      addr
34a30 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
34a40 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
34a50 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
34a60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
34a70 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65  , OP_IfPos, iUse
34a80 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
34a90 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  Row+2);.      Vd
34aa0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
34ab0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34ac0 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
34ad0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
34ae0 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
34af0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34b00 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
34b10 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
34b20 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
34b30 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
34b40 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
34b50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34b60 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
34b70 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
34b80 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
34b90 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
34ba0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
34bb0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
34bc0 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20  p, -1, &sSort,. 
34bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34be0 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c       &sDistinct,
34bf0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
34c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
34c10 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
34c20 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
34c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34c40 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
34c50 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
34c60 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
34c70 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
34c80 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
34c90 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
34ca0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
34cb0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
34cc0 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
34cd0 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
34ce0 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
34cf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
34d00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
34d10 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
34d20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
34d30 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
34d40 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
34d50 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
34d60 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
34d70 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
34d80 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
34d90 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
34da0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
34db0 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
34dc0 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 23 69  */.    else {.#i
34dd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34de0 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
34df0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
34e00 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20        if( (pTab 
34e10 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  = isSimpleCount(
34e20 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d  p, &sAggInfo))!=
34e30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
34e40 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  If isSimpleCount
34e50 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  () returns a poi
34e60 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20  nter to a Table 
34e70 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a  structure, then.
34e80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
34e90 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
34ea0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
34eb0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
34ec0 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
34ed0 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
34ee0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
34ef0 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
34f00 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
34f10 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65  returned represe
34f20 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e  nts table <tbl>.
34f30 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
34f40 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74      ** This stat
34f50 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d  ement is so comm
34f60 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70  on that it is op
34f70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c  timized speciall
34f80 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  y. The.        *
34f90 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72  * OP_Count instr
34fa0 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
34fb0 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65  ed either on the
34fc0 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68   intkey table th
34fd0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
34fe0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20  ntains the data 
34ff0 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20  for table <tbl> 
35000 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73  or on one of its
35010 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20   indexes. It.   
35020 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65       ** is bette
35030 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  r to execute the
35040 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c   op on an index,
35050 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20   as indexes are 
35060 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a  almost.        *
35070 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20  * always spread 
35080 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65  across less page
35090 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72  s than their cor
350a0 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
350b0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
350c0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
350d0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
350e0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
350f0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
35100 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63  hema);.        c
35110 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20  onst int iCsr = 
35120 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
35130 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
35140 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a   scan b-tree */.
35150 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
35160 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
35170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35180 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
35190 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79  e */.        Key
351a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
351b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
351c0 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72    /* Keyinfo for
351d0 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a   scanned index *
351e0 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
351f0 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
35200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35210 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75  * Best index fou
35220 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
35230 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d       int iRoot =
35240 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20   pTab->tnum;    
35250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
35260 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65  t page of scanne
35270 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  d b-tree */..   
35280 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
35290 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
352a0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
352b0 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
352c0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
352d0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
352e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
352f0 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
35300 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74   for the index t
35310 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65  hat has the lowe
35320 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20  st scan cost..  
35330 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
35340 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
35350 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
35360 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
35370 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
35380 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
35390 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29   ** (2013-10-03)
353a0 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68   Do not count th
353b0 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70  e entries in a p
353c0 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20  artial index..  
353d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
353e0 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
353f0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
35400 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
35410 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
35420 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
35430 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
35440 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
35450 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
35460 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
35470 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20  d(pTab) ) pBest 
35480 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
35490 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
354a0 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
354b0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
354c0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
354d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
354e0 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f    if( pIdx->bUno
354f0 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
35500 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a       && pIdx->sz
35510 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
35520 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20  abRow.          
35530 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49   && pIdx->pPartI
35540 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20  dxWhere==0.     
35550 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74        && (!pBest
35560 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   || pIdx->szIdxR
35570 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52  ow<pBest->szIdxR
35580 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ow).          ){
35590 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
355a0 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
355b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
355c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
355d0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
355e0 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74  iRoot = pBest->t
355f0 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  num;.          p
35600 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
35610 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
35620 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a  pParse, pBest);.
35630 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
35640 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61     /* Open a rea
35650 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65  d-only cursor, e
35660 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f  xecute the OP_Co
35670 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63  unt, close the c
35680 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ursor. */.      
35690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
356a0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
356b0 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
356c0 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20  ot, iDb, 1);.   
356d0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
356e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
356f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
35700 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
35710 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
35720 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
35730 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
35740 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
35750 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20  OP_Count, iCsr, 
35760 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
35770 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
35780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35790 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
357a0 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65  iCsr);.        e
357b0 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
357c0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  t(pParse, pTab, 
357d0 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pBest);.      }e
357e0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
357f0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
35800 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  OUNT */.      {.
35810 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
35820 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65  case runs if the
35830 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e   aggregate has n
35840 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
35850 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
35860 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
35870 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
35880 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
35890 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
358a0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74         ** of out
358b0 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  put..        */.
358c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
358d0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
358e0 3b 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41  ;.        resetA
358f0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
35900 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 0a  e, &sAggInfo);..
35910 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
35920 69 73 20 71 75 65 72 79 20 69 73 20 61 20 63 61  is query is a ca
35930 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
35940 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
35950 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 20  tion, then.     
35960 20 20 20 2a 2a 20 6d 69 6e 4d 61 78 46 6c 61 67     ** minMaxFlag
35970 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
35980 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 74  previously set t
35990 6f 20 65 69 74 68 65 72 0a 20 20 20 20 20 20 20  o either.       
359a0 20 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42   ** WHERE_ORDERB
359b0 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
359c0 52 44 45 52 42 59 5f 4d 41 58 20 61 6e 64 20 70  RDERBY_MAX and p
359d0 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20 77 69  MinMaxOrderBy wi
359e0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  ll.        ** be
359f0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
35a00 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
35a10 69 6f 6e 20 66 6f 72 20 74 68 65 20 6f 70 74 69  ion for the opti
35a20 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  mization..      
35a30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
35a40 65 72 74 28 20 6d 69 6e 4d 61 78 46 6c 61 67 3d  ert( minMaxFlag=
35a50 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e  =WHERE_ORDERBY_N
35a60 4f 52 4d 41 4c 20 7c 7c 20 70 4d 69 6e 4d 61 78  ORMAL || pMinMax
35a70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
35a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
35a90 69 6e 4d 61 78 4f 72 64 65 72 42 79 3d 3d 30 20  inMaxOrderBy==0 
35aa0 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42  || pMinMaxOrderB
35ab0 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 0a  y->nExpr==1 );..
35ac0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
35ad0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
35ae0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
35af0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
35b00 6e 4d 61 78 4f 72 64 65 72 42 79 2c 0a 20 20 20  nMaxOrderBy,.   
35b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b30 30 2c 20 6d 69 6e 4d 61 78 46 6c 61 67 2c 20 30  0, minMaxFlag, 0
35b40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
35b50 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
35b60 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
35b70 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
35b80 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41  .        updateA
35b90 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
35ba0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
35bb0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
35bc0 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
35bd0 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20  (pWInfo)>0 ){.  
35be0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
35bf0 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74  dbeGoto(v, sqlit
35c00 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
35c10 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20  l(pWInfo));.    
35c20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
35c30 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
35c40 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20  ndex",.         
35c50 20 20 20 20 20 20 20 28 6d 69 6e 4d 61 78 46 6c         (minMaxFl
35c60 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
35c70 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
35c80 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ")));.        }.
35c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
35ca0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
35cb0 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  .        finaliz
35cc0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
35cd0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
35ce0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
35cf0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
35d00 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
35d10 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
35d20 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
35d30 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
35d40 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
35d50 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
35d60 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c  p(pParse, p, -1,
35d70 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
35d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
35d90 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
35da0 64 72 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20  drEnd);.    }.  
35db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
35dc0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
35dd0 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
35de0 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
35df0 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  te query */..  i
35e00 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e  f( sDistinct.eTn
35e10 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
35e20 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
35e30 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
35e40 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
35e50 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
35e60 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
35e70 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
35e80 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
35e90 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
35ea0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
35eb0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
35ec0 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
35ed0 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
35ee0 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
35ef0 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
35f00 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
35f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35f20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42         sSort.nOB
35f30 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50  Sat>0 ? "RIGHT P
35f40 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22  ART OF ORDER BY"
35f50 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20  :"ORDER BY");.  
35f60 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
35f70 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73  il(pParse, p, &s
35f80 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Sort, pEList->nE
35f90 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
35fa0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
35fb0 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
35fc0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
35fd0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
35fe0 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
35ff0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68 61  /* The SELECT ha
36000 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66  s been coded. If
36010 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
36020 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20  or in the Parse 
36030 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20  structure,.  ** 
36040 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
36050 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77  ode to 1. Otherw
36060 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d  ise 0. */.  rc =
36070 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30   (pParse->nErr>0
36080 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  );..  /* Control
36090 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
360a0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
360b0 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
360c0 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
360d0 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
360e0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
360f0 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
36100 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
36110 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
36120 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
36130 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
36140 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
36150 65 28 64 62 2c 20 70 4d 69 6e 4d 61 78 4f 72 64  e(db, pMinMaxOrd
36160 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  erBy);.  sqlite3
36170 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
36180 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
36190 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
361a0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
361b0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
361c0 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54  ENABLED.  SELECT
361d0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
361e0 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73 69 6e  ,("end processin
361f0 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72 73 65  g\n"));.  pParse
36200 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d  ->nSelectIndent-
36210 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  -;.#endif.  retu
36220 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.