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

Artifact bbcfd919d795ba4796859aeaf2a202d9e0138fbfb5aa6c35fee816343cd82995:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  ee(db, p);.    p
0b50: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0b60: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0b70: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0b80: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0b90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ba0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
0bb0: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
0bc0: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
0bd0: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
0be0: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
0bf0: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
0c00: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
0c10: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
0c20: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
0c30: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
0c40: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
0c50: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
0c60: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0c70: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0c80: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0c90: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0ca0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0cb0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
0cc0: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
0cd0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0ce0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
0cf0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
0d00: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
0d10: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
0d20: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
0d30: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
0d40: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
0d50: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
0d60: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
0d70: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
0d80: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
0d90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
0da0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
0db0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
0dc0: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
0dd0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
0df0: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
0e00: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
0e10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0e20: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
0e30: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
0e40: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
0e50: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
0e60: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
0e70: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
0e80: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
0e90: 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  pLimit,         
0ea0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
0eb0: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
0ec0: 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  used */.  Expr *
0ed0: 70 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  pOffset         
0ee0: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
0ef0: 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20    NULL means no 
0f00: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
0f10: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
0f20: 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20  elect standin;. 
0f30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0f40: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
0f50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
0f60: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
0f70: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
0f80: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
0f90: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
0fa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
0fb0: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0fc0: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  in;.  }.  if( pE
0fd0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
0fe0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
0ff0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1000: 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  arse, 0, sqlite3
1010: 45 78 70 72 28 64 62 2c 54 4b 5f 41 53 54 45 52  Expr(db,TK_ASTER
1020: 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70  ISK,0));.  }.  p
1030: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  New->pEList = pE
1040: 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  List;.  pNew->op
1050: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
1060: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
1070: 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65   selFlags;.  pNe
1080: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
1090: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
10a0: 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   0;.#if SELECTTR
10b0: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e  ACE_ENABLED.  pN
10c0: 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20  ew->zSelName[0] 
10d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e  = 0;.#endif.  pN
10e0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
10f0: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
1100: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
1110: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1120: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
1130: 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20    if( pSrc==0 ) 
1140: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62  pSrc = sqlite3Db
1150: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1160: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1170: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
1180: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
1190: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
11a0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
11b0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
11c0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
11d0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
11e0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
11f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1200: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1210: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1220: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1230: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
1240: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70  t = pOffset;.  p
1250: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a  New->pWith = 0;.
1260: 20 20 61 73 73 65 72 74 28 20 70 4f 66 66 73 65    assert( pOffse
1270: 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d  t==0 || pLimit!=
1280: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
1290: 72 3e 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  r>0 || db->mallo
12a0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
12b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12c0: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65  iled ) {.    cle
12d0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
12e0: 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  w, pNew!=&standi
12f0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  n);.    pNew = 0
1300: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1310: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
1320: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
1330: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
1340: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
1350: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
1360: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20  rn pNew;.}..#if 
1370: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1380: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  LED./*.** Set th
1390: 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65  e name of a Sele
13a0: 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ct object.*/.voi
13b0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53  d sqlite3SelectS
13c0: 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70  etName(Select *p
13d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
13e0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ame){.  if( p &&
13f0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
1400: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1410: 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d  izeof(p->zSelNam
1420: 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), p->zSelName,
1430: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%s", zName);. 
1440: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1450: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
1460: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
1470: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
1480: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1490: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
14a0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
14b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
14c0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
14d0: 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64   ) clearSelect(d
14e0: 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  b, p, 1);.}../*.
14f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1500: 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
1510: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
1520: 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70  tement in a comp
1530: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
1540: 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68  Select *findRigh
1550: 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29  tmost(Select *p)
1560: 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e  {.  while( p->pN
1570: 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65  ext ) p = p->pNe
1580: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  xt;.  return p;.
1590: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31  }../*.** Given 1
15a0: 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72   to 3 identifier
15b0: 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65 20  s preceding the 
15c0: 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65  JOIN keyword, de
15d0: 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74  termine the.** t
15e0: 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65  ype of join.  Re
15f0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
1600: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78  constant that ex
1610: 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70  presses that typ
1620: 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66  e.** in terms of
1630: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
1640: 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a  it values:.**.**
1650: 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a       JT_INNER.**
1660: 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a       JT_CROSS.**
1670: 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a       JT_OUTER.**
1680: 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a       JT_NATURAL.
1690: 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a  **     JT_LEFT.*
16a0: 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a  *     JT_RIGHT.*
16b0: 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65  *.** A full oute
16c0: 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f  r join is the co
16d0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f  mbination of JT_
16e0: 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48  LEFT and JT_RIGH
16f0: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  T..**.** If an i
1700: 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70  llegal or unsupp
1710: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20  orted join type 
1720: 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74  is seen, then st
1730: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  ill return.** a 
1740: 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70  join type, but p
1750: 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  ut an error in t
1760: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
1770: 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
1780: 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73  te3JoinType(Pars
1790: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
17a0: 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c   *pA, Token *pB,
17b0: 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69   Token *pC){.  i
17c0: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  nt jointype = 0;
17d0: 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b  .  Token *apAll[
17e0: 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a  3];.  Token *p;.
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1810: 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33    0123456789 123
1820: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
1830: 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63   123 */.  static
1840: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
1850: 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61  Text[] = "natura
1860: 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c  leftouterightful
1870: 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20  linnercross";.  
1880: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1890: 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20  uct {.    u8 i; 
18a0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
18b0: 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74  ing of keyword t
18c0: 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b  ext in zKeyText[
18d0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61  ] */.    u8 nCha
18e0: 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20  r;    /* Length 
18f0: 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69  of the keyword i
1900: 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  n characters */.
1910: 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20      u8 code;    
1920: 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61   /* Join type ma
1930: 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f  sk */.  } aKeywo
1940: 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  rd[] = {.    /* 
1950: 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20  natural */ { 0, 
1960: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20   7, JT_NATURAL  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1980: 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20  .    /* left    
1990: 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c  */ { 6,  4, JT_L
19a0: 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20  EFT|JT_OUTER    
19b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
19c0: 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c  outer   */ { 10,
19d0: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20   5, JT_OUTER    
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
19f0: 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20  .    /* right   
1a00: 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52  */ { 14, 5, JT_R
1a10: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  IGHT|JT_OUTER   
1a20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1a30: 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c  full    */ { 19,
1a40: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
1a50: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
1a60: 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20  .    /* inner   
1a70: 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49  */ { 23, 5, JT_I
1a80: 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NNER            
1a90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1aa0: 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c  cross   */ { 28,
1ab0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
1ac0: 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c  CROSS         },
1ad0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
1ae0: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
1af0: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
1b00: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
1b10: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
1b20: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
1b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
1b40: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
1b50: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
1b60: 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b  e(aKeyword); j++
1b70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1b80: 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e  n==aKeyword[j].n
1b90: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
1ba0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
1bb0: 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20  mp((char*)p->z, 
1bc0: 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f  &zKeyText[aKeywo
1bd0: 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d  rd[j].i], p->n)=
1be0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
1bf0: 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f  intype |= aKeywo
1c00: 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  rd[j].code;.    
1c10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
1c30: 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a  tcase( j==0 || j
1c40: 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a  ==1 || j==2 || j
1c50: 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a  ==3 || j==4 || j
1c60: 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20  ==5 || j==6 );. 
1c70: 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53     if( j>=ArrayS
1c80: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b  ize(aKeyword) ){
1c90: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1ca0: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
1cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cc0: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
1cd0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
1ce0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
1cf0: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
1d00: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
1d10: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
1d20: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d  onst char *zSp =
1d40: 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74   " ";.    assert
1d50: 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pB!=0 );.    i
1d60: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b  f( pC==0 ){ zSp+
1d70: 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  +; }.    sqlite3
1d80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d90: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   "unknown or uns
1da0: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
1db0: 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54  pe: ".       "%T
1dc0: 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42   %T%s%T", pA, pB
1dd0: 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20  , zSp, pC);.    
1de0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1df0: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
1e00: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1e10: 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
1e20: 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65      && (jointype
1e30: 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   & (JT_LEFT|JT_R
1e40: 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20  IGHT))!=JT_LEFT 
1e50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1e60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1e70: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1e80: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1e90: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1ea0: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1eb0: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1ec0: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1ed0: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ef0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1f00: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
1f10: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1f20: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
1f30: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
1f40: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
1f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
1f60: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
1f70: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1f80: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1f90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1fa0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1fb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1fc0: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1fd0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1fe0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1ff0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
2000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
2010: 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74 61  h the first N ta
2020: 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72  bles in pSrc, fr
2030: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
2040: 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a  , looking for a.
2050: 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68 61  ** table that ha
2060: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  s a column named
2070: 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57   zCol.  .**.** W
2080: 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a  hen found, set *
2090: 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c  piTab and *piCol
20a0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e   to the table in
20b0: 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  dex and column i
20c0: 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  ndex.** of the m
20d0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61  atching column a
20e0: 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a  nd return TRUE..
20f0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75  **.** If not fou
2100: 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  nd, return FALSE
2110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2120: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
2130: 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  dex(.  SrcList *
2140: 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41  pSrc,       /* A
2150: 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74  rray of tables t
2160: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
2170: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
2180: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2190: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e  tables in pSrc->
21a0: 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  a[] to search */
21b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21c0: 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Col,    /* Name 
21d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65  of the column we
21e0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
21f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62   */.  int *piTab
2200: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ,          /* Wr
2210: 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72  ite index of pSr
2220: 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20  c->a[] here */. 
2230: 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20   int *piCol     
2240: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69        /* Write i
2250: 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b  ndex of pSrc->a[
2260: 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43  *piTab].pTab->aC
2270: 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ol[] here */.){.
2280: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2290: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
22a0: 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
22b0: 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  s in pSrc */.  i
22c0: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
22d0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
22e0: 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20  column matching 
22f0: 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  zCol */..  asser
2300: 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28  t( (piTab==0)==(
2310: 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a  piCol==0) );  /*
2320: 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72   Both or neither
2330: 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66   are NULL */.  f
2340: 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b  or(i=0; i<N; i++
2350: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f  ){.    iCol = co
2360: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e  lumnIndex(pSrc->
2370: 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29  a[i].pTab, zCol)
2380: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
2390: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
23a0: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  iTab ){.        
23b0: 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20  *piTab = i;.    
23c0: 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f      *piCol = iCo
23d0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
23e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
23f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2410: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2420: 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70  to add terms imp
2430: 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e  lied by JOIN syn
2440: 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  tax to the.** WH
2450: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
2460: 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43  ssion of a SELEC
2470: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65  T statement. The
2480: 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68   new term, which
2490: 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74  .** is ANDed wit
24a0: 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 57  h the existing W
24b0: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20  HERE clause, is 
24c0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
24d0: 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31  **    (tab1.col1
24e0: 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a   = tab2.col2).**
24f0: 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20 69  .** where tab1 i
2500: 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74 61  s the iSrc'th ta
2510: 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70  ble in SrcList p
2520: 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73 20  Src and tab2 is 
2530: 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29  the .** (iSrc+1)
2540: 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31  'th. Column col1
2550: 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c   is column iColL
2560: 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64  eft of tab1, and
2570: 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75   col2 is.** colu
2580: 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20  mn iColRight of 
2590: 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tab2..*/.static 
25a0: 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72  void addWhereTer
25b0: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
25c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
25d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
25e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
25f0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2610: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
2620: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
2630: 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20  .  int iLeft,   
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
2660: 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f  irst table to jo
2670: 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  in in pSrc */.  
2680: 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20  int iColLeft,   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
26b0: 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c  mn in first tabl
26c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  e */.  int iRigh
26d0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
26e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26f0: 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  of second table 
2700: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2710: 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20   iColRight,     
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2730: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
2740: 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  in second table 
2750: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72  */.  int isOuter
2760: 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Join,           
2770: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2780: 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52  this is an OUTER
2790: 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20   join */.  Expr 
27a0: 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20 20  **ppWhere       
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
27c0: 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45 20  /OUT: The WHERE 
27d0: 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f  clause to add to
27e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
27f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2800: 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a  b;.  Expr *pE1;.
2810: 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45    Expr *pE2;.  E
2820: 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73  xpr *pEq;..  ass
2830: 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68  ert( iLeft<iRigh
2840: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2850: 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74  Src->nSrc>iRight
2860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2870: 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61  rc->a[iLeft].pTa
2880: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
2890: 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70  Src->a[iRight].p
28a0: 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20  Tab );..  pE1 = 
28b0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
28c0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
28d0: 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66  , iLeft, iColLef
28e0: 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69  t);.  pE2 = sqli
28f0: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
2900: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52  xpr(db, pSrc, iR
2910: 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29  ight, iColRight)
2920: 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74  ;..  pEq = sqlit
2930: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2940: 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29  TK_EQ, pE1, pE2)
2950: 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20 69  ;.  if( pEq && i
2960: 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20  sOuterJoin ){.  
2970: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2980: 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f  y(pEq, EP_FromJo
2990: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
29a0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29b0: 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f  y(pEq, EP_TokenO
29c0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
29d0: 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56  );.    ExprSetVV
29e0: 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  AProperty(pEq, E
29f0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2a00: 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e   pEq->iRightJoin
2a10: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32  Table = (i16)pE2
2a20: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  ->iTable;.  }.  
2a30: 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  *ppWhere = sqlit
2a40: 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70  e3ExprAnd(db, *p
2a50: 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a  pWhere, pEq);.}.
2a60: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
2a70: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
2a80: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
2a90: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
2aa0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64  pression..** And
2ab0: 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52   set the Expr.iR
2ac0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f  ightJoinTable to
2ad0: 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72   iTable for ever
2ae0: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  y term in the.**
2af0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
2b00: 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ** The EP_FromJo
2b10: 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  in property is u
2b20: 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20  sed on terms of 
2b30: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
2b40: 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46   tell.** the LEF
2b50: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f  T OUTER JOIN pro
2b60: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68  cessing logic th
2b70: 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  at this term is 
2b80: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a  part of the.** j
2b90: 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20  oin restriction 
2ba0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2bb0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2bc0: 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61  use and not a pa
2bd0: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72  rt.** of the mor
2be0: 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20  e general WHERE 
2bf0: 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74  clause.  These t
2c00: 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f  erms are moved o
2c10: 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  ver to the.** WH
2c20: 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e  ERE clause durin
2c30: 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e  g join processin
2c40: 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f  g but we need to
2c50: 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74   remember that t
2c60: 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65  hey.** originate
2c70: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2c80: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
2c90: 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67  ** The Expr.iRig
2ca0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c  htJoinTable tell
2cb0: 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
2cc0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  se processing th
2cd0: 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  at the.** expres
2ce0: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
2cf0: 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e  table iRightJoin
2d00: 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68  Table even if th
2d10: 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  at table is not.
2d20: 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65  ** explicitly me
2d30: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65  ntioned in the e
2d40: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74  xpression.  That
2d50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2d60: 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61  needed.** for ca
2d70: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ses like this:.*
2d80: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
2d90: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
2da0: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
2db0: 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a  .b AND t1.x=5.**
2dc0: 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c  .** The where cl
2dd0: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65  ause needs to de
2de0: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
2df0: 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a   of the t1.x=5.*
2e00: 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74  * term until aft
2e10: 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f  er the t2 loop o
2e20: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20  f the join.  In 
2e30: 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e  that way, a.** N
2e40: 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20  ULL t2 row will 
2e50: 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  be inserted when
2e60: 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49  ever t1.x!=5.  I
2e70: 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64  f we do not.** d
2e80: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2e90: 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20  g of t1.x=5, it 
2ea0: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
2eb0: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  d immediately.**
2ec0: 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f   after the t1 lo
2ed0: 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68  op and rows with
2ee0: 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65   t1.x!=5 will ne
2ef0: 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ver appear in.**
2f00: 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69   the output, whi
2f10: 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e  ch is incorrect.
2f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f30: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
2f40: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2f50: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
2f60: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2f70: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
2f80: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
2f90: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2fa0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
2fb0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2fc0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2fd0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
2fe0: 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e  Reduce);.    p->
2ff0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
3000: 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20  = (i16)iTable;. 
3010: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
3020: 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e  _FUNCTION && p->
3030: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
3040: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
3050: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c  r(i=0; i<p->x.pL
3060: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
3070: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69  {.        setJoi
3080: 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74  nExpr(p->x.pList
3090: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
30a0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  able);.      }. 
30b0: 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e     }.    setJoin
30c0: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69  Expr(p->pLeft, i
30d0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20  Table);.    p = 
30e0: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
30f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3100: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
3110: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
3120: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
3130: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
3140: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
3150: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
3160: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
3170: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
3180: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
3190: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
31a0: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
31b0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
31c0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20  **.** The terms 
31d0: 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
31e0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
31f0: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
3200: 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  c structure..** 
3210: 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61  The left most ta
3220: 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74  ble is the first
3230: 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74   entry in Select
3240: 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68  .pSrc.  The righ
3250: 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20  t-most.** table 
3260: 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
3270: 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65  y.  The join ope
3280: 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e  rator is held in
3290: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a   the entry to.**
32a0: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73   the left.  Thus
32b0: 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e   entry 0 contain
32c0: 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
32d0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  tor for the join
32e0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72   between.** entr
32f0: 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e  ies 0 and 1.  An
3300: 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  y ON or USING cl
3310: 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64  auses associated
3320: 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61   with the join a
3330: 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63  re.** also attac
3340: 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
3350: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
3360: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
3370: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3380: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
3390: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
33a0: 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  t sqliteProcessJ
33b0: 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  oin(Parse *pPars
33c0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
33d0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69   /* All tables i
3400: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
3410: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
3440: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72  ounters */.  str
3450: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
3460: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *pLeft;     /* 
3470: 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67  Left table being
3480: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72   joined */.  str
3490: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
34a0: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20   *pRight;    /* 
34b0: 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e  Right table bein
34c0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70  g joined */..  p
34d0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
34e0: 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e   pLeft = &pSrc->
34f0: 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d  a[0];.  pRight =
3500: 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f   &pLeft[1];.  fo
3510: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
3520: 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67  Src-1; i++, pRig
3530: 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a  ht++, pLeft++){.
3540: 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74      Table *pLeft
3550: 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61  Tab = pLeft->pTa
3560: 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  b;.    Table *pR
3570: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
3580: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20  ->pTab;.    int 
3590: 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66  isOuter;..    if
35a0: 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62  ( NEVER(pLeftTab
35b0: 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62  ==0 || pRightTab
35c0: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
35d0: 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28  .    isOuter = (
35e0: 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74  pRight->fg.joint
35f0: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
3600: 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
3610: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
3620: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
3630: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
3640: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
3650: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
3660: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
3670: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
3680: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
3690: 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  f( pRight->fg.jo
36a0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
36b0: 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RAL ){.      if(
36c0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20   pRight->pOn || 
36d0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
36e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3700: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
3710: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
3720: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
3730: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3740: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
3750: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3760: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
3770: 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e  ; j<pRightTab->n
3780: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
3790: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20     char *zName; 
37a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
37b0: 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74  umn in the right
37c0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
37d0: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
37e0: 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66   /* Matching lef
37f0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
3800: 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b     int iLeftCol;
3810: 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f    /* Matching co
3820: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74  lumn in the left
3830: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20   table */..     
3840: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68     zName = pRigh
3850: 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  tTab->aCol[j].zN
3860: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
3870: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
3880: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
3890: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
38a0: 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20  iLeftCol) ){.   
38b0: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
38c0: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
38d0: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
38e0: 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20  l, i+1, j,.     
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
3910: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
3920: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3930: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
3940: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
3950: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
3960: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
3970: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3980: 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74  t->pOn && pRight
3990: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
39a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
39b0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
39c0: 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61  t have both ON a
39d0: 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20  nd USING ".     
39e0: 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74     "clauses in t
39f0: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a  he same join");.
3a00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3a10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
3a20: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
3a30: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
3a40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
3a50: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
3a60: 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   ** an AND opera
3a70: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
3a80: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
3a90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  ){.      if( isO
3aa0: 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78  uter ) setJoinEx
3ab0: 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20  pr(pRight->pOn, 
3ac0: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29  pRight->iCursor)
3ad0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
3ae0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
3af0: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
3b00: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
3b10: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
3b20: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
3b30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
3b40: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
3b50: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
3b60: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
3b70: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
3b80: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
3b90: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
3ba0: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
3bb0: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
3bc0: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
3bd0: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
3be0: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
3bf0: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
3c00: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
3c10: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
3c20: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
3c30: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
3c40: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
3c50: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
3c60: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
3c70: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
3c80: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
3c90: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
3ca0: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
3cb0: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
3cc0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3cd0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3ce0: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
3cf0: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
3d00: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
3d10: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
3d20: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
3d30: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
3d40: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3d50: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53  e term in the US
3d60: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
3d70: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b        int iLeft;
3d80: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
3d90: 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74 68  on the left with
3da0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3db0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
3dc0: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3dd0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
3de0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
3df0: 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66  olumn on the lef
3e00: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  t */.        int
3e10: 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a   iRightCol;   /*
3e20: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3e30: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
3e40: 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  n on the right *
3e50: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
3e60: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a   = pList->a[j].z
3e70: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52  Name;.        iR
3e80: 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e  ightCol = column
3e90: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
3ea0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3eb0: 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30   if( iRightCol<0
3ec0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61  .         || !ta
3ed0: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3ee0: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3ef0: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
3f00: 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29  ftCol).        )
3f10: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
3f20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3f30: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e  se, "cannot join
3f40: 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73   using column %s
3f50: 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20   - column ".    
3f60: 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65          "not pre
3f70: 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62  sent in both tab
3f80: 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  les", zName);.  
3f90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3fa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3fb0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3fc0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
3fd0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
3fe0: 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a  i+1, iRightCol,.
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
4010: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
4020: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
4030: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46  eturn 0;.}../* F
4040: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
4050: 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e   */.static KeyIn
4060: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
4070: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
4080: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4090: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
40a0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
40b0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
40c0: 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f  Form the KeyInfo
40d0: 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69   object from thi
40e0: 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20  s ExprList */.  
40f0: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
4100: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69       /* Begin wi
4110: 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f  th this column o
4120: 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  f pList */.  int
4130: 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
4140: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
4150: 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  ny extra columns
4160: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29   to the end */.)
4170: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ;../*.** Generat
4180: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
4190: 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64   push the record
41a0: 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 72 65   in registers re
41b0: 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68  gData.** through
41c0: 20 72 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31   regData+nData-1
41d0: 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   onto the sorter
41e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
41f0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4200: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4210: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
4220: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4230: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
4240: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4250: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
4260: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
4270: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
4280: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  elect,       /* 
4290: 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54  The whole SELECT
42a0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
42b0: 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20 20 20  int regData,    
42c0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
42d0: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
42e0: 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74   data to be sort
42f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
4300: 72 69 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f  rigData,       /
4310: 2a 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72  * First register
4320: 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65   holding data be
4330: 66 6f 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a  fore packing */.
4340: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
4350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4360: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
4370: 6e 20 74 68 65 20 64 61 74 61 20 61 72 72 61 79  n the data array
4380: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
4390: 78 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  xReg         /* 
43a0: 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72  No. of reg prior
43b0: 20 74 6f 20 72 65 67 44 61 74 61 20 61 76 61 69   to regData avai
43c0: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f  lable for use */
43d0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
43e0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75         /* Stmt u
4410: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
4420: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20  n */.  int bSeq 
4430: 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  = ((pSort->sortF
4440: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
4450: 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a  UseSorter)==0);.
4460: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53    int nExpr = pS
4470: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ort->pOrderBy->n
4480: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
4490: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44     /* No. of ORD
44a0: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
44b0: 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78   int nBase = nEx
44c0: 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74  pr + bSeq + nDat
44d0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
44e0: 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73    /* Fields in s
44f0: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a  orter record */.
4500: 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73     /* Regs for s
4540: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a  orter record */.
4550: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20    int regRecord 
4560: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
4570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4580: 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20     /* Assembled 
4590: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
45a0: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
45b0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20  pSort->nOBSat;  
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20      /* ORDER BY 
45e0: 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f  terms to skip */
45f0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
4620: 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72 65  to add sorter re
4630: 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a  cord to sorter *
4640: 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20  /.  int iLimit; 
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
4670: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
4680: 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c  sert( bSeq==0 ||
4690: 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73   bSeq==1 );.  as
46a0: 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c  sert( nData==1 |
46b0: 7c 20 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72  | regData==regOr
46c0: 69 67 44 61 74 61 20 7c 7c 20 72 65 67 4f 72 69  igData || regOri
46d0: 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66  gData==0 );.  if
46e0: 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a  ( nPrefixReg ){.
46f0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65      assert( nPre
4700: 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53  fixReg==nExpr+bS
4710: 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73  eq );.    regBas
4720: 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45  e = regData - nE
4730: 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65  xpr - bSeq;.  }e
4740: 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65  lse{.    regBase
4750: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
4760: 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  + 1;.    pParse-
4770: 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a  >nMem += nBase;.
4780: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53    }.  assert( pS
4790: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d  elect->iOffset==
47a0: 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c  0 || pSelect->iL
47b0: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69  imit!=0 );.  iLi
47c0: 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69  mit = pSelect->i
47d0: 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74  Offset ? pSelect
47e0: 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53  ->iOffset+1 : pS
47f0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
4800: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
4810: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
4820: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73  akeLabel(v);.  s
4830: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
4840: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
4850: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Sort->pOrderBy, 
4860: 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67  regBase, regOrig
4870: 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20  Data,.          
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
48a0: 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61 3f 20  | (regOrigData? 
48b0: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
48c0: 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62 53 65  : 0));.  if( bSe
48d0: 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  q ){.    sqlite3
48e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
48f0: 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74  _Sequence, pSort
4900: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42  ->iECursor, regB
4910: 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  ase+nExpr);.  }.
4920: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
4930: 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30 20 29  ==0 && nData>0 )
4940: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4950: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
4960: 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42 61  , regData, regBa
4970: 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e  se+nExpr+bSeq, n
4980: 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Data);.  }.  sql
4990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
49a0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
49b0: 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c   regBase+nOBSat,
49c0: 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72   nBase-nOBSat, r
49d0: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
49e0: 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20   nOBSat>0 ){.   
49f0: 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b   int regPrevKey;
4a00: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
4a10: 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f  nOBSat columns o
4a20: 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  f the previous r
4a30: 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ow */.    int ad
4a40: 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41  drFirst;    /* A
4a50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
4a60: 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f  _IfNot opcode */
4a70: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70  .    int addrJmp
4a80: 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
4a90: 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70  s of the OP_Jump
4aa0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56   opcode */.    V
4ab0: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
4ac0: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20   /* Opcode that 
4ad0: 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72  opens the sorter
4ae0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79   */.    int nKey
4af0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
4b00: 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b  ber of sorting k
4b10: 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c  ey columns, incl
4b20: 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63  uding OP_Sequenc
4b30: 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  e */.    KeyInfo
4b40: 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72   *pKI;     /* Or
4b50: 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f  iginal KeyInfo o
4b60: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61 62  n the sorter tab
4b70: 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72  le */..    regPr
4b80: 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e  evKey = pParse->
4b90: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
4ba0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72  se->nMem += pSor
4bb0: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e  t->nOBSat;.    n
4bc0: 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53  Key = nExpr - pS
4bd0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53  ort->nOBSat + bS
4be0: 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71  eq;.    if( bSeq
4bf0: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69   ){.      addrFi
4c00: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
4c10: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4c20: 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  Not, regBase+nEx
4c30: 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b  pr); .    }else{
4c40: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4c60: 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp1(v, OP_Seque
4c70: 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e  nceTest, pSort->
4c80: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d  iECursor);.    }
4c90: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
4ca0: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
4cb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4cc0: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72  P_Compare, regPr
4cd0: 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20  evKey, regBase, 
4ce0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a  pSort->nOBSat);.
4cf0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
4d00: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53  3VdbeGetOp(v, pS
4d10: 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64  ort->addrSortInd
4d20: 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ex);.    if( pPa
4d30: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
4d40: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
4d50: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b      pOp->p2 = nK
4d60: 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20  ey + nData;.    
4d70: 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  pKI = pOp->p4.pK
4d80: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73  eyInfo;.    mems
4d90: 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64  et(pKI->aSortOrd
4da0: 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65  er, 0, pKI->nFie
4db0: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
4dc0: 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74  _Jump below test
4dd0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  able */.    sqli
4de0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4df0: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b  v, -1, (char*)pK
4e00: 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  I, P4_KEYINFO);.
4e10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
4e20: 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a  I->nXField>2 );.
4e30: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79      pOp->p4.pKey
4e40: 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
4e50: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
4e60: 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  e, pSort->pOrder
4e70: 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20  By, nOBSat,.    
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69         pKI->nXFi
4eb0: 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  eld-1);.    addr
4ec0: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
4ed0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
4ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4ef0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
4f00: 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c  p, addrJmp+1, 0,
4f10: 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62   addrJmp+1); Vdb
4f20: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4f30: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b    pSort->labelBk
4f40: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Out = sqlite3Vdb
4f50: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
4f60: 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74     pSort->regRet
4f70: 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
4f80: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
4f90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4fa0: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
4fb0: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
4fc0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
4fd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4fe0: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
4ff0: 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69  Sorter, pSort->i
5000: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  ECursor);.    if
5010: 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ( iLimit ){.    
5020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5030: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
5040: 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e   iLimit, pSort->
5050: 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20  labelDone);.    
5060: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5070: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5080: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
5090: 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a  (v, addrFirst);.
50a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
50b0: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
50c0: 72 65 67 42 61 73 65 2c 20 72 65 67 50 72 65 76  regBase, regPrev
50d0: 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  Key, pSort->nOBS
50e0: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
50f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5100: 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20  addrJmp);.  }.  
5110: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
5120: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
5130: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
5140: 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49   op = OP_SorterI
5150: 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nsert;.  }else{.
5160: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49      op = OP_IdxI
5170: 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  nsert;.  }.  sql
5180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5190: 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e  t(v, op, pSort->
51a0: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
51b0: 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ord,.           
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 42              regB
51d0: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73  ase+nOBSat, nBas
51e0: 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28  e-nOBSat);.  if(
51f0: 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69   iLimit ){.    i
5200: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74  nt addr;.    int
5210: 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20   r1 = 0;.    /* 
5220: 46 69 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20  Fill the sorter 
5230: 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
5240: 73 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65  s LIMIT+OFFSET e
5250: 6e 74 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c  ntries.  (The iL
5260: 69 6d 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69  imit.    ** regi
5270: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
5280: 7a 65 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f  zed with value o
5290: 66 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29  f LIMIT+OFFSET.)
52a0: 20 20 41 66 74 65 72 20 74 68 65 20 73 6f 72 74    After the sort
52b0: 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20  er.    ** fills 
52c0: 75 70 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  up, delete the l
52d0: 65 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  east entry in th
52e0: 65 20 73 6f 72 74 65 72 20 61 66 74 65 72 20 65  e sorter after e
52f0: 61 63 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20  ach insert..    
5300: 2a 2a 20 54 68 75 73 20 77 65 20 6e 65 76 65 72  ** Thus we never
5310: 20 68 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20   hold more than 
5320: 74 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  the LIMIT+OFFSET
5330: 20 72 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20   rows in memory 
5340: 61 74 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61  at once */.    a
5350: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
5360: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
5370: 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29  NotZero, iLimit)
5380: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5390: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
53a0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c  beAddOp1(v, OP_L
53b0: 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ast, pSort->iECu
53c0: 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70  rsor);.    if( p
53d0: 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Sort->bOrderedIn
53e0: 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20  nerLoop ){.     
53f0: 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r1 = ++pParse->
5400: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
5410: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5420: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72   OP_Column, pSor
5430: 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78  t->iECursor, nEx
5440: 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  pr, r1);.      V
5450: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5460: 73 65 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20  seq"));.    }.  
5470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5480: 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
5490: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
54a0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72  r);.    if( pSor
54b0: 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  t->bOrderedInner
54c0: 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Loop ){.      /*
54d0: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
54e0: 6f 70 20 69 73 20 64 72 69 76 65 6e 20 62 79 20  op is driven by 
54f0: 61 6e 20 69 6e 64 65 78 20 73 75 63 68 20 74 68  an index such th
5500: 61 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20  at values from. 
5510: 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
5520: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
5530: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65  e inner loop are
5540: 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
5550: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
5560: 69 6d 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70  immediately jump
5570: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
5580: 72 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e  ration of an inn
5590: 65 72 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20  er loop if the. 
55a0: 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72       ** entry fr
55b0: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  om the current i
55c0: 74 65 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  teration does no
55d0: 74 20 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74  t fit into the t
55e0: 6f 70 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49  op.      ** LIMI
55f0: 54 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  T+OFFSET entries
5600: 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20   of the sorter. 
5610: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72  */.      int iBr
5620: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  k = sqlite3VdbeC
5630: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
5640: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
5650: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5660: 5f 45 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  _Eq, regBase+nEx
5670: 70 72 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20  pr, iBrk, r1);. 
5680: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5690: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
56a0: 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
56b0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
56c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
56d0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
56e0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d  (v, addr);.  }.}
56f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
5700: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
5710: 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74  e OFFSET.*/.stat
5720: 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73  ic void codeOffs
5730: 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  et(.  Vdbe *v,  
5740: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
5750: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
5760: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69  is VM */.  int i
5770: 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20  Offset,      /* 
5780: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
5790: 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e   the offset coun
57a0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ter */.  int iCo
57b0: 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75  ntinue     /* Ju
57c0: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
57d0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
57e0: 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  rd */.){.  if( i
57f0: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
5800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5810: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  3(v, OP_IfPos, i
5820: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
5830: 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72  e, 1); VdbeCover
5840: 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
5850: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
5860: 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  SET"));.  }.}../
5870: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
5880: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
5890: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e   make sure the N
58a0: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
58b0: 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66  ing at iMem.** f
58c0: 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65  orm a distinct e
58d0: 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61  ntry.  iTab is a
58e0: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
58f0: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
5900: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
5910: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
5920: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
5930: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
5940: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
5950: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
5960: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
5970: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
5980: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
5990: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
59a0: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
59b0: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
59c0: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
59d0: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
59e0: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
59f0: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
5a00: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
5a10: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
5a20: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
5a30: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
5a40: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
5a50: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
5a60: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
5a70: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
5a80: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
5a90: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
5aa0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
5ab0: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
5ac0: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
5ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5ae0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a  er of elements *
5af0: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
5b00: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
5b10: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
5b20: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72  Vdbe *v;.  int r
5b30: 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  1;..  v = pParse
5b40: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20  ->pVdbe;.  r1 = 
5b50: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5b60: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
5b70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5b80: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
5b90: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
5ba0: 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43   iMem, N); VdbeC
5bb0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
5bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5bd0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5be0: 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a  , iMem, N, r1);.
5bf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5c00: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
5c10: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
5c20: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71  , iMem, N);.  sq
5c30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5c40: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
5c50: 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
5c60: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5c70: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5c90: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
5ca0: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
5cb0: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
5cc0: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
5cd0: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
5ce0: 20 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65   If srcTab is ne
5cf0: 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65  gative, then the
5d00: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
5d10: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
5d20: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
5d30: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
5d40: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
5d50: 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72  srcTab is.** zer
5d60: 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20  o or more, then 
5d70: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
5d80: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
5d90: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
5da0: 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  ly .** to get th
5db0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
5dc0: 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c  mns and the coll
5dd0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
5de0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
5df0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
5e00: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
5e10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5e30: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
5e40: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e60: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
5e70: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
5e80: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
5e90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
5ea0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
5eb0: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
5ec0: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
5ed0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
5ee0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
5ef0: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
5f00: 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  le */.  SortCtx 
5f10: 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20  *pSort,         
5f20: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
5f30: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
5f40: 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20  rocess ORDER BY 
5f50: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
5f60: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
5f70: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
5f80: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
5f90: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
5fa0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
5fb0: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
5fc0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
5fd0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
5fe0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
5ff0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
6000: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
6010: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
6020: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
6030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
6040: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
6050: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
6060: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
6070: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
6080: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
6090: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
60a0: 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nct;            
60b0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
60c0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
60d0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
60e0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
60f0: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
6100: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
6110: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6120: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
6130: 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72  >iSDParm; /* Fir
6140: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
6150: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
6160: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
6170: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
6180: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
6190: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
61a0: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
61b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
61c0: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
61d0: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
61e0: 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20   regResult */.. 
61f0: 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67   /* Usually, reg
6200: 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69  Result is the fi
6210: 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61  rst cell in an a
6220: 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63  rray of memory c
6230: 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ells.  ** contai
6240: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
6250: 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20   result row. In 
6260: 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69  this case regOri
6270: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  g is set to the.
6280: 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e    ** same value.
6290: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
62a0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69   results are bei
62b0: 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73  ng sent to the s
62c0: 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20  orter, the.  ** 
62d0: 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65  values for any e
62e0: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
62f0: 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66  are also part of
6300: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72   the sort-key ar
6310: 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66  e omitted.  ** f
6320: 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20  rom this array. 
6330: 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67  In this case reg
6340: 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a  Orig is set to z
6350: 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ero.  */.  int r
6360: 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  egResult;       
6370: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
6380: 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e  of memory holdin
6390: 67 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74  g current result
63a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72  s */.  int regOr
63b0: 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ig;             
63c0: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
63d0: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75  emory holding fu
63e0: 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29  ll result (or 0)
63f0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76   */..  assert( v
6400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
6410: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73  List!=0 );.  has
6420: 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74  Distinct = pDist
6430: 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74  inct ? pDistinct
6440: 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48  ->eTnctType : WH
6450: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
6460: 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26  P;.  if( pSort &
6470: 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  & pSort->pOrderB
6480: 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30  y==0 ) pSort = 0
6490: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30  ;.  if( pSort==0
64a0: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
64b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
64c0: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a  iContinue!=0 );.
64d0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
64e0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
64f0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20  ontinue);.  }.. 
6500: 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71   /* Pull the req
6510: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  uested columns..
6520: 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f    */.  nResultCo
6530: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
6540: 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d  r;..  if( pDest-
6550: 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >iSdst==0 ){.   
6560: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
6570: 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d      nPrefixReg =
6580: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
6590: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
65a0: 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74  f( !(pSort->sort
65b0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
65c0: 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50  _UseSorter) ) nP
65d0: 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20  refixReg++;.    
65e0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
65f0: 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  = nPrefixReg;.  
6600: 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69    }.    pDest->i
6610: 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Sdst = pParse->n
6620: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
6630: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
6640: 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  ltCol;.  }else i
6650: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b  f( pDest->iSdst+
6660: 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61  nResultCol > pPa
6670: 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20  rse->nMem ){.   
6680: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65   /* This is an e
6690: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74  rror condition t
66a0: 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20  hat can result, 
66b0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
66c0: 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  n a SELECT.    *
66d0: 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  * on the right-h
66e0: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49  and side of an I
66f0: 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d  NSERT contains m
6700: 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ore result colum
6710: 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74  ns than.    ** t
6720: 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73  here are columns
6730: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   in the table on
6740: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20   the left.  The 
6750: 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61  error will be ca
6760: 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ught.    ** and 
6770: 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20  reported later. 
6780: 20 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   But we need to 
6790: 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68  make sure enough
67a0: 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63   memory is alloc
67b0: 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61  ated.    ** to a
67c0: 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69  void other spuri
67d0: 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68  ous errors in th
67e0: 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20  e meantime. */. 
67f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
6800: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
6810: 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73   }.  pDest->nSds
6820: 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  t = nResultCol;.
6830: 20 20 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52    regOrig = regR
6840: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
6850: 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54  Sdst;.  if( srcT
6860: 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ab>=0 ){.    for
6870: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
6880: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6890: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
68a0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
68b0: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
68c0: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56  sult+i);.      V
68d0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
68e0: 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  %s", pEList->a[i
68f0: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
6900: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
6910: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
6920: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
6930: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
6940: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
6950: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
6960: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
6970: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
6980: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
6990: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
69a0: 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c  */.    u8 ecelFl
69b0: 61 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ags;.    if( eDe
69c0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
69d0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
69e0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
69f0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
6a00: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51    ecelFlags = SQ
6a10: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20  LITE_ECEL_DUP;. 
6a20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6a30: 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ecelFlags = 0;. 
6a40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
6a50: 72 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63  rt && hasDistinc
6a60: 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53  t==0 && eDest!=S
6a70: 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65  RT_EphemTab && e
6a80: 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
6a90: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
6aa0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
6ab0: 69 6e 20 70 45 4c 69 73 74 20 74 68 61 74 20 69  in pEList that i
6ac0: 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65  s a copy of an e
6ad0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20  xpression in.   
6ae0: 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20     ** the ORDER 
6af0: 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74  BY clause (pSort
6b00: 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74  ->pOrderBy), set
6b10: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
6b20: 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72  .      ** iOrder
6b30: 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f  ByCol value to o
6b40: 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  ne more than the
6b50: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52   index of the OR
6b60: 44 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a  DER BY .      **
6b70: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
6b80: 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  in the sort-key 
6b90: 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72  that pushOntoSor
6ba0: 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72  ter() will gener
6bb0: 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ate..      ** Th
6bc0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 45  is allows the pE
6bd0: 4c 69 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65  List field to be
6be0: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
6bf0: 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c  e sorted record,
6c00: 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  .      ** saving
6c10: 20 73 70 61 63 65 20 61 6e 64 20 43 50 55 20 63   space and CPU c
6c20: 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ycles.  */.     
6c30: 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53   ecelFlags |= (S
6c40: 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
6c50: 45 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  EF|SQLITE_ECEL_R
6c60: 45 46 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  EF);.      for(i
6c70: 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20  =pSort->nOBSat; 
6c80: 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  i<pSort->pOrderB
6c90: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
6ca0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
6cb0: 20 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20         if( (j = 
6cc0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
6cd0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
6ce0: 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20  ByCol)>0 ){.    
6cf0: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
6d00: 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  j-1].u.x.iOrderB
6d10: 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74  yCol = i+1-pSort
6d20: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20  ->nOBSat;.      
6d30: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6d40: 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20    regOrig = 0;. 
6d50: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
6d60: 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65  st==SRT_Set || e
6d70: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20  Dest==SRT_Mem . 
6d80: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65            || eDe
6d90: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6da0: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
6db0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a  Output );.    }.
6dc0: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
6dd0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6de0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6df0: 70 45 4c 69 73 74 2c 72 65 67 52 65 73 75 6c 74  pEList,regResult
6e00: 2c 30 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20  ,0,ecelFlags);. 
6e10: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
6e20: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
6e30: 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20   was present on 
6e40: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
6e50: 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ment.  ** and th
6e60: 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  is row has been 
6e70: 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65  seen before, the
6e80: 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68  n do not make th
6e90: 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74  is row.  ** part
6ea0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
6eb0: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69    */.  if( hasDi
6ec0: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77  stinct ){.    sw
6ed0: 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d  itch( pDistinct-
6ee0: 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20  >eTnctType ){.  
6ef0: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
6f00: 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
6f10: 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f   {.        VdbeO
6f20: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20  p *pOp;         
6f30: 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20     /* No longer 
6f40: 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68  required OpenEph
6f50: 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f  emeral instr. */
6f60: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75  .        int iJu
6f70: 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mp;             
6f80: 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61   /* Jump destina
6f90: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
6fa0: 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
6fb0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
6fc0: 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20  ous row content 
6fd0: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  */..        /* A
6fe0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
6ff0: 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  r the previous r
7000: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ow */.        re
7010: 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
7020: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
7030: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
7040: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20  nResultCol;..   
7050: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
7060: 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
7070: 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65  ral coded earlie
7080: 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a  r to an OP_Null.
7090: 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20          ** sets 
70a0: 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20  the MEM_Cleared 
70b0: 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74  bit on the first
70c0: 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65   register of the
70d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
70e0: 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69  ious value.  Thi
70f0: 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
7100: 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20   OP_Ne below to 
7110: 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a  always.        *
7120: 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69  * fail on the fi
7130: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
7140: 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69   the loop even i
7150: 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  f the first.    
7160: 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c      ** row is al
7170: 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20  l NULLs..       
7180: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
7190: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
71a0: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
71b0: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
71c0: 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
71d0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
71e0: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
71f0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
7200: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75  ->opcode = OP_Nu
7210: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  ll;.        pOp-
7220: 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  >p1 = 1;.       
7230: 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72   pOp->p2 = regPr
7240: 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75  ev;..        iJu
7250: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
7260: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7270: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20   nResultCol;.   
7280: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7290: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
72a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  {.          Coll
72b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
72c0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
72d0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
72e0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
72f0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
7300: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
7310: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7320: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7330: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
7340: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
7350: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
7360: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7370: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7380: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
7390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
73a0: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
73b0: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
73c0: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
73d0: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
73e0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
73f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7410: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
7420: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
7430: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
7440: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7450: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
7460: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
7470: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7480: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7490: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
74a0: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
74b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
74c0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
74d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
74e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
74f0: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
7500: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
7510: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
7520: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
7530: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
7540: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
7550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7560: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
7570: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7580: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
7590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
75a0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
75b0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
75c0: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
75d0: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
75e0: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
75f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
7600: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
7610: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
7620: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
7630: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7650: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
7660: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7670: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7680: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
7690: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
76a0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
76b0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
76c0: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
76d0: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
76e0: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
76f0: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
7700: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
7710: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
7720: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
7730: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
7740: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7750: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
7760: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
7770: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
7780: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
7790: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
77a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
77b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
77c0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
77d0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
77e0: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
77f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7800: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7810: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7820: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
7830: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
7840: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
7850: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
7860: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
7870: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7880: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
7890: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
78a0: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
78b0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
78c0: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
78d0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
78e0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
78f0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
7900: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
7910: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
7920: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7930: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
7940: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7950: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
7960: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
7970: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7980: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  tCol);.      bre
7990: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
79a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
79b0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
79c0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  */..    /* Store
79d0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
79e0: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
79f0: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
7a00: 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f     case SRT_Fifo
7a10: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
7a20: 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  istFifo:.    cas
7a30: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
7a40: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
7a50: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
7a60: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7a70: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7a80: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
7a90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7aa0: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
7ab0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7ac0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
7ad0: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
7ae0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7af0: 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  ==SRT_Fifo );.  
7b00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7b10: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
7b20: 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  o );.      sqlit
7b30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7b40: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
7b50: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7b60: 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78  tCol, r1+nPrefix
7b70: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
7b80: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7b90: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
7ba0: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20  RT_DistFifo ){. 
7bb0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7bc0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
7bd0: 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63  DistFifo, then c
7be0: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
7bf0: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
7c00: 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72  ** on an ephemer
7c10: 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  al index. If the
7c20: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
7c30: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a  already present.
7c40: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
7c50: 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20  e index, do not 
7c60: 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
7c70: 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20  output. If not, 
7c80: 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  add the.        
7c90: 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74  ** current row t
7ca0: 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  o the index and 
7cb0: 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69  proceed with wri
7cc0: 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20  ting it to the. 
7cd0: 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
7ce0: 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20   table as well. 
7cf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7d00: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
7d10: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
7d20: 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71   + 4;.        sq
7d30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7d40: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
7d50: 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72  iParm+1, addr, r
7d60: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 0);.        V
7d70: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7d80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7d90: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
7da0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7db0: 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73  arm+1, r1,regRes
7dc0: 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  ult,nResultCol);
7dd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7de0: 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20   pSort==0 );.   
7df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7e00: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
7e10: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
7e20: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
7e30: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
7e40: 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c  ixReg,regResult,
7e50: 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  1,nPrefixReg);. 
7e60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7e70: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
7e80: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
7e90: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
7ea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7eb0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7ec0: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
7ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7ee0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7ef0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
7f00: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
7f10: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7f20: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
7f30: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
7f40: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7f50: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
7f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
7f70: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7f80: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
7f90: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
7fa0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7fb0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
7fc0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7fd0: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
7fe0: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
7ff0: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
8000: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
8010: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
8020: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
8030: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
8040: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
8050: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
8060: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
8070: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
8080: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
8090: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
80a0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
80b0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
80c0: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
80d0: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
80e0: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
80f0: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
8100: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
8110: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
8120: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
8130: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
8140: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
8150: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
8160: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
8170: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
8180: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
8190: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
81a0: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
81b0: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
81c0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
81d0: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
81e0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
81f0: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
8200: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
8210: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
8220: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8230: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
8240: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
8250: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
8260: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
8270: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
8280: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
8290: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
82a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
82b0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
82c0: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
82d0: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
82e0: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
82f0: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
8300: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
8310: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
8320: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
8330: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
8340: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
8350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8360: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
8370: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8380: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
8390: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
83a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
83b0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
83c0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
83d0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
83e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
83f0: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
8400: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
8410: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
8420: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
8430: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8440: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
8450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8460: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8470: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
8480: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
8490: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
84a0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
84b0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
84c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
84d0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
84e0: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
84f0: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
8500: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
8510: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
8520: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
8530: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
8540: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
8550: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
8560: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8570: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
8580: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
8590: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
85a0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
85b0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
85c0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
85d0: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
85e0: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
85f0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
8600: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
8610: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
8620: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
8630: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
8640: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
8650: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8660: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
8670: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
8680: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8690: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
86a0: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
86b0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
86c0: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
86d0: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
86e0: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
86f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8700: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
8710: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8720: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
8730: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
8740: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
8750: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
8760: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
8770: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
8780: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
8790: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
87a0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
87b0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
87c0: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
87d0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
87e0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
87f0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8800: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
8810: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
8820: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
8830: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
8840: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
8850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8860: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
8870: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8880: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8890: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
88a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
88b0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
88c0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
88d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
88e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
88f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8900: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
8910: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
8920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8930: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
8940: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
8950: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8960: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
8970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8980: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8990: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
89a0: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
89b0: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
89c0: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
89d0: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
89e0: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
89f0: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
8a00: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
8a10: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
8a20: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
8a30: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
8a40: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
8a50: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
8a60: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
8a70: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
8a80: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
8a90: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
8aa0: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
8ab0: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
8ac0: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
8ad0: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
8ae0: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
8af0: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
8b00: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
8b10: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
8b20: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
8b30: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
8b40: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
8b50: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
8b60: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
8b70: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
8b80: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
8b90: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
8ba0: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
8bb0: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
8bc0: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
8bd0: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
8be0: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
8bf0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
8c00: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8c10: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
8c20: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
8c30: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
8c40: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
8c50: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
8c60: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8c70: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8c80: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
8c90: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
8ca0: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
8cb0: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
8cc0: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
8cd0: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
8ce0: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
8cf0: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
8d00: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
8d10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
8d20: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
8d30: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
8d40: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
8d50: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8d60: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
8d70: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
8da0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8db0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
8dc0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8de0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8df0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8e00: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8e10: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
8e20: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8e30: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
8e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8e50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8e60: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
8e70: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
8e80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8e90: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
8ea0: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
8eb0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
8ec0: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
8ed0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8ee0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8ef0: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
8f20: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
8f30: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
8f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8f70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8f80: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
8f90: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
8fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8fb0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
8fc0: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
8fd0: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
8fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ff0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
9000: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
9010: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
9020: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
9030: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
9040: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
9050: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
9060: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
9070: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9090: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
90a0: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
90b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
90c0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
90d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
90e0: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
90f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
9100: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
9110: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
9120: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
9130: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
9140: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
9150: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
9160: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
9170: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
9180: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
9190: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
91a0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
91b0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
91c0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
91d0: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
91e0: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
91f0: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
9200: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
9210: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
9220: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
9230: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
9240: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9250: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
9260: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
9270: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
9280: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
9290: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
92a0: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
92b0: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
92c0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
92d0: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
92e0: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
92f0: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
9300: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
9310: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
9320: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
9330: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9340: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
9350: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
9360: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
9370: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
9380: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
9390: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
93a0: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
93b0: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
93c0: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
93d0: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
93e0: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
93f0: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
9400: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
9410: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
9420: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
9430: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
9440: 2a 29 2b 31 29 3b 0a 20 20 4b 65 79 49 6e 66 6f  *)+1);.  KeyInfo
9450: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
9460: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
9470: 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
9480: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
9490: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
94a0: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
94b0: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
94c0: 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75    p->nField = (u
94d0: 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46  16)N;.    p->nXF
94e0: 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20  ield = (u16)X;. 
94f0: 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28     p->enc = ENC(
9500: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
9510: 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66   db;.    p->nRef
9520: 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 1;.    memset
9530: 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72  (&p[1], 0, nExtr
9540: 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  a);.  }else{.   
9550: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
9560: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (db);.  }.  retu
9570: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
9580: 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49  eallocate a KeyI
9590: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  nfo object.*/.vo
95a0: 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  id sqlite3KeyInf
95b0: 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a  oUnref(KeyInfo *
95c0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
95d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
95e0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
95f0: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
9600: 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69  ->nRef==0 ) sqli
9610: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
9620: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
9630: 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69  * Make a new poi
9640: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
9650: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49  o object.*/.KeyI
9660: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
9670: 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a  nfoRef(KeyInfo *
9680: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
9690: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
96a0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
96b0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Ref++;.  }.  ret
96c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn p;.}..#ifdef
96d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
96e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
96f0: 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  if a KeyInfo obj
9700: 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67  ect can be chang
9710: 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  e.  The KeyInfo 
9720: 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e  object.** can on
9730: 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66  ly be changed if
9740: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20   this is just a 
9750: 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65  single reference
9760: 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a   to the object..
9770: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9780: 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
9790: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
97a0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
97b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79  /.int sqlite3Key
97c0: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
97d0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74  KeyInfo *p){ ret
97e0: 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20  urn p->nRef==1; 
97f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9800: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
9810: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
9820: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
9830: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
9840: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
9850: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
9860: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
9870: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
9880: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
9890: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
98a0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
98b0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
98c0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
98d0: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
98e0: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
98f0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
9900: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
9910: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
9920: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
9930: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
9940: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
9950: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
9960: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
9970: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
9980: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
9990: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
99a0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
99b0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
99c0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
99d0: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
99e0: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
99f0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
9a00: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
9a10: 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
9a20: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
9a30: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
9a40: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
9a50: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
9a60: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
9a70: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
9a80: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
9a90: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
9aa0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
9ab0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
9ac0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
9ad0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9ae0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9af0: 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74  t,     /* Form t
9b00: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
9b10: 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72  t from this Expr
9b20: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  List */.  int iS
9b30: 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f  tart,          /
9b40: 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69  * Begin with thi
9b50: 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73  s column of pLis
9b60: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  t */.  int nExtr
9b70: 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  a           /* A
9b80: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74  dd this many ext
9b90: 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  ra columns to th
9ba0: 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e end */.){.  in
9bb0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
9bc0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
9bd0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
9be0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
9bf0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9c00: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ->db;.  int i;..
9c10: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
9c20: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
9c30: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
9c40: 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d  Alloc(db, nExpr-
9c50: 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31  iStart, nExtra+1
9c60: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29  );.  if( pInfo )
9c70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
9c80: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
9c90: 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29  iteable(pInfo) )
9ca0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61  ;.    for(i=iSta
9cb0: 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  rt, pItem=pList-
9cc0: 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78  >a+iStart; i<nEx
9cd0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
9ce0: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
9cf0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
9d00: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
9d10: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
9d20: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
9d30: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
9d40: 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
9d50: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
9d60: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d   pInfo->aColl[i-
9d70: 69 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b  iStart] = pColl;
9d80: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  .      pInfo->aS
9d90: 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72  ortOrder[i-iStar
9da0: 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74  t] = pItem->sort
9db0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
9dc0: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b  .  return pInfo;
9dd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  .}../*.** Name o
9de0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9df0: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
9e00: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
9e10: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
9e20: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
9e30: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
9e40: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
9e50: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
9e60: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
9e70: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
9e80: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9e90: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
9ea0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
9eb0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
9ec0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
9ed0: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
9ee0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9ef0: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
9f00: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
9f10: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9f20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
9f30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9f40: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
9f50: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
9f60: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
9f70: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
9f80: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
9f90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
9fa0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
9fb0: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
9fc0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
9fd0: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
9fe0: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
9ff0: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
a000: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
a010: 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20  .**   "USE TEMP 
a020: 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a  B-TREE FOR xxx".
a030: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20  **.** where xxx 
a040: 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49  is one of "DISTI
a050: 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22  NCT", "ORDER BY"
a060: 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20   or "GROUP BY". 
a070: 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a  Exactly which.**
a080: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
a090: 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67  y the zUsage arg
a0a0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a0b0: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d   void explainTem
a0c0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
a0d0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
a0e0: 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28   *zUsage){.  if(
a0f0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
a100: 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==2 ){.    Vdbe 
a110: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a120: 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  be;.    char *zM
a130: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
a140: 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
a150: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
a160: 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65   FOR %s", zUsage
a170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a180: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a190: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a1a0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a1b0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a1c0: 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
a1d0: 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69   Assign expressi
a1e0: 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61  on b to lvalue a
a1f0: 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f  . A second, no-o
a200: 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  p, version of th
a210: 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70  is macro.** is p
a220: 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c  rovided when SQL
a230: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a240: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69   is defined. Thi
a250: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64  s allows the cod
a260: 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53  e.** in sqlite3S
a270: 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67  elect() to assig
a280: 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75  n values to stru
a290: 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72  cture member var
a2a0: 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f  iables that.** o
a2b0: 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c  nly exist if SQL
a2c0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a2d0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
a2e0: 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e  without pollutin
a2f0: 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  g the.** code wi
a300: 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63  th #ifndef direc
a310: 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69  tives..*/.# defi
a320: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
a330: 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62  eger(a, b) a = b
a340: 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  ..#else./* No-op
a350: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
a360: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
a370: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
a380: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
a390: 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
a3a0: 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65  (y,z).# define e
a3b0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
a3c0: 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69  (y,z).#endif..#i
a3d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a3e0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
a3f0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a400: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
a410: 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55  _SELECT)./*.** U
a420: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
a430: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
a440: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
a450: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
a460: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
a470: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
a480: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
a490: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
a4a0: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
a4b0: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
a4c0: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f   caption is of o
a4d0: 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f  ne of the two fo
a4e0: 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f  rms:.**.**   "CO
a4f0: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
a500: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
a510: 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43  b2 (op)".**   "C
a520: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
a530: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
a540: 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42  ub2 USING TEMP B
a550: 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a  -TREE (op)".**.*
a560: 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e  * where iSub1 an
a570: 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20  d iSub2 are the 
a580: 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20  integers passed 
a590: 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  as the correspon
a5a0: 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ding.** function
a5b0: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64   parameters, and
a5c0: 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20   op is the text 
a5d0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
a5e0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a  f the parameter.
a5f0: 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ** of the same n
a600: 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74  ame. The paramet
a610: 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20  er "op" must be 
a620: 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  one of TK_UNION,
a630: 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54   TK_EXCEPT,.** T
a640: 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54  K_INTERSECT or T
a650: 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74  K_ALL. The first
a660: 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66   form is used if
a670: 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d   argument bUseTm
a680: 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20  p is .** false, 
a690: 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f  or the second fo
a6a0: 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65  rm if it is true
a6b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a6c0: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
a6d0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
a6e0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
a6f0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
a700: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
a710: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a730: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
a740: 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f  K_EXCEPT etc. */
a750: 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20  .  int iSub1,   
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a770: 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69     /* Subquery i
a780: 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  d 1 */.  int iSu
a790: 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b2,             
a7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71           /* Subq
a7b0: 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69  uery id 2 */.  i
a7c0: 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20  nt bUseTmp      
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a7e0: 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70  * True if a temp
a7f0: 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20   table was used 
a800: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
a810: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20  op==TK_UNION || 
a820: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
a830: 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
a840: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  T || op==TK_ALL 
a850: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
a860: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
a870: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
a880: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
a890: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
a8a0: 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20  ite3MPrintf(.   
a8b0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
a8c0: 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55   "COMPOUND SUBQU
a8d0: 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20  ERIES %d AND %d 
a8e0: 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20  %s(%s)", iSub1, 
a8f0: 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62  iSub2,.        b
a900: 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45  UseTmp?"USING TE
a910: 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20  MP B-TREE ":"", 
a920: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29  selectOpName(op)
a930: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
a940: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
a950: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
a960: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
a970: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
a980: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
a990: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
a9a0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
a9b0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
a9c0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
a9d0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
a9e0: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c  lainComposite(v,
a9f0: 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  w,x,y,z).#endif.
aa00: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
aa10: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
aa20: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
aa30: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
aa40: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
aa50: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
aa60: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
aa70: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
aa80: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
aa90: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
aaa0: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
aab0: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
aac0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
aad0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
aae0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
aaf0: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
ab00: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
ab10: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
ab20: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
ab30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ab40: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ab50: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
ab60: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
ab70: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ab80: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
ab90: 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f  pSort,   /* Info
aba0: 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f  rmation on the O
abb0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
abc0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
abd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
abe0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
abf0: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
ac00: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
ac10: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
ac20: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
ac30: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ac40: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
ac70: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
ac80: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70  nt addrBreak = p
ac90: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b  Sort->labelDone;
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
acb0: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
acc0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
acd0: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
ace0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
acf0: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
ad00: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
ad10: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
ad20: 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63  r;.  int addrOnc
ad30: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  e = 0;.  int iTa
ad40: 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  b;.  ExprList *p
ad50: 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d  OrderBy = pSort-
ad60: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
ad70: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
ad80: 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61  eDest;.  int iPa
ad90: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
ada0: 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  arm;.  int regRo
adb0: 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  w;.  int regRowi
adc0: 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  d;.  int iCol;. 
add0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
ade0: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae00: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
ae10: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
ae20: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae40: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
ae50: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
ae60: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
ae70: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
aea0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
aeb0: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
aec0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
aed0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45  List_item *aOutE
aee0: 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  x = p->pEList->a
aef0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  ;..  assert( add
af00: 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66  rBreak<0 );.  if
af10: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
af20: 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
af30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af40: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
af50: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
af60: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
af70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
af80: 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b  oto(v, addrBreak
af90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
afa0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
afb0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
afc0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
afd0: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
afe0: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
aff0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
b000: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b010: 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ine || eDest==SR
b020: 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 67  T_Mem ){.    reg
b030: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72  Rowid = 0;.    r
b040: 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69  egRow = pDest->i
b050: 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44  Sdst;.    nSortD
b060: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
b070: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52   }else{.    regR
b080: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
b090: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
b0a0: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73  ;.    regRow = s
b0b0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
b0c0: 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75  ge(pParse, nColu
b0d0: 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61  mn);.    nSortDa
b0e0: 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ta = nColumn;.  
b0f0: 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65  }.  nKey = pOrde
b100: 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  rBy->nExpr - pSo
b110: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66  rt->nOBSat;.  if
b120: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
b130: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
b140: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
b150: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
b160: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
b170: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70      iSortTab = p
b180: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
b190: 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61     if( pSort->la
b1a0: 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20  belBkOut ){.    
b1b0: 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
b1c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
b1d0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
b1e0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b1f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
b200: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
b210: 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74  penPseudo, iSort
b220: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
b230: 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74   nKey+1+nSortDat
b240: 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  a);.    if( addr
b250: 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  Once ) sqlite3Vd
b260: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b270: 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64  drOnce);.    add
b280: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
b290: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b2a0: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
b2b0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
b2c0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b2d0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
b2e0: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
b2f0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
b300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b310: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
b320: 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65  erData, iTab, re
b330: 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54  gSortOut, iSortT
b340: 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  ab);.    bSeq = 
b350: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
b360: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
b370: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b380: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
b390: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
b3a0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b3b0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
b3c0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
b3d0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f  ntinue);.    iSo
b3e0: 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  rtTab = iTab;.  
b3f0: 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a    bSeq = 1;.  }.
b400: 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d    for(i=0, iCol=
b410: 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c 6e 53 6f  nKey+bSeq; i<nSo
b420: 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20  rtData; i++){.  
b430: 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 20    int iRead;.   
b440: 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75   if( aOutEx[i].u
b450: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29  .x.iOrderByCol )
b460: 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d 20  {.      iRead = 
b470: 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f  aOutEx[i].u.x.iO
b480: 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20  rderByCol-1;.   
b490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
b4a0: 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b 0a 20 20  ead = iCol++;.  
b4b0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b4c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b4d0: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
b4e0: 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77 2b  , iRead, regRow+
b4f0: 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  i);.    VdbeComm
b500: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f  ent((v, "%s", aO
b510: 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20  utEx[i].zName ? 
b520: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
b530: 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61  : aOutEx[i].zSpa
b540: 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n));.  }.  switc
b550: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
b560: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
b570: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
b580: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
b590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b5a0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
b5b0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
b5c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b5d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b5e0: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
b5f0: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
b600: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b610: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b620: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
b630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b640: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
b650: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
b660: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
b670: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b680: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74  ( nColumn==sqlit
b690: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74  e3Strlen30(pDest
b6a0: 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a 20  ->zAffSdst) );. 
b6b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b6c0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
b6d0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
b6e0: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77   nColumn, regRow
b6f0: 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  id,.            
b700: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
b710: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f  t->zAffSdst, nCo
b720: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
b730: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
b740: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
b750: 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  se, regRow, nCol
b760: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
b770: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
b780: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
b790: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
b7a0: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
b7b0: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
b7c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b7d0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
b7e0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
b7f0: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
b800: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
b810: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
b820: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
b830: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
b840: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
b850: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b860: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
b870: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
b880: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
b890: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
b8a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b8b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
b8c0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
b8d0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
b8e0: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
b8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b900: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
b910: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
b920: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
b930: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b940: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
b950: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
b960: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
b970: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b990: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b9a0: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
b9b0: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
b9c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b9d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
b9e0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
b9f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
ba00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ba10: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
ba20: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
ba30: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d   nColumn);.    }
ba40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
ba50: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ba60: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
ba70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ba80: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ba90: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
baa0: 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  wid);.  }.  /* T
bab0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
bac0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
bad0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
bae0: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
baf0: 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f  inue);.  if( pSo
bb00: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
bb10: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
bb20: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
bb30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bb40: 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54  P_SorterNext, iT
bb50: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
bb60: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65  overage(v);.  }e
bb70: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
bb80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bb90: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
bba0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
bbb0: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
bbc0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
bbd0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
bbe0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
bbf0: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
bc00: 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rn);.  sqlite3Vd
bc10: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
bc20: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a  , addrBreak);.}.
bc30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
bc40: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
bc50: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
bc60: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
bc70: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
bc80: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
bc90: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
bca0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
bcb0: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
bcc0: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ler..**.** Also 
bcd0: 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
bce0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bcf0: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61  returned value a
bd00: 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a  nd return that.*
bd10: 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73  * result in *pEs
bd20: 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  tWidth..**.** Th
bd30: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bd40: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
bd50: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
bd60: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
bd70: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
bd80: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
bd90: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
bda0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
bdb0: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
bdc0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
bdd0: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
bde0: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
bdf0: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
be00: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
be10: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
be20: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
be30: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
be40: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
be50: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
be60: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
be70: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
be80: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
be90: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
bea0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
beb0: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
bec0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
bed0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
bee0: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
bef0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
bf00: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
bf10: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
bf20: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
bf30: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
bf40: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
bf50: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
bf60: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
bf70: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
bf80: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
bf90: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
bfa0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
bfb0: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69  s routine has ei
bfc0: 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72 61  ther 3 or 6 para
bfd0: 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67  meters depending
bfe0: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
bff0: 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ot.** the SQLITE
c000: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c010: 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d  ETADATA compile-
c020: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75  time option is u
c030: 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
c040: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c050: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64  UMN_METADATA.# d
c060: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
c070: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
c080: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
c090: 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20  ,C,D,E,F).#else 
c0a0: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
c0b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c0c0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
c0d0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
c0e0: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
c0f0: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
c100: 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73  (A,B,F).#endif.s
c110: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c120: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
c130: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
c140: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
c150: 45 78 70 72 2c 0a 23 69 66 64 65 66 20 53 51 4c  Expr,.#ifdef SQL
c160: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
c170: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 6f 6e  N_METADATA.  con
c180: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
c190: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
c1a0: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
c1b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
c1c0: 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20  rigCol,.#endif. 
c1d0: 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29   u8 *pEstWidth.)
c1e0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
c1f0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
c200: 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74   j;.  u8 estWidt
c210: 68 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  h = 1;.#ifdef SQ
c220: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c230: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68  MN_METADATA.  ch
c240: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
c250: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
c260: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
c270: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
c280: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
c290: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
c2a0: 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61   pExpr!=0 );.  a
c2b0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
c2c0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 77 69  List!=0 );.  swi
c2d0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
c2e0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
c2f0: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
c300: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
c310: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c320: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
c330: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
c340: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
c350: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
c360: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
c370: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
c380: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
c390: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
c3a0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
c3b0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
c3c0: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
c3d0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
c3e0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
c3f0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
c400: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
c410: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c420: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
c430: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
c440: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
c450: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
c460: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
c470: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
c480: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
c490: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
c4a0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
c4b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c4c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
c4d0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
c4e0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
c4f0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
c500: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
c510: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
c520: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
c530: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
c540: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
c550: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
c560: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
c570: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
c580: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
c590: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
c5a0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
c5b0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
c5c0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
c5d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
c5e0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
c5f0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
c600: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
c610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c620: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
c630: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
c640: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
c650: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
c660: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
c670: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
c680: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
c690: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
c6a0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
c6b0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
c6c0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
c6d0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
c6e0: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
c6f0: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
c700: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
c710: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
c720: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
c730: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
c740: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
c750: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
c760: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
c770: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
c780: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
c790: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
c7a0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c7b0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
c7c0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
c7d0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
c7e0: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
c7f0: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
c800: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
c810: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
c820: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
c830: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
c840: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
c850: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
c860: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
c870: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
c880: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
c890: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
c8a0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
c8b0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
c8c0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
c8d0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
c8e0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
c8f0: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
c900: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
c910: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
c920: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
c930: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
c940: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
c950: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
c960: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
c970: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
c980: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
c990: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
c9a0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
c9b0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
c9c0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
c9d0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
c9e0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c9f0: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
ca00: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
ca10: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
ca20: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
ca30: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
ca40: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
ca50: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
ca60: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
ca70: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
ca80: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
ca90: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
caa0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
cab0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
cac0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
cad0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
cae0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
caf0: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
cb00: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
cb10: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
cb20: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
cb30: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
cb40: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
cb50: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
cb60: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
cb70: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
cb80: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
cb90: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
cba0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
cbb0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
cbc0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
cbd0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
cbe0: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
cbf0: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
cc00: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
cc10: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
cc20: 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
cc30: 54 68 65 20 41 4c 57 41 59 53 28 29 20 69 73 20  The ALWAYS() is 
cc40: 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53  because iCol>=pS
cc50: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
cc60: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 20  will have been. 
cc70: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 67           ** caug
cc80: 68 74 20 61 6c 72 65 61 64 79 20 62 79 20 6e 61  ht already by na
cc90: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20  me resolution.. 
cca0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
ccb0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
ccc0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
ccd0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
cce0: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
ccf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
cd00: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
cd10: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
cd20: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
cd30: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
cd40: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
cd50: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
cd60: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
cd70: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
cd80: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
cd90: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
cda0: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20  idth); .        
cdb0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
cdc0: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
cdd0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
cde0: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
cdf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
ce00: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
ce10: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
ce20: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
ce30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
ce40: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
ce50: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
ce60: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
ce70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
ce80: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
ce90: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cea0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
ceb0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
cec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
ced0: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
cee0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cef0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
cf00: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
cf10: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
cf20: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
cf30: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
cf40: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
cf50: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ],0);.          
cf60: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
cf70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
cf80: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
cf90: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
cfa0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
cfb0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
cfc0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
cfd0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
cfe0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
cff0: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
d000: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
d010: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
d020: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
d030: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
d040: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zDbSName;.      
d050: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
d060: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
d070: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
d080: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
d090: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d0a0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
d0b0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
d0c0: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
d0d0: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ],0);.          
d0e0: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
d0f0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
d100: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
d110: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
d120: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d130: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d140: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
d150: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
d160: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
d170: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
d180: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
d190: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
d1a0: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
d1b0: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
d1c0: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
d1d0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
d1e0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
d1f0: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
d200: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
d210: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
d220: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
d230: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
d240: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
d250: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
d260: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
d270: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
d280: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
d290: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
d2a0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
d2b0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
d2c0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
d2d0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
d2e0: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
d2f0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
d300: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
d310: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d320: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
d330: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
d340: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
d350: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
d360: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
d370: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d380: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
d390: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
d3a0: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
d3b0: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
d3c0: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
d3d0: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
d3e0: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
d3f0: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
d400: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
d410: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
d420: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
d430: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
d440: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
d450: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
d460: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
d470: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
d480: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
d490: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
d4a0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
d4b0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
d4c0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
d4d0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
d4e0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
d4f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d500: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
d510: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
d520: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
d530: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
d540: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d550: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
d560: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
d570: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d580: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
d590: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
d5a0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
d5b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d5c0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
d5d0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
d5e0: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
d5f0: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
d600: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
d610: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
d620: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d630: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
d640: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
d650: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d660: 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51  zType;.#ifdef SQ
d670: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
d680: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
d690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
d6a0: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
d6b0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
d6c0: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
d6d0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
d6e0: 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  = 0;.    zType =
d6f0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d700: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
d710: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
d720: 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Col, 0);..    /*
d730: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
d740: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
d750: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
d760: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
d770: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
d780: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
d790: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
d7a0: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
d7b0: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
d7c0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
d7d0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
d7e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d7f0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d800: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
d810: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
d820: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d840: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d850: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
d860: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
d870: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
d880: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d890: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d8a0: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
d8b0: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
d8c0: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
d8d0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
d8e0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
d8f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
d900: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
d910: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d920: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
d930: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
d940: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
d950: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
d960: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d970: 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a  _DECLTYPE) */.}.
d980: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d990: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
d9a0: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
d9b0: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
d9c0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
d9d0: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
d9e0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
d9f0: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
da00: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
da10: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
da20: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
da30: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
da40: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
da50: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
da60: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
da70: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
da80: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
da90: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
daa0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
dab0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
dac0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
dad0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
dae0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
daf0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
db00: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
db10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
db20: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
db30: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
db40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
db50: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
db60: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
db70: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
db80: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
db90: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
dba0: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
dbb0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
dbc0: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  f( pParse->colNa
dbd0: 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e 6d 61  mesSet || db->ma
dbe0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
dbf0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 76  urn;.  assert( v
dc00: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
dc10: 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a   pTabList!=0 );.
dc20: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
dc30: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
dc40: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
dc50: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
dc60: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
dc70: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
dc80: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
dc90: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
dca0: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
dcb0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
dcc0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
dcd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
dce0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
dcf0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
dd00: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
dd10: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
dd20: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
dd30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
dd40: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
dd50: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
dd60: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
dd70: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
dd80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dd90: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
dda0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
ddb0: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
ddc0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
ddd0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  else if( p->op==
dde0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e  TK_COLUMN || p->
ddf0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
de00: 4e 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  N ){.      Table
de10: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
de20: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
de30: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
de40: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
de50: 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70  (j=0; ALWAYS(j<p
de60: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20  TabList->nSrc); 
de70: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
de80: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  ( pTabList->a[j]
de90: 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61  .iCursor==p->iTa
dea0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
deb0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
dec0: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
ded0: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
dee0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
def0: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
df00: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
df10: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
df20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
df30: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
df40: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
df50: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
df60: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
df70: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
df80: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
df90: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
dfa0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
dfb0: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
dfc0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
dfd0: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
dfe0: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
dff0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
e000: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
e010: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
e020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
e030: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69  bStrDup(db, pELi
e040: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c  st->a[i].zSpan),
e050: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
e060: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e070: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20  ( fullNames ){. 
e080: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
e090: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
e0a0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
e0b0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
e0c0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
e0d0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   zCol);.        
e0e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e0f0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
e100: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
e110: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
e120: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e130: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e140: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
e150: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
e160: 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52   zCol, SQLITE_TR
e170: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
e180: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
e190: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e1a0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
e1b0: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d  zSpan;.      z =
e1c0: 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d   z==0 ? sqlite3M
e1d0: 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75  Printf(db, "colu
e1e0: 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71  mn%d", i+1) : sq
e1f0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
e200: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
e210: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
e220: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
e230: 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f  NAME, z, SQLITE_
e240: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
e250: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
e260: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
e270: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
e280: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  st);.}../*.** Gi
e290: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
e2a0: 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  n list (which is
e2b0: 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74   really the list
e2c0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a   of expressions.
e2d0: 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ** that form the
e2e0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
e2f0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e300: 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f  t) compute appro
e310: 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  priate.** column
e320: 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62   names for a tab
e330: 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f  le that would ho
e340: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
e350: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  n list..**.** Al
e360: 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77  l column names w
e370: 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a  ill be unique..*
e380: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f  *.** Only the co
e390: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63  lumn names are c
e3a0: 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e  omputed.  Column
e3b0: 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a  .zType, Column.z
e3c0: 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68  Coll,.** and oth
e3d0: 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c  er fields of Col
e3e0: 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  umn are zeroed..
e3f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
e400: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
e410: 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  s.  If a memory 
e420: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
e430: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72   occurs,.** stor
e440: 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c  e NULL in *paCol
e450: 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c   and 0 in *pnCol
e460: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
e470: 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74  TE_NOMEM..*/.int
e480: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
e490: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
e4a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e4b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
e4c0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
e4d0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
e4e0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c         /* Expr l
e4f0: 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ist from which t
e500: 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20  o derive column 
e510: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a  names */.  i16 *
e520: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
e530: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
e540: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
e550: 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75  s here */.  Colu
e560: 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20  mn **paCol      
e570: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e580: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   new column list
e590: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
e5a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
e5b0: 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74  se->db;   /* Dat
e5c0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e5d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e600: 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b  rs */.  u32 cnt;
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e620: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64      /* Index add
e630: 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e  ed to make the n
e640: 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20  ame unique */.  
e650: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
e660: 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Col;        /* F
e670: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
e680: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
e690: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
e6c0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
e6d0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
e6e0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
e6f0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
e700: 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67  ssion for a sing
e710: 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
e720: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
e730: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e740: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
e750: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
e780: 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
e790: 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20    Hash ht;      
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e7b0: 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63   Hash table of c
e7c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
e7d0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
e7e0: 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45  t(&ht);.  if( pE
e7f0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
e800: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
e810: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
e820: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
e830: 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
e840: 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
e850: 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
e860: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
e870: 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
e880: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  aCol = 0;.  }.  
e890: 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69  assert( nCol==(i
e8a0: 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e  16)nCol );.  *pn
e8b0: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
e8c0: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
e8d0: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
e8e0: 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64  ol; i<nCol && !d
e8f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
e900: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
e910: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
e920: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
e930: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
e940: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
e950: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
e960: 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  te(pEList->a[i].
e970: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
e980: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
e990: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
e9a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
e9b0: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
e9c0: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
e9d0: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
e9e0: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
e9f0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
ea00: 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
ea10: 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65  xpr = p;  /* The
ea20: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
ea30: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
ea40: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
ea50: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
ea60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
ea70: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
ea80: 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  h this expressio
ea90: 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  n */.      while
eaa0: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
eab0: 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
eac0: 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
ead0: 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
eae0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
eaf0: 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
eb00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
eb10: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
eb20: 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59  _COLUMN && ALWAY
eb30: 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  S(pColExpr->pTab
eb40: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
eb50: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
eb60: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
eb70: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
eb80: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
eb90: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
eba0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
ebb0: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
ebc0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
ebd0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
ebe0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
ebf0: 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30   zName = iCol>=0
ec00: 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   ? pTab->aCol[iC
ec10: 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77  ol].zName : "row
ec20: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
ec30: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
ec40: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
ec50: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
ec60: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
ec70: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
ec80: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
ec90: 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Name = pColExpr-
eca0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
ecb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ecc0: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
ecd0: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
ece0: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
ecf0: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
ed00: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
ed10: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
ed20: 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pan;.      }.   
ed30: 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73   }.    zName = s
ed40: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
ed50: 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  , "%s", zName);.
ed60: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
ed70: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
ed80: 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66  e is unique.  If
ed90: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74   the name is not
eda0: 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20   unique,.    ** 
edb0: 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65  append an intege
edc0: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
edd0: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
ede0: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
edf0: 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
ee00: 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26   while( zName &&
ee10: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
ee20: 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20  (&ht, zName)!=0 
ee30: 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  ){.      nName =
ee40: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ee50: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  (zName);.      i
ee60: 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20  f( nName>0 ){.  
ee70: 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d        for(j=nNam
ee80: 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69  e-1; j>0 && sqli
ee90: 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65  te3Isdigit(zName
eea0: 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20  [j]); j--){}.   
eeb0: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a       if( zName[j
eec0: 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d  ]==':' ) nName =
eed0: 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
eee0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
eef0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e  3MPrintf(db, "%.
ef00: 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a  *z:%u", nName, z
ef10: 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20  Name, ++cnt);.  
ef20: 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20      if( cnt>3 ) 
ef30: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
ef40: 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20  ss(sizeof(cnt), 
ef50: 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &cnt);.    }.   
ef60: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
ef70: 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
ef80: 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65  3ColumnPropertie
ef90: 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f  sFromName(0, pCo
efa0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  l);.    if( zNam
efb0: 65 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68  e && sqlite3Hash
efc0: 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d  Insert(&ht, zNam
efd0: 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29  e, pCol)==pCol )
efe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
eff0: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
f000: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
f010: 48 61 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a  HashClear(&ht);.
f020: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f030: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f  Failed ){.    fo
f040: 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
f050: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
f060: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a  bFree(db, aCol[j
f070: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
f080: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f090: 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20  e(db, aCol);.   
f0a0: 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *paCol = 0;.   
f0b0: 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *pnCol = 0;.   
f0c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f0d0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
f0e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f0f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
f100: 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
f110: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  on information t
f120: 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  o a column list 
f130: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45  based on.** a SE
f140: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
f150: 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ** .** The colum
f160: 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c  n list presumabl
f170: 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65  y came from sele
f180: 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f  ctColumnNamesFro
f190: 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20  mExprList()..** 
f1a0: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
f1b0: 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20  has only names, 
f1c0: 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c  not types or col
f1d0: 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a  lations.  This.*
f1e0: 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  * routine goes t
f1f0: 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20  hrough and adds 
f200: 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  the types and co
f210: 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  llations..**.** 
f220: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71  This routine req
f230: 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69  uires that all i
f240: 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68  dentifiers in th
f250: 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  e SELECT.** stat
f260: 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65  ement be resolve
f270: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
f280: 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
f290: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
f2a0: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
f2b0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
f2c0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a  rsing contexts *
f2d0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
f2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
f2f0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66   column type inf
f300: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
f310: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65   table */.  Sele
f320: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
f330: 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64    /* SELECT used
f340: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79   to determine ty
f350: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
f360: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
f370: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
f380: 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
f390: 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
f3a0: 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
f3b0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
f3c0: 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
f3d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
f3e0: 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73  item *a;.  u64 s
f3f0: 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73  zAll = 0;..  ass
f400: 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20  ert( pSelect!=0 
f410: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53  );.  assert( (pS
f420: 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
f430: 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d  & SF_Resolved)!=
f440: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f450: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65  Tab->nCol==pSele
f460: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
f470: 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
f480: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64  ailed );.  if( d
f490: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f4a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73  ) return;.  mems
f4b0: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
f4c0: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e  of(sNC));.  sNC.
f4d0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65  pSrcList = pSele
f4e0: 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20  ct->pSrc;.  a = 
f4f0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
f500: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  >a;.  for(i=0, p
f510: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
f520: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
f530: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
f540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
f550: 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b  e;.    int n, m;
f560: 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45  .    p = a[i].pE
f570: 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  xpr;.    zType =
f580: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
f590: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70  , p, 0, 0, 0, &p
f5a0: 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20 20 20  Col->szEst);.   
f5b0: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
f5c0: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
f5d0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
f5e0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
f5f0: 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70  p);.    if( zTyp
f600: 65 20 26 26 20 28 6d 20 3d 20 73 71 6c 69 74 65  e && (m = sqlite
f610: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
f620: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  )>0 ){.      n =
f630: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
f640: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
f650: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
f660: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
f670: 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43  locOrFree(db, pC
f680: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32  ol->zName, n+m+2
f690: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
f6a0: 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  l->zName ){.    
f6b0: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c      memcpy(&pCol
f6c0: 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54  ->zName[n+1], zT
f6d0: 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20  ype, m+1);.     
f6e0: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
f6f0: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53  s |= COLFLAG_HAS
f700: 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TYPE;.      }.  
f710: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c    }.    if( pCol
f720: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
f730: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
f740: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
f750: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
f760: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
f770: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
f780: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
f790: 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  ol->zColl==0 ){.
f7a0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
f7b0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
f7c0: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
f7d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
f7e0: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
f7f0: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
f800: 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f  t(szAll*4);.}../
f810: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
f820: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
f830: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
f840: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
f850: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
f860: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
f870: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
f880: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
f890: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
f8a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
f8b0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
f8c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
f8d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
f8e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
f8f0: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
f900: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
f910: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
f920: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
f930: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
f940: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
f950: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
f960: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
f970: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
f980: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
f990: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
f9a0: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
f9b0: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
f9c0: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
f9d0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
f9e0: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
f9f0: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
fa00: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
fa10: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
fa20: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
fa30: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
fa40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
fa50: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
fa60: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
fa70: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
fa80: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
fa90: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
faa0: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
fab0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
fac0: 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29  aside.bDisable )
fad0: 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  ;.  pTab->nTabRe
fae0: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
faf0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62  Name = 0;.  pTab
fb00: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
fb10: 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
fb20: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
fb30: 30 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c  048576) );.  sql
fb40: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
fb50: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
fb60: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
fb70: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
fb80: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71  Tab->aCol);.  sq
fb90: 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
fba0: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
fbb0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
fbc0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  b, pSelect);.  p
fbd0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
fbe0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
fbf0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
fc00: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
fc10: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
fc20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
fc30: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
fc40: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
fc50: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
fc60: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
fc70: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
fc80: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
fc90: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
fca0: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
fcb0: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
fcc0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
fcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
fce0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 56 64 62 65  TE_NOINLINE Vdbe
fcf0: 20 2a 61 6c 6c 6f 63 56 64 62 65 28 50 61 72 73   *allocVdbe(Pars
fd00: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
fd10: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
fd20: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
fd30: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
fd40: 29 3b 0a 20 20 69 66 28 20 76 20 29 20 73 71 6c  );.  if( v ) sql
fd50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fd60: 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c 20 31 29  , OP_Init, 0, 1)
fd70: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
fd80: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20  pToplevel==0.   
fd90: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
fda0: 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
fdb0: 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
fdc0: 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20  utConst).  ){.  
fdd0: 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
fde0: 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d  tFactor = 1;.  }
fdf0: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 56  .  return v;.}.V
fe00: 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
fe10: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
fe20: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
fe30: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
fe40: 20 72 65 74 75 72 6e 20 76 20 3f 20 76 20 3a 20   return v ? v : 
fe50: 61 6c 6c 6f 63 56 64 62 65 28 70 50 61 72 73 65  allocVdbe(pParse
fe60: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  );.}.../*.** Com
fe70: 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
fe80: 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
fe90: 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
fea0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
feb0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
fec0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
fed0: 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66    pLimit and pOf
fee0: 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78  fset hold the ex
fef0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
ff00: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
ff10: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
ff20: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
ff30: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
ff40: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
ff50: 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
ff60: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
ff70: 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
ff80: 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
ff90: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
ffa0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
ffb0: 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
ffc0: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
ffd0: 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
ffe0: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
fff0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
10000 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
10010 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
10020 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
10030 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
10040 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
10050 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
10060 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
10070 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
10080 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
10090 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
100a0 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  by pLimit and pO
100b0 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
100c0 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
100d0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
100e0 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
100f0 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
10100 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72  ues (zero).** pr
10110 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
10120 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
10130 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74 20 72  ** The iOffset r
10140 65 67 69 73 74 65 72 20 28 69 66 20 69 74 20 65  egister (if it e
10150 78 69 73 74 73 29 20 69 73 20 69 6e 69 74 69 61  xists) is initia
10160 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
10170 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46  ue.** of the OFF
10180 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74  SET.  The iLimit
10190 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
101a0 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49  tialized to LIMI
101b0 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20  T.  Register.** 
101c0 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69  iOffset+1 is ini
101d0 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49  tialized to LIMI
101e0 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  T+OFFSET..**.** 
101f0 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d  Only if pLimit!=
10200 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20  0 or pOffset!=0 
10210 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
10220 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
10230 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
10240 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
10250 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
10260 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
10270 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
10280 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
10290 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
102a0 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
102b0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
102c0 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
102d0 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
102e0 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
102f0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
10300 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
10310 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
10320 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
10330 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
10340 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66  t;.  int n;.  if
10350 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
10360 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
10370 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
10380 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
10390 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
103a0 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
103b0 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
103c0 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
103d0 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
103e0 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
103f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
10400 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
10410 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
10420 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
10430 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10440 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
10450 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
10460 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c  fset==0 || p->pL
10470 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  imit!=0 );.  if(
10480 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
10490 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c    p->iLimit = iL
104a0 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  imit = ++pParse-
104b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73  >nMem;.    v = s
104c0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
104d0 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72  arse);.    asser
104e0 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69  t( v!=0 );.    i
104f0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
10500 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69  Integer(p->pLimi
10510 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  t, &n) ){.      
10520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10530 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10540 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20   n, iLimit);.   
10550 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
10560 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
10570 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r"));.      if( 
10580 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
10590 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
105a0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
105b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30    }else if( n>=0
105c0 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
105d0 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  w>sqlite3LogEst(
105e0 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20  (u64)n) ){.     
105f0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
10600 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
10610 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20  ((u64)n);.      
10620 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
10630 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a   SF_FixedLimit;.
10640 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10650 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
10660 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10670 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d   p->pLimit, iLim
10680 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
10690 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
106a0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c  OP_MustBeInt, iL
106b0 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
106c0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
106d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
106e0 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
106f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10710 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42  fNot, iLimit, iB
10720 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
10730 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
10740 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
10750 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
10760 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
10770 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
10780 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
10790 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
107a0 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
107b0 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
107c0 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  +offset */.     
107d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
107e0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
107f0 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
10800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10810 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
10820 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
10830 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
10840 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
10850 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
10860 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
10870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10880 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65  dOp3(v, OP_Offse
10890 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20  tLimit, iLimit, 
108a0 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f 66 66 73  iOffset+1, iOffs
108b0 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
108c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
108d0 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20  T+OFFSET"));.   
108e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
108f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
10900 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
10910 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
10920 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
10930 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
10940 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
10950 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
10960 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
10970 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
10980 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
10990 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
109a0 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
109b0 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
109c0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
109d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
109e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
109f0 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
10a00 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
10a10 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
10a20 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
10a30 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
10a40 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
10a50 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
10a60 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
10a70 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
10a80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
10a90 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
10aa0 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
10ab0 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
10ac0 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
10ad0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
10ae0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
10af0 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
10b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
10b10 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
10b20 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
10b30 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65   /* iCol must be
10b40 20 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45   less than p->pE
10b50 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74  List->nExpr.  Ot
10b60 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
10b70 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65   would.  ** have
10b80 20 62 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72   been thrown dur
10b90 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ing name resolut
10ba0 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ion and we would
10bb0 20 6e 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e   not have gotten
10bc0 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a  .  ** this far *
10bd0 2f 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  /.  if( pRet==0 
10be0 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
10bf0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
10c00 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
10c10 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
10c20 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
10c30 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
10c40 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
10c50 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
10c60 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
10c70 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
10c80 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
10c90 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75  eter is a compou
10ca0 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  nd SELECT.** wit
10cb0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
10cc0 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ause. This funct
10cd0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
10ce0 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49  d returns a KeyI
10cf0 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
10d00 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d   suitable for im
10d10 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
10d20 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53  RDER BY..**.** S
10d30 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
10d40 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
10d50 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
10d60 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20  rom malloc. The 
10d70 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
10d80 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
10d90 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
10da0 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
10db0 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
10dc0 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73  y.** freed..*/.s
10dd0 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d  tatic KeyInfo *m
10de0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
10df0 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a  yKeyInfo(Parse *
10e00 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
10e10 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a  p, int nExtra){.
10e20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10e30 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
10e40 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  By;.  int nOrder
10e50 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
10e60 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74  ->nExpr;.  sqlit
10e70 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10e80 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  >db;.  KeyInfo *
10e90 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65  pRet = sqlite3Ke
10ea0 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
10eb0 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20  OrderBy+nExtra, 
10ec0 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  1);.  if( pRet )
10ed0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
10ee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
10ef0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
10f00 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10f10 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
10f20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b  &pOrderBy->a[i];
10f30 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
10f40 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  rm = pItem->pExp
10f50 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  r;.      CollSeq
10f60 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20   *pColl;..      
10f70 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
10f80 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
10f90 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
10fa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
10fb0 53 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72  Seq(pParse, pTer
10fc0 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
10fd0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
10fe0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
10ff0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70  Seq(pParse, p, p
11000 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
11010 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ByCol-1);.      
11020 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
11030 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
11040 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
11050 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
11060 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Expr =.         
11070 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
11080 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61  ollateString(pPa
11090 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c  rse, pTerm, pCol
110a0 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
110b0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
110c0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
110d0 73 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29  sWriteable(pRet)
110e0 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   );.      pRet->
110f0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
11100 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53  ;.      pRet->aS
11110 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
11120 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
11130 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
11140 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
11150 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
11160 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
11170 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11180 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63  generates VDBE c
11190 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ode to compute t
111a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
111b0 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a  WITH RECURSIVE.*
111c0 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  * query of the f
111d0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65  orm:.**.**   <re
111e0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41  cursive-table> A
111f0 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e  S (<setup-query>
11200 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65   UNION [ALL] <re
11210 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a  cursive-query>).
11220 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11230 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
11240 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
11250 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
11260 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20      p->pPrior   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68     p.**.**.** Th
112b0 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
112c0 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
112d0 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
112e0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
112f0 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63  clause.** of rec
11300 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61  ursive-query, ma
11310 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72  rked with the Sr
11320 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73  cList->a[].fg.is
11330 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a  Recursive flag..
11340 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d  **.** The setup-
11350 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20  query runs once 
11360 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69  to generate an i
11370 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f  nitial set of ro
11380 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e  ws that go.** in
11390 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c 65  to a Queue table
113a0 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74 72  .  Rows are extr
113b0 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51  acted from the Q
113c0 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62  ueue table one b
113d0 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20  y.** one.  Each 
113e0 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66 72  row extracted fr
113f0 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74 70  om Queue is outp
11400 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  ut to pDest.  Th
11410 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a  en the single.**
11420 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20 28   extracted row (
11430 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72 72  now in the iCurr
11440 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d  ent table) becom
11450 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  es the content o
11460 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69  f the.** recursi
11470 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72  ve-table for a r
11480 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20 72  ecursive-query r
11490 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20  un.  The output 
114a0 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
114b0 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64  -query.** is add
114c0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
114d0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
114e0 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20  hen another row 
114f0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
11500 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74  m Queue.** and t
11510 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e  he iteration con
11520 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65  tinues until the
11530 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
11540 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
11550 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
11560 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ry operator is U
11570 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70  NION then no dup
11580 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65 20  licate rows are 
11590 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ever.** inserted
115a0 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
115b0 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73  table.  The iDis
115c0 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70  tinct table keep
115d0 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20  s a copy of all 
115e0 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  rows.** that hav
115f0 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65  e ever been inse
11600 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20  rted into Queue 
11610 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c 69  and causes dupli
11620 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64  cates to be.** d
11630 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74 68  iscarded.  If th
11640 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  e operator is UN
11650 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75  ION ALL, then du
11660 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c  plicates are all
11670 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  owed..** .** If 
11680 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61 6e  the query has an
11690 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20   ORDER BY, then 
116a0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 51  entries in the Q
116b0 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b  ueue table are k
116c0 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20  ept in.** ORDER 
116d0 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65  BY order and the
116e0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73 20   first entry is 
116f0 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65 61  extracted for ea
11700 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f  ch cycle.  Witho
11710 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42  ut.** an ORDER B
11720 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  Y, the Queue tab
11730 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49 46  le is just a FIF
11740 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49  O..**.** If a LI
11750 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70 72  MIT clause is pr
11760 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65  ovided, then the
11770 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73   iteration stops
11780 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77   after LIMIT row
11790 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f  s.** have been o
117a0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
117b0 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f   A LIMIT of zero
117c0 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
117d0 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a   no rows and a.*
117e0 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54  * negative LIMIT
117f0 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
11800 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74   all rows.  If t
11810 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20  here is also an 
11820 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a  OFFSET clause.**
11830 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 65   with a positive
11840 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
11850 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75   first OFFSET ou
11860 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61 72  tputs are discar
11870 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68  ded rather.** th
11880 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  an being sent to
11890 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d   pDest.  The LIM
118a0 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f  IT count does no
118b0 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66  t begin until af
118c0 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f  ter OFFSET.** ro
118d0 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ws have been ski
118e0 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
118f0 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69 74  void generateWit
11900 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
11910 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11920 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
11930 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11940 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
11950 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
11960 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
11970 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
11980 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
11990 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
119a0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
119b0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
119c0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
119d0 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20  ->pSrc;      /* 
119e0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
119f0 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
11a00 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
11a10 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
11a20 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d  ->nExpr;  /* Num
11a30 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
11a40 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
11a50 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20  table */.  Vdbe 
11a60 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
11a70 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
11a80 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
11a90 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
11aa0 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ction */.  Selec
11ab0 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70  t *pSetup = p->p
11ac0 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  Prior;   /* The 
11ad0 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20  setup query */. 
11ae0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11b00 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
11b10 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
11b20 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20  ont, addrBreak; 
11b30 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45       /* CONTINUE
11b40 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65   and BREAK addre
11b50 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sses */.  int iC
11b60 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  urrent = 0;     
11b70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
11b80 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
11b90 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74    int regCurrent
11ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11bb0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
11bc0 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c  ing Current tabl
11bd0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75  e */.  int iQueu
11be0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11bf0 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75       /* The Queu
11c00 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
11c10 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20   iDistinct = 0; 
11c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
11c30 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72   ensure unique r
11c40 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20  esults if UNION 
11c50 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
11c60 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20   SRT_Fifo;      
11c70 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69     /* How to wri
11c80 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20  te to Queue */. 
11c90 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
11ca0 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f  Queue;         /
11cb0 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61 72  * SelectDest tar
11cc0 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65 75  getting the Queu
11cd0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
11ce0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
11cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11d00 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11d10 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d30 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11d40 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
11d50 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
11d60 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
11d70 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11d80 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
11d90 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  et;       /* Sav
11da0 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  ed LIMIT and OFF
11db0 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  SET */.  int reg
11dc0 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74  Limit, regOffset
11dd0 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ;      /* Regist
11de0 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49  ers used by LIMI
11df0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
11e00 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
11e10 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
11e20 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
11e30 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
11e40 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
11e50 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
11e60 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
11e70 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
11e80 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49  Process the LIMI
11e90 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
11ea0 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78  uses, if they ex
11eb0 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65  ist */.  addrBre
11ec0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
11ed0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
11ee0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
11ef0 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69  320;  /* 4 billi
11f00 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d  on rows */.  com
11f10 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
11f20 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64  rs(pParse, p, ad
11f30 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d  drBreak);.  pLim
11f40 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
11f50 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
11f60 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d  Offset;.  regLim
11f70 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
11f80 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d    regOffset = p-
11f90 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70  >iOffset;.  p->p
11fa0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73  Limit = p->pOffs
11fb0 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  et = 0;.  p->iLi
11fc0 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
11fd0 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
11fe0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
11ff0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
12000 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
12010 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
12020 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
12030 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
12040 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
12050 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
12060 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
12070 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
12080 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
12090 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
120a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
120b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
120c0 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
120d0 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
120e0 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
120f0 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
12100 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
12110 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
12120 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
12130 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
12140 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
12150 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
12160 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
12170 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
12180 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
12190 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
121a0 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
121b0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
121c0 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
121d0 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
121e0 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
121f0 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
12200 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
12210 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
12220 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
12230 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
12240 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
12250 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
12260 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
12270 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
12280 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12290 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
122a0 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
122b0 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
122c0 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
122d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
122e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
122f0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
12300 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
12310 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
12320 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
12330 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
12340 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
12350 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
12360 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
12370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12380 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
12390 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
123a0 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
123b0 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123d0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
123e0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
123f0 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
12400 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
12410 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
12420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12430 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12440 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
12450 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
12460 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
12470 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
12480 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
12490 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
124a0 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
124b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
124c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
124d0 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
124e0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
124f0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
12500 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
12510 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
12520 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
12530 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
12540 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
12550 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
12560 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
12570 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
12580 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
12590 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
125a0 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
125b0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
125c0 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75   pSetup, &destQu
125d0 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e  eue);.  pSetup->
125e0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28  pNext = p;.  if(
125f0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f   rc ) goto end_o
12600 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
12610 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  y;..  /* Find th
12620 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68  e next row in th
12630 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70  e Queue and outp
12640 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20  ut that row */. 
12650 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
12660 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12670 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75  OP_Rewind, iQueu
12680 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  e, addrBreak); V
12690 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
126a0 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74  .  /* Transfer t
126b0 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51  he next row in Q
126c0 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72  ueue over to Cur
126d0 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rent */.  sqlite
126e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
126f0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72  P_NullRow, iCurr
12700 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65  ent); /* To rese
12710 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a  t column cache *
12720 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
12730 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12740 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12750 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20  Column, iQueue, 
12760 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
12770 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  1, regCurrent);.
12780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
12790 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
127a0 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51  , OP_RowData, iQ
127b0 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74  ueue, regCurrent
127c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
127d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
127e0 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29  _Delete, iQueue)
127f0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
12800 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
12810 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64   Current */.  ad
12820 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
12830 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
12840 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  ;.  codeOffset(v
12850 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64  , regOffset, add
12860 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74  rCont);.  select
12870 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
12880 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
12890 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
128a0 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
128b0 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
128c0 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
128d0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
128e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
128f0 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72  _DecrJumpZero, r
12900 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
12910 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
12920 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
12930 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
12940 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
12950 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63  ont);..  /* Exec
12960 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
12970 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20  e SELECT taking 
12980 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
12990 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a  n Current as.  *
129a0 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * the value for 
129b0 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
129c0 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72  ble. Store the r
129d0 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75  esults in the Qu
129e0 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eue..  */.  if( 
129f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
12a00 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
12a10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12a20 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72  g(pParse, "recur
12a30 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71  sive aggregate q
12a40 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f  ueries not suppo
12a50 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  rted");.  }else{
12a60 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
12a70 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
12a80 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
12a90 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
12aa0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
12ab0 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ior==0 );.    p-
12ac0 3e 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70  >pPrior = pSetup
12ad0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70  ;.  }..  /* Keep
12ae0 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f   running the loo
12af0 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75  p until the Queu
12b00 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  e is empty */.  
12b10 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
12b20 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
12b30 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
12b40 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
12b50 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65  eak);..end_of_re
12b60 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20  cursive_query:. 
12b70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12b80 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
12b90 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
12ba0 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
12bb0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e   pOrderBy;.  p->
12bc0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
12bd0 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
12be0 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72  pOffset;.  retur
12bf0 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
12c00 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
12c10 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
12c20 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74  ferences */.stat
12c30 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
12c40 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
12c50 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12c60 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12c70 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12c80 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12c90 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
12ca0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
12cb0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
12cc0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
12cd0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
12ce0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
12cf0 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  sults */.);../*.
12d00 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70  ** Handle the sp
12d10 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
12d20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
12d30 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
12d40 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53  from a.** VALUES
12d50 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e   clause.  By han
12d60 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61 20  dling this as a 
12d70 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65  special case, we
12d80 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72   avoid deep.** r
12d90 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68  ecursion, and th
12da0 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  us do not need t
12db0 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51  o enforce the SQ
12dc0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
12dd0 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e  UND_SELECT.** on
12de0 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
12df0 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20  ..**.** Because 
12e00 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
12e10 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
12e20 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  m a VALUES claus
12e30 65 3a 0a 2a 2a 20 20 20 28 31 29 20 49 74 20 68  e:.**   (1) It h
12e40 61 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f  as no LIMIT or O
12e50 46 46 53 45 54 0a 2a 2a 20 20 20 28 32 29 20 41  FFSET.**   (2) A
12e60 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 55 4e 49  ll terms are UNI
12e70 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20  ON ALL.**   (3) 
12e80 54 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  There is no ORDE
12e90 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73  R BY clause.*/.s
12ea0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
12eb0 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50  electValues(.  P
12ec0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12ed0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
12ee0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
12ef0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
12f00 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
12f10 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
12f20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
12f30 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
12f40 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
12f50 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
12f60 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
12f70 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a  Select *pPrior;.
12f80 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a    int nRow = 1;.
12f90 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
12fa0 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
12fb0 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
12fc0 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  lue );.  do{.   
12fd0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
12fe0 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
12ff0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13000 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  p->op==TK_ALL ||
13010 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   (p->op==TK_SELE
13020 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d  CT && p->pPrior=
13030 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
13040 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
13050 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13060 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a  ->pOffset==0 );.
13070 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13080 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45  Next==0 || p->pE
13090 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e  List->nExpr==p->
130a0 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pNext->pEList->n
130b0 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20  Expr );.    if( 
130c0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62  p->pPrior==0 ) b
130d0 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
130e0 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  ( p->pPrior->pNe
130f0 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d  xt==p );.    p =
13100 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
13110 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  nRow++;.  }while
13120 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  (1);.  while( p 
13130 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  ){.    pPrior = 
13140 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
13150 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
13160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
13170 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
13180 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  pDest);.    p->p
13190 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
131a0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
131b0 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ak;.    p->nSele
131c0 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20  ctRow = nRow;.  
131d0 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
131e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
131f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
13200 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
13210 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
13220 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
13230 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
13240 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
13250 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
13260 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
13270 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
13280 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
13290 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
132a0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
132b0 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
132c0 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
132d0 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
132e0 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
132f0 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
13300 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
13310 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
13320 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
13330 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
13340 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
13350 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
13360 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
13370 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
13380 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
13390 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
133a0 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
133b0 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
133c0 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
133d0 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
133e0 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
133f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
13400 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13410 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
13420 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
13430 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
13440 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
13450 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
13460 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
13470 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
13480 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
13490 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
134a0 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
134b0 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134d0 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
134e0 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
134f0 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
13500 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
13510 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
13520 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
13530 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
13540 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
13550 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
13560 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
13570 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
13580 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
13590 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
135a0 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
135b0 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
135c0 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
135d0 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
135e0 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
135f0 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
13600 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
13610 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
13620 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
13630 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
13640 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
13650 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
13660 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
13670 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13680 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13690 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
136a0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
136b0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
136c0 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
136d0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
136e0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
136f0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
13700 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
13710 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
13720 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13730 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
13740 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
13750 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
13760 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
13770 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
13780 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
13790 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
137a0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
137b0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
137c0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
137d0 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
137e0 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
137f0 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
13800 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
13810 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
13820 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
13830 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
13840 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
13850 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
13860 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
13870 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
13880 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ion */.#ifndef S
13890 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
138a0 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d  IN.  int iSub1 =
138b0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
138c0 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e  P id of left-han
138d0 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
138e0 20 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20   iSub2 = 0;     
138f0 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
13900 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79  right-hand query
13910 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   */.#endif..  /*
13920 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
13930 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
13940 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
13950 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
13960 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
13970 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
13980 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
13990 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
139a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
139b0 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73  LIMIT..  */.  as
139c0 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50  sert( p && p->pP
139d0 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c  rior );  /* Call
139e0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61  ing function gua
139f0 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63  rantees this muc
13a00 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  h */.  assert( (
13a10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13a20 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c  _Recursive)==0 |
13a30 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  | p->op==TK_ALL 
13a40 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  || p->op==TK_UNI
13a50 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  ON );.  db = pPa
13a60 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
13a70 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
13a80 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
13a90 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
13aa0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
13ab0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13ac0 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
13ad0 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
13ae0 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
13af0 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
13b00 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
13b10 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
13b20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
13b30 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
13b40 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
13b50 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
13b60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13b70 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
13b80 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
13b90 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
13ba0 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
13bb0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
13bc0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
13bd0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
13be0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
13bf0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
13c00 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
13c10 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
13c20 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
13c30 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
13c40 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
13c50 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
13c60 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
13c70 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
13c80 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
13c90 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
13ca0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
13cb0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
13cc0 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
13cd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13ce0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
13cf0 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  l, dest.iSDParm,
13d00 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
13d10 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  r);.    dest.eDe
13d20 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
13d30 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
13d40 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61  l handling for a
13d50 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
13d60 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
13d70 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61   as a VALUES cla
13d80 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
13d90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13da0 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20  _MultiValue ){. 
13db0 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
13dc0 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65  ectValues(pParse
13dd0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
13de0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
13df0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
13e00 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
13e10 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
13e20 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
13e30 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
13e40 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
13e50 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
13e60 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
13e70 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
13e80 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
13e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
13ea0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
13eb0 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
13ec0 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66  Expr );..#ifndef
13ed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
13ee0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
13ef0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
13f00 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  e ){.    generat
13f10 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
13f20 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ery(pParse, p, &
13f30 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  dest);.  }else.#
13f40 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
13f50 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
13f60 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
13f70 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
13f80 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
13f90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13fa0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
13fb0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
13fc0 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
13fd0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
13fe0 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  else..  /* Gener
13ff0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
14000 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
14010 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14020 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
14030 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
14040 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
14050 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30      int addr = 0
14060 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
14070 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  it;.      assert
14080 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
14090 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  t );.      pPrio
140a0 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  r->iLimit = p->i
140b0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
140c0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
140d0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
140e0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
140f0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
14100 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
14110 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
14120 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
14130 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
14140 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14150 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
14160 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
14170 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
14180 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
14190 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
141a0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
141b0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
141c0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
141d0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
141e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
141f0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
14200 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
14210 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
14220 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
14230 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
14240 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
14250 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
14260 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14270 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14280 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c   OP_IfNot, p->iL
14290 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
142a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
142b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
142c0 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
142d0 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
142e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
142f0 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  iOffset ){.     
14300 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14310 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
14320 73 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20  setLimit,.      
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c        p->iLimit,
14350 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70   p->iOffset+1, p
14360 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->iOffset);.    
14370 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14380 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
14390 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
143a0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
143b0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
143c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
143d0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
143e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
143f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14400 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
14410 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
14420 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
14430 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
14440 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
14450 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
14460 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
14470 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
14480 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
14490 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20  or->pLimit.     
144a0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
144b0 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
144c0 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69  ->pLimit, &nLimi
144d0 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69  t).       && nLi
144e0 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c  mit>0 && p->nSel
144f0 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33  ectRow > sqlite3
14500 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d  LogEst((u64)nLim
14510 69 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  it) .      ){.  
14520 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
14530 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
14540 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29  Est((u64)nLimit)
14550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14560 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
14570 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
14580 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
14590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
145a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
145b0 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
145c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
145d0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
145e0 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
145f0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
14600 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
14610 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
14620 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
14630 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
14640 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
14650 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
14660 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
14670 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
14680 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
14690 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
146a0 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
146b0 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
146c0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
146d0 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
146e0 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
146f0 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
14700 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
14710 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
14720 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
14730 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
14740 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
14750 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
14760 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
14770 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
14780 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
14790 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
147a0 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
147b0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rOp ){.        /
147c0 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
147d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
147e0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
147f0 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
14800 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
14810 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14820 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
14830 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
14840 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
14850 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
14860 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
14870 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
14880 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e  t==0 );     /* N
14890 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
148a0 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
148b0 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
148c0 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
148d0 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
148e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
148f0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
14900 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
14910 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
14920 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
14930 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
14940 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
14950 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
14960 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
14970 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
14980 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
14990 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
149a0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
149b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
149c0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
149d0 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
149e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
149f0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14a00 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
14a10 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14a20 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
14a30 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
14a40 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
14a50 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
14a60 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
14a70 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
14a80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
14a90 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
14aa0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
14ab0 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
14ac0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
14ad0 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
14ae0 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
14af0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
14b00 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
14b10 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
14b20 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
14b30 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
14b40 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14b50 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
14b60 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
14b70 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
14b80 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
14b90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
14ba0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
14bb0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
14bc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
14bd0 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
14be0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14bf0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14c00 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
14c10 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
14c20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
14c30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14c50 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
14c60 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
14c70 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
14c80 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14c90 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
14ca0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
14cb0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
14cc0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
14cd0 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
14ce0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
14cf0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69  t = 0;.      uni
14d00 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
14d10 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  p;.      explain
14d20 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
14d30 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
14d40 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
14d50 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
14d60 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
14d70 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
14d80 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
14d90 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
14da0 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
14db0 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
14dc0 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
14dd0 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
14de0 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
14df0 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
14e00 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
14e10 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
14e20 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
14e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14e40 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
14e50 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
14e60 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
14e70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
14e80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
14e90 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
14ea0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
14eb0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
14ec0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  NION ){.        
14ed0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
14ee0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
14ef0 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
14f00 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
14f10 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ow);.      }.   
14f20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
14f30 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
14f40 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
14f50 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
14f60 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14f70 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
14f80 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->iLimit = 0;.
14f90 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
14fa0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
14fb0 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
14fc0 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
14fd0 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
14fe0 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
14ff0 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
15000 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
15010 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15020 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61   assert( unionTa
15030 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20  b==dest.iSDParm 
15040 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  || dest.eDest!=p
15050 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20  riorOp );.      
15060 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
15070 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
15080 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
15090 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
150a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
150b0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
150c0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
150d0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
150e0 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
150f0 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
15100 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
15110 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
15120 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
15130 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
15140 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
15150 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
15160 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70 46  pFirst->pSrc, pF
15170 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
15180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15190 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
151a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
151b0 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
151c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
151d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
151e0 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
151f0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
15200 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
15210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15220 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
15230 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
15240 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
15250 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
15260 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
15270 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15280 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65  r(v);.        se
15290 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
152a0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
152b0 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20  st, unionTab,.  
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
152e0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
152f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15300 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15310 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
15320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
15340 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
15350 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
15360 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
15370 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15380 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
15390 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
153a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
153b0 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
153c0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
153d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
153e0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
153f0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
15400 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
15410 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
15420 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
15430 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
15440 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
15450 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
15460 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
15470 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
15480 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
15490 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
154a0 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
154b0 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
154c0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
154d0 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
154e0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
154f0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
15500 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
15510 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
15520 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
15530 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
15540 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
15550 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
15560 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
15570 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15580 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
15590 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
155a0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
155b0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
155c0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
155d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
155e0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
155f0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
15600 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
15610 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
15620 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
15630 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
15640 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e   addr;.      fin
15650 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73  dRightmost(p)->s
15660 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
15670 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
15680 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
15690 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f  List );..      /
156a0 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
156b0 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
156c0 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
156d0 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
156e0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
156f0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
15700 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c  (&intersectdest,
15710 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
15720 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
15730 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
15740 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
15750 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
15760 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
15770 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
15780 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
15790 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
157a0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
157b0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
157c0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
157d0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
157e0 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
157f0 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
15800 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
15810 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  /.      addr = s
15820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15830 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
15840 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
15850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15860 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
15870 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
15880 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15890 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  1] = addr;.     
158a0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
158b0 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
158c0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
158d0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
158e0 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
158f0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
15900 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
15910 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74  .      intersect
15920 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74  dest.iSDParm = t
15930 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab2;.      expla
15940 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
15950 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
15960 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
15970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15980 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
15990 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
159a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
159b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
159c0 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
159d0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
159e0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
159f0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
15a00 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70   p->nSelectRow>p
15a10 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
15a20 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
15a30 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
15a40 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
15a50 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
15a60 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
15a70 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
15a80 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
15a90 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
15aa0 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  fset;..      /* 
15ab0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
15ac0 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
15ad0 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
15ae0 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
15af0 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
15b00 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
15b10 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
15b20 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
15b30 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
15b40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  t ){.        Sel
15b50 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
15b60 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
15b70 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
15b80 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
15b90 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
15ba0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
15bb0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 46  Names(pParse, pF
15bc0 69 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69 72  irst->pSrc, pFir
15bd0 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
15be0 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
15bf0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
15c00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
15c10 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
15c20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15c30 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
15c40 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
15c50 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
15c60 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
15c70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15c80 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
15c90 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
15ca0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
15cb0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
15cc0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
15cd0 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
15ce0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15cf0 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20  (v, OP_RowData, 
15d00 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
15d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15d20 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
15d30 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
15d40 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43  t, r1, 0); VdbeC
15d50 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15d60 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15d70 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
15d80 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  r1);.      selec
15d90 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
15da0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
15db0 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20   tab1,.         
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
15dd0 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
15de0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
15df0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15e00 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
15e10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15e20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15e30 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
15e40 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
15e50 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
15e60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15e70 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
15e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15e90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
15ea0 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
15eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15ec0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
15ed0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
15ee0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15ef0 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
15f00 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
15f10 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
15f20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
15f30 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
15f40 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
15f50 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
15f60 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
15f70 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
15f80 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
15f90 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
15fa0 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
15fb0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
15fc0 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
15fd0 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
15fe0 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
15ff0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
16000 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
16010 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
16020 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
16030 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
16040 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
16050 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
16060 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
16070 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
16080 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
16090 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
160a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
160b0 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
160c0 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
160d0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
160e0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
160f0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
16100 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
16130 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
16140 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
16150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
16160 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
16170 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
16180 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
16190 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
161a0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
161b0 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
161c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
161d0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
161e0 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
161f0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
16200 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
16210 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
16220 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16250 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
16260 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
16270 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
16280 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =0 );.    nCol =
16290 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
162a0 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
162b0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
162c0 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20  Alloc(db, nCol, 
162d0 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  1);.    if( !pKe
162e0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
162f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
16300 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
16310 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
16320 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
16330 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
16340 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
16350 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
16360 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
16370 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
16380 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
16390 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
163a0 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
163b0 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
163c0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
163d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
163e0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
163f0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
16400 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
16410 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16420 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
16430 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
16440 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
16450 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
16460 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
16470 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
16480 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
16490 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
164a0 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
164b0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
164c0 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
164d0 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
164e0 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
164f0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
16500 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
16510 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
16520 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
16530 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
16540 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
16550 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
16560 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
16570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16580 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
16590 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
165a0 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
165b0 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165d0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
165e0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
165f0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
16600 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
16610 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
16620 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
16630 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
16640 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
16650 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
16660 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
16670 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
16680 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
16690 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
166a0 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
166b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
166c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
166d0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
166e0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72   */../*.** Error
166f0 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68 65   message for whe
16700 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65  n two or more te
16710 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  rms of a compoun
16720 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64 69  d select have di
16730 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20  fferent.** size 
16740 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a  result sets..*/.
16750 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
16760 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45  ctWrongNumTermsE
16770 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
16780 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
16790 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
167a0 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b  s & SF_Values ){
167b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
167c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
167d0 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
167e0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
167f0 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
16800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
16810 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16820 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
16830 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
16840 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
16850 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
16860 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
16870 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
16880 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
16890 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->op));.  }.}../
168a0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74  *.** Code an out
168b0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66  put subroutine f
168c0 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69  or a coroutine i
168d0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
168e0 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
168f0 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tment..**.** The
16900 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70   data to be outp
16910 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ut is contained 
16920 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20  in pIn->iSdst.  
16930 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e  There are.** pIn
16940 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20  ->nSdst columns 
16950 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70  to be output.  p
16960 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68  Dest is where th
16970 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a  e output should.
16980 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a  ** be sent..**.*
16990 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74  * regReturn is t
169a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
169b0 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
169c0 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
169d0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65  .** return addre
169e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  ss..**.** If reg
169f0 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69  Prev>0 then it i
16a00 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  s the first regi
16a10 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
16a20 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
16a30 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
16a40 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
16a50 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
16a60 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
16a70 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
16a80 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
16a90 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
16aa0 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
16ab0 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
16ac0 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
16ad0 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
16ae0 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
16af0 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
16b00 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
16b10 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
16b20 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
16b30 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
16b40 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
16b50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
16b60 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
16b70 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
16b80 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
16b90 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
16ba0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
16bb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
16bc0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
16bd0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
16be0 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
16bf0 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
16c00 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
16c10 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
16c20 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
16c30 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
16c40 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
16c50 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
16c60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
16c70 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
16c80 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
16c90 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
16ca0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
16cb0 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
16cc0 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
16cd0 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
16ce0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
16cf0 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
16d00 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
16d10 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42  ntry */.  int iB
16d20 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
16d30 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
16d40 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d  f we hit the LIM
16d50 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  IT */.){.  Vdbe 
16d60 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
16d70 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69  be;.  int iConti
16d80 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  nue;.  int addr;
16d90 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ..  addr = sqlit
16da0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16db0 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75  r(v);.  iContinu
16dc0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
16dd0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
16de0 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c  /* Suppress dupl
16df0 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e  icates for UNION
16e00 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
16e10 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20  TERSECT .  */.  
16e20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20  if( regPrev ){. 
16e30 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
16e40 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  dr2;.    addr1 =
16e50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16e60 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
16e70 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f  regPrev); VdbeCo
16e80 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61  verage(v);.    a
16e90 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
16ea0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
16eb0 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64  ompare, pIn->iSd
16ec0 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
16ed0 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20  In->nSdst,.     
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
16f00 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
16f10 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
16f20 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
16f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16f40 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
16f50 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  2+2, iContinue, 
16f60 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f  addr2+2); VdbeCo
16f70 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
16f80 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16f90 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
16fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16fb0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
16fc0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
16fd0 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
16fe0 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t-1);.    sqlite
16ff0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17000 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
17010 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66  gPrev);.  }.  if
17020 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
17030 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
17040 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70  urn 0;..  /* Sup
17050 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20  press the first 
17060 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69  OFFSET entries i
17070 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46  f there is an OF
17080 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FSET clause.  */
17090 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
170a0 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
170b0 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65  ntinue);..  asse
170c0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
170d0 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a  !=SRT_Exists );.
170e0 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
170f0 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c  >eDest!=SRT_Tabl
17100 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  e );.  switch( p
17110 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20  Dest->eDest ){. 
17120 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
17130 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
17140 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
17150 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
17160 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
17170 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
17180 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17190 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
171a0 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
171b0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
171c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
171d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
171e0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
171f0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
17200 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20  ->nSdst, r1);.  
17210 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17220 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
17230 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  owid, pDest->iSD
17240 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
17250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17260 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
17270 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
17280 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
17290 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
172a0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
172b0 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c  PEND);.      sql
172c0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
172d0 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
172e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
172f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17300 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
17310 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
17320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17330 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
17340 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
17350 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
17360 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
17370 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a  T ...)"..    */.
17380 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
17390 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
173a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
173b0 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29  ( pIn->nSdst>1 )
173c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
173d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
173e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
173f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17400 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
17410 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
17420 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20 20  n->nSdst, .     
17430 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
17440 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  zAffSdst, pIn->n
17450 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
17460 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
17470 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
17480 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
17490 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
174a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
174b0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
174c0 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
174d0 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20  iSDParm, r1,.   
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174f0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64          pIn->iSd
17500 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
17510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
17520 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17530 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
17540 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
17550 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
17560 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
17570 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
17580 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
17590 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
175a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
175b0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
175c0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
175d0 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
175e0 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
175f0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
17600 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
17610 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
17620 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
17630 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
17640 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
17650 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
17660 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17670 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
17680 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
17690 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
176a0 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
176b0 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
176c0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
176d0 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
176e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
176f0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
17700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
17710 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
17720 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
17730 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
17740 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
17750 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
17760 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
17770 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
17780 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
17790 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
177a0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
177b0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
177c0 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
177d0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
177e0 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
177f0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
17800 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17810 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
17820 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
17830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17840 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
17850 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
17860 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
17870 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
17880 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17890 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
178a0 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
178b0 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
178c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
178d0 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
178e0 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
178f0 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
17900 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
17910 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
17920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
17930 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
17940 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
17950 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
17960 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
17970 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
17980 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
17990 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
179a0 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
179b0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
179c0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
179d0 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
179e0 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
179f0 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
17a00 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
17a10 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
17a20 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
17a30 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
17a40 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
17a50 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
17a60 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
17a70 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
17a80 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
17a90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17aa0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
17ab0 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
17ac0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17ad0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17ae0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
17af0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
17b00 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17b10 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
17b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17b30 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
17b40 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
17b50 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
17b60 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
17b70 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
17b80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17b90 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
17ba0 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  umpZero, p->iLim
17bb0 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
17bc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17bd0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
17be0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
17bf0 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
17c00 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17c10 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
17c20 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
17c30 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
17c40 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
17c50 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
17c60 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
17c70 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
17c80 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
17c90 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
17ca0 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
17cb0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
17cc0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
17cd0 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
17ce0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
17cf0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
17d00 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
17d10 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
17d20 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
17d30 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
17d40 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
17d50 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
17d60 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
17d70 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
17d80 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
17d90 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
17da0 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
17db0 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
17dc0 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
17dd0 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
17de0 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
17df0 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
17e00 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
17e10 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
17e20 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
17e30 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
17e40 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
17e50 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
17e60 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
17e70 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
17e80 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
17e90 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
17ea0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
17eb0 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
17ec0 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
17ed0 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
17ee0 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
17ef0 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
17f00 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
17f10 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17f20 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
17f30 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
17f40 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
17f50 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
17f60 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
17f70 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
17f80 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
17f90 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
17fa0 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
17fb0 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
17fc0 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
17fd0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
17fe0 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
17ff0 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
18000 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
18010 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
18020 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
18030 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
18040 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
18050 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
18060 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
18070 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
18080 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
18090 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
180a0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
180b0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
180c0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
180d0 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
180e0 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
180f0 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
18100 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
18110 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
18120 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
18130 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
18140 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
18150 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
18160 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
18170 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
18180 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
18190 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
181a0 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
181b0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
181c0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
181d0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
181e0 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
181f0 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
18200 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
18210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
18220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
18230 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
18240 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
18250 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
18260 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
18270 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
18280 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
18290 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
182a0 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
182b0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
182c0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
182d0 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
182e0 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
182f0 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
18300 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
18310 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
18320 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
18330 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
18340 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
18350 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
18360 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
18370 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
18380 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
18390 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
183a0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
183b0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
183c0 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
183d0 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
183e0 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
183f0 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
18400 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
18410 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
18420 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
18430 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
18440 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
18450 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
18460 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
18470 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
18480 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
18490 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
184a0 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
184b0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
184c0 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
184d0 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
184e0 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
184f0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
18500 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
18510 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
18520 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
18530 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
18540 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
18550 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
18560 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
18570 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
18580 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
18590 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
185a0 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
185b0 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
185c0 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
185d0 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
185e0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
185f0 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
18600 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
18610 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
18620 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
18630 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
18640 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
18650 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
18660 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
18670 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
18680 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
18690 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
186a0 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
186b0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
186c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
186d0 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
186e0 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
186f0 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
18700 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
18710 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
18720 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
18730 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
18740 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
18750 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
18760 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
18770 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
18780 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
18790 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
187a0 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
187b0 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
187c0 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
187d0 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
187e0 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
187f0 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
18800 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
18810 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
18820 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
18830 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
18840 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
18850 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
18860 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
18870 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
18880 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
18890 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
188a0 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
188b0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
188c0 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
188d0 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
188e0 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
188f0 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
18900 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
18910 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
18920 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
18930 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
18940 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
18950 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
18960 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
18970 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
18980 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
18990 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
189a0 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
189b0 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
189c0 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
189d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
189e0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
189f0 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
18a00 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
18a10 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
18a20 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
18a30 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
18a40 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
18a50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18a60 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
18a70 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
18a80 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
18a90 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
18aa0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
18ab0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
18ac0 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18ae0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
18af0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
18b00 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
18b10 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
18b20 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
18b30 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18b50 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
18b60 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
18b70 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
18b80 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
18b90 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
18ba0 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
18bb0 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
18bc0 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
18bd0 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
18be0 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
18bf0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18c00 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18c10 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
18c20 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18c30 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
18c40 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
18c50 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
18c60 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18c70 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
18c80 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18c90 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
18ca0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18cb0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
18cc0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18cd0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18ce0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18cf0 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
18d00 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18d10 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18d20 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
18d30 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
18d40 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
18d50 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
18d60 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
18d70 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
18d80 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
18d90 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
18da0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
18db0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18dc0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
18dd0 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
18de0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
18df0 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
18e00 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18e10 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
18e20 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18e30 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
18e40 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
18e50 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
18e60 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
18e70 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
18e80 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
18e90 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
18ea0 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
18eb0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18ec0 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
18ed0 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
18ee0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
18ef0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18f00 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
18f10 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18f20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
18f30 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18f40 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
18f50 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18f60 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
18f70 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18f80 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
18f90 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18fa0 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
18fb0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
18fc0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
18fd0 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
18fe0 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
18ff0 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
19000 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
19010 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
19020 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
19030 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
19040 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
19050 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
19060 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
19070 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
19080 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
19090 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
190a0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
190b0 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
190c0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
190d0 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
190e0 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
190f0 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
19100 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
19110 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
19120 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
19130 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
19140 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
19150 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
19160 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
19170 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
19180 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
19190 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
191a0 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
191b0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
191c0 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
191d0 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
191e0 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
191f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
19200 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
19210 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
19220 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
19230 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
19240 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
19250 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
19260 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
19270 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
19280 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
19290 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
192a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
192b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
192c0 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
192d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
192e0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
192f0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
19300 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
19310 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19320 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
19330 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
19340 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
19350 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
19360 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
19370 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
19380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
19390 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
193a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
193b0 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
193c0 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
193d0 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
193e0 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
193f0 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
19400 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
19410 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
19420 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
19430 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
19440 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
19450 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
19460 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
19470 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
19480 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
19490 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
194a0 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
194b0 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
194c0 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
194d0 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
194e0 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
194f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19500 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
19510 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
19520 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19530 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
19540 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
19550 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
19560 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
19570 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
19580 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
19590 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
195a0 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
195b0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
195c0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
195d0 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
195e0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
195f0 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
19600 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
19610 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
19620 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
19630 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
19640 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
19650 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
19660 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
19670 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
19680 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
19690 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
196a0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
196b0 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
196c0 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
196d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
196e0 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
196f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
19700 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
19710 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
19720 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
19730 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
19740 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
19750 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
19760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
19770 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
19780 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
19790 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
197a0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
197b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
197c0 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
197d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
197e0 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
197f0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
19800 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
19810 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
19820 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
19830 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
19840 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
19850 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
19860 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
19870 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20  >u.iValue = i;. 
19880 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
19890 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20  By = pOrderBy = 
198a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
198b0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
198c0 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
198d0 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
198e0 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
198f0 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
19900 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
19910 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
19920 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19930 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
19940 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
19950 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
19960 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
19970 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
19980 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
19990 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
199a0 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
199b0 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
199c0 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
199d0 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
199e0 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
199f0 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
19a00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19a10 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
19a20 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
19a30 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
19a40 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
19a50 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
19a60 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
19a70 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
19a80 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
19a90 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
19aa0 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
19ab0 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f   sizeof(int)*(nO
19ac0 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20  rderBy + 1));.  
19ad0 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
19ae0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
19af0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
19b00 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d  .    aPermute[0]
19b10 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20   = nOrderBy;.   
19b20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d   for(i=1, pItem=
19b30 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d  pOrderBy->a; i<=
19b40 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70  nOrderBy; i++, p
19b50 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61  Item++){.      a
19b60 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
19b70 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
19b80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19b90 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
19ba0 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69  erByCol<=p->pELi
19bb0 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
19bc0 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d     aPermute[i] =
19bd0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
19be0 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  erByCol - 1;.   
19bf0 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65   }.    pKeyMerge
19c00 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72   = multiSelectOr
19c10 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61  derByKeyInfo(pPa
19c20 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65  rse, p, 1);.  }e
19c30 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72  lse{.    pKeyMer
19c40 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ge = 0;.  }..  /
19c50 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f  * Reattach the O
19c60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
19c70 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  o the query..  *
19c80 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
19c90 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50  = pOrderBy;.  pP
19ca0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rior->pOrderBy =
19cb0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
19cc0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
19cd0 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20  pOrderBy, 0);.. 
19ce0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72   /* Allocate a r
19cf0 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72  ange of temporar
19d00 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  y registers and 
19d10 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64  the KeyInfo need
19d20 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ed.  ** for the 
19d30 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76  logic that remov
19d40 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73  es duplicate res
19d50 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68  ult rows when th
19d60 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20  e.  ** operator 
19d70 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  is UNION, EXCEPT
19d80 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28  , or INTERSECT (
19d90 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c  but not UNION AL
19da0 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  L)..  */.  if( o
19db0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
19dc0 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20   regPrev = 0;.  
19dd0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
19de0 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
19df0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->nExpr;.    ass
19e00 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e  ert( nOrderBy>=n
19e10 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
19e20 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
19e30 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65  regPrev = pParse
19e40 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
19e50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45  arse->nMem += nE
19e60 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74  xpr+1;.    sqlit
19e70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19e80 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
19e90 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65  egPrev);.    pKe
19ea0 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65  yDup = sqlite3Ke
19eb0 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
19ec0 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  Expr, 1);.    if
19ed0 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20  ( pKeyDup ){.   
19ee0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
19ef0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
19f00 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b  able(pKeyDup) );
19f10 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
19f20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
19f30 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
19f40 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69  aColl[i] = multi
19f50 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
19f60 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
19f70 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
19f80 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b  ortOrder[i] = 0;
19f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19fa0 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61   }. .  /* Separa
19fb0 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  te the left and 
19fc0 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20  the right query 
19fd0 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72  from one another
19fe0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f  .  */.  p->pPrio
19ff0 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d  r = 0;.  pPrior-
1a000 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71  >pNext = 0;.  sq
1a010 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
1a020 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
1a030 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
1a040 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28   "ORDER");.  if(
1a050 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d   pPrior->pPrior=
1a060 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1a070 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
1a080 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72  upBy(pParse, pPr
1a090 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ior, pPrior->pOr
1a0a0 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1a0b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
1a0c0 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  te the limit reg
1a0d0 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70  isters */.  comp
1a0e0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
1a0f0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62  s(pParse, p, lab
1a100 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d  elEnd);.  if( p-
1a110 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54  >iLimit && op==T
1a120 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
1a130 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73  LimitA = ++pPars
1a140 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
1a150 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73  LimitB = ++pPars
1a160 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
1a170 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a180 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f  , OP_Copy, p->iO
1a190 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73  ffset ? p->iOffs
1a1a0 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74  et+1 : p->iLimit
1a1b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a      regLimitA);.
1a1e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a1f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
1a200 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67  , regLimitA, reg
1a210 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65  LimitB);.  }else
1a220 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
1a230 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b  = regLimitB = 0;
1a240 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
1a250 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
1a260 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c  pLimit);.  p->pL
1a270 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  imit = 0;.  sqli
1a280 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1a290 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20  , p->pOffset);. 
1a2a0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
1a2b0 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b  ..  regAddrA = +
1a2c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a2d0 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50   regAddrB = ++pP
1a2e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1a2f0 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  gOutA = ++pParse
1a300 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
1a310 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
1a320 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  em;.  sqlite3Sel
1a330 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1a340 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tA, SRT_Coroutin
1a350 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  e, regAddrA);.  
1a360 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
1a370 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52  tInit(&destB, SR
1a380 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
1a390 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
1a3a0 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
1a3b0 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
1a3c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1a3d0 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
1a3e0 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
1a3f0 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
1a400 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
1a410 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
1a420 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tA = sqlite3Vdbe
1a430 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
1a440 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71   1;.  addr1 = sq
1a450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a460 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
1a470 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30  ine, regAddrA, 0
1a480 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
1a490 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a4a0 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29  , "left SELECT")
1a4b0 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69  );.  pPrior->iLi
1a4c0 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b  mit = regLimitA;
1a4d0 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
1a4e0 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
1a4f0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
1a500 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
1a510 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
1a520 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73  or, &destA);.  s
1a530 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
1a540 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64  outine(v, regAdd
1a550 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rA);.  sqlite3Vd
1a560 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1a570 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  dr1);..  /* Gene
1a580 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
1a590 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1a5a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1a5b0 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72  t on .  ** the r
1a5c0 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73  ight - the "B" s
1a5d0 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64  elect.  */.  add
1a5e0 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74  rSelectB = sqlit
1a5f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1a600 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72  r(v) + 1;.  addr
1a610 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
1a620 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
1a630 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1a640 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drB, 0, addrSele
1a650 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctB);.  VdbeComm
1a660 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53  ent((v, "right S
1a670 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
1a680 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
1a690 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
1a6a0 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
1a6b0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
1a6c0 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
1a6d0 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65  ffset = 0;  .  e
1a6e0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
1a6f0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
1a700 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
1a710 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1a720 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
1a730 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
1a740 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
1a750 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
1a760 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
1a770 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1a780 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29  ine(v, regAddrB)
1a790 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1a7a0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1a7b0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
1a7c0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1a7d0 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
1a7e0 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
1a7f0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
1a800 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
1a810 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1a820 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1a830 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
1a840 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
1a850 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1a860 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1a870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a880 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
1a890 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a8b0 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1a8c0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
1a8d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1a8e0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1a8f0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1a900 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
1a910 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1a920 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1a930 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1a940 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1a950 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1a960 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1a970 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
1a980 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1a990 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1a9a0 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
1a9b0 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
1a9c0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
1a9d0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1a9e0 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
1a9f0 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
1aa00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1aa10 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
1aa20 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
1aa30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79    }.  sqlite3Key
1aa40 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75  InfoUnref(pKeyDu
1aa50 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  p);..  /* Genera
1aa60 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1aa70 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1aa80 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1aa90 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
1aaa0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1aab0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1aac0 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
1aad0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
1aae0 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
1aaf0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1ab00 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61  addrEofA_noB = a
1ab10 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45  ddrEofA = labelE
1ab20 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  nd;.  }else{  . 
1ab30 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1ab40 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
1ab50 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1ab60 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
1ab70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ab80 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1ab90 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1aba0 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1abb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1abc0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1abd0 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c   regAddrB, label
1abe0 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac00 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
1ac10 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1ac20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1ac30 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  v, addrEofA);.  
1ac40 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
1ac50 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
1ac60 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
1ac70 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
1ac80 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tRow);.  }..  /*
1ac90 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1aca0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1acb0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1acc0 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
1acd0 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1ace0 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1acf0 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
1ad00 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1ad10 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1ad20 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
1ad30 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
1ad40 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
1ad50 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
1ad60 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
1ad70 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
1ad80 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
1ad90 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1ada0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1adb0 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
1adc0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1add0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1ade0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1adf0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1ae00 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
1ae10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ae20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1ae30 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
1ae40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ae50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1ae60 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29  oto(v, addrEofB)
1ae70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1ae80 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1ae90 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1aea0 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
1aeb0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1aec0 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
1aed0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
1aee0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1aef0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1af00 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1af10 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
1af20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1af30 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1af40 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1af50 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1af60 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1af70 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1af80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1af90 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1afa0 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
1afb0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1afc0 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
1afd0 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1afe0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
1aff0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1b000 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1b010 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
1b020 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
1b030 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1b040 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
1b050 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1b060 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
1b070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b080 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b090 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1b0a0 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1b0b0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1b0c0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1b0d0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
1b0e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b0f0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1b100 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
1b110 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1b120 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
1b130 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1b140 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
1b150 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1b160 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
1b170 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1b180 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
1b190 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b1a0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1b1b0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1b1c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1b1d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b1e0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1b1f0 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1b200 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1b210 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1b220 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1b230 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
1b240 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
1b250 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
1b260 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1b270 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1b280 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
1b290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b2a0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1b2b0 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29  A, addrEofA_noB)
1b2c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b2d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b2e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b2f0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1b300 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1b310 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1b320 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
1b330 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
1b340 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1b350 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1b360 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
1b370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1b380 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
1b390 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
1b3a0 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
1b3b0 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
1b3c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1b3d0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
1b3e0 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42  stA.iSdst, destB
1b3f0 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79  .iSdst, nOrderBy
1b400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b410 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1b420 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
1b430 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
1b440 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1b450 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  v, OPFLAG_PERMUT
1b460 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
1b470 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
1b480 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
1b490 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
1b4a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b4b0 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  v);..  /* Jump t
1b4c0 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
1b4d0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
1b4e0 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
1b4f0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1b500 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1b510 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
1b520 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
1b530 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
1b540 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
1b550 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1b560 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
1b570 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
1b580 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68  = pPrior;.    wh
1b590 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
1b5a0 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
1b5b0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
1b5c0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
1b5d0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1b5e0 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69  First->pSrc, pFi
1b5f0 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
1b600 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  }..  /* Reassemb
1b610 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
1b620 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
1b630 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
1b640 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
1b650 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
1b660 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
1b670 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1b680 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1b690 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ete(db, p->pPrio
1b6a0 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72  r);.  }.  p->pPr
1b6b0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1b6c0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
1b6d0 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  p;..  /*** TBD: 
1b6e0 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
1b6f0 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
1b700 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
1b710 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
1b720 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
1b730 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
1b740 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
1b750 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
1b760 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
1b770 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a  rse->nErr!=0;.}.
1b780 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
1b790 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b7a0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1b7b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b7c0 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77  IT_VIEW)./* Forw
1b7d0 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  ard Declarations
1b7e0 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1b7f0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 50 61  substExprList(Pa
1b800 72 73 65 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  rse*, ExprList*,
1b810 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
1b820 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
1b830 62 73 74 53 65 6c 65 63 74 28 50 61 72 73 65 2a  bstSelect(Parse*
1b840 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
1b850 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 29   ExprList*, int)
1b860 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
1b870 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
1b880 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
1b890 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
1b8a0 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
1b8b0 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
1b8c0 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
1b8d0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
1b8e0 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
1b8f0 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
1b900 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
1b910 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
1b920 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
1b930 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
1b940 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
1b950 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
1b960 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
1b970 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
1b980 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
1b990 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
1b9a0 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
1b9b0 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
1b9c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1b9d0 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
1b9e0 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
1b9f0 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
1ba00 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
1ba10 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
1ba20 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1ba30 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73   make the necess
1ba40 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
1ba50 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
1ba60 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
1ba70 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
1ba80 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
1ba90 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
1baa0 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
1bab0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1bac0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
1bad0 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 50   *substExpr(.  P
1bae0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1baf0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 65 72 72     /* Report err
1bb00 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
1bb10 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
1bb20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
1bb30 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
1bb40 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20  occurs */.  int 
1bb50 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1bb60 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
1bb70 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
1bb80 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1bb90 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
1bba0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  e expressions */
1bbb0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1bbc0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1bbd0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1bbe0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1bbf0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1bc00 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
1bc10 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
1bc20 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1bc30 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1bc40 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1bc50 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1bc60 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1bc70 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
1bc80 20 2a 70 43 6f 70 79 20 3d 20 70 45 4c 69 73 74   *pCopy = pEList
1bc90 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
1bca0 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  mn].pExpr;.     
1bcb0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
1bcc0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
1bcd0 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
1bce0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
1bcf0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1bd00 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
1bd10 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
1bd20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1bd30 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20  IsVector(pCopy) 
1bd40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bd50 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
1bd60 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79 29 3b  (pParse, pCopy);
1bd70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bd80 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1bd90 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1bda0 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20 20  pCopy, 0);.     
1bdb0 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28     if( pNew && (
1bdc0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
1bdd0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
1bde0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
1bdf0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1be00 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
1be10 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  inTable;.       
1be20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
1be30 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  = EP_FromJoin;. 
1be40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1be50 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1be60 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
1be70 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
1be80 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  New;.      }.   
1be90 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1bea0 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
1beb0 75 62 73 74 45 78 70 72 28 70 50 61 72 73 65 2c  ubstExpr(pParse,
1bec0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
1bed0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1bee0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
1bef0 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 50  t = substExpr(pP
1bf00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1bf10 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
1bf20 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ist);.    if( Ex
1bf30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1bf40 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1bf50 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
1bf60 74 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  tSelect(pParse, 
1bf70 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1bf80 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1bf90 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
1bfa0 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1bfb0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 78  List(pParse, pEx
1bfc0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pr->x.pList, iTa
1bfd0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1bfe0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bff0 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1c000 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1c010 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
1c020 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 52  arse,       /* R
1c030 65 70 6f 72 74 20 65 72 72 6f 72 73 20 68 65 72  eport errors her
1c040 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1c050 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
1c060 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
1c070 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1c080 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
1c090 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1c0a0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1c0b0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
1c0c0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1c0d0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
1c0e0 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
1c0f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1c100 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1c110 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
1c120 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1c130 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
1c140 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
1c150 3d 20 73 75 62 73 74 45 78 70 72 28 70 50 61 72  = substExpr(pPar
1c160 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
1c170 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
1c180 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
1c190 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
1c1a0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
1c1b0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
1c1c0 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 20 68   Report errors h
1c1d0 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
1c1e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
1c1f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c200 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
1c210 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
1c220 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1c230 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
1c240 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
1c250 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1c260 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20   *pEList,    /* 
1c270 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
1c280 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69  s */.  int doPri
1c290 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  or          /* D
1c2a0 6f 20 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e  o substitutes on
1c2b0 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a   p->pPrior too *
1c2c0 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
1c2d0 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
1c2e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1c2f0 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1c300 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
1c310 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45    do{.    substE
1c320 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1c330 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c  p->pEList, iTabl
1c340 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1c350 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 50  substExprList(pP
1c360 61 72 73 65 2c 20 70 2d 3e 70 47 72 6f 75 70 42  arse, p->pGroupB
1c370 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
1c380 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
1c390 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
1c3a0 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c  >pOrderBy, iTabl
1c3b0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1c3c0 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  p->pHaving = sub
1c3d0 73 74 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  stExpr(pParse, p
1c3e0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
1c3f0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1c400 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
1c410 74 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 2d  tExpr(pParse, p-
1c420 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c  >pWhere, iTable,
1c430 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 53   pEList);.    pS
1c440 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
1c450 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
1c460 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  0 );.    for(i=p
1c470 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d  Src->nSrc, pItem
1c480 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69  =pSrc->a; i>0; i
1c490 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
1c4a0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1c4b0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
1c4c0 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1c4d0 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20 20  pEList, 1);.    
1c4e0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
1c4f0 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
1c500 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1c510 73 74 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  st(pParse, pItem
1c520 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 69  ->u1.pFuncArg, i
1c530 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1c540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c550 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72 20  }while( doPrior 
1c560 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f  && (p = p->pPrio
1c570 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69  r)!=0 );.}.#endi
1c580 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
1c590 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1c5a0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1c5b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1c5c0 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
1c5d0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1c5e0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1c5f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1c600 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
1c610 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
1c620 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
1c630 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65  bqueries as a pe
1c640 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
1c650 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  zation..** This 
1c660 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1c670 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
1c680 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
1c690 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63  o flattening occ
1c6a0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
1c6b0 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
1c6c0 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
1c6d0 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
1c6e0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
1c6f0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
1c700 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
1c710 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1c720 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1c730 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
1c740 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
1c750 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
1c760 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
1c770 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
1c780 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
1c790 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
1c7a0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
1c7b0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
1c7c0 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
1c7d0 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
1c7e0 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
1c7f0 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
1c800 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
1c810 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
1c820 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
1c830 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
1c840 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
1c850 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
1c860 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
1c870 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c880 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
1c890 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
1c8a0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1c8b0 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
1c8c0 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
1c8d0 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
1c8e0 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
1c8f0 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
1c900 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1c910 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1c920 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
1c930 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
1c940 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
1c950 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69   for this simpli
1c960 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
1c970 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
1c980 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
1c990 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
1c9a0 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
1c9b0 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
1c9c0 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
1c9d0 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
1c9e0 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
1c9f0 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
1ca00 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
1ca10 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
1ca20 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
1ca30 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
1ca40 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1ca50 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
1ca60 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1ca70 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ca80 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
1ca90 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1caa0 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
1cab0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1cac0 61 67 67 72 65 67 61 74 65 20 6f 72 20 28 32 61  aggregate or (2a
1cad0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1cae0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  y is not a join.
1caf0 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 28 32  **        and (2
1cb00 62 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  b) the outer que
1cb10 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1cb20 73 75 62 71 75 65 72 69 65 73 20 6f 74 68 65 72  subqueries other
1cb30 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a   than the one.**
1cb40 20 20 20 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61          FROM-cla
1cb50 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61  use subquery tha
1cb60 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  t is a candidate
1cb70 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e   for flattening.
1cb80 20 20 28 32 62 20 69 73 0a 2a 2a 20 20 20 20 20    (2b is.**     
1cb90 20 20 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74     due to ticket
1cba0 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1cbb0 66 38 30 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30  f80] from 2015-0
1cbc0 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1cbd0 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1cbe0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
1cbf0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
1cc00 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a  eft outer join.*
1cc10 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e  *        (Origin
1cc20 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36  ally ticket #306
1cc30 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20  .  Strengthened 
1cc40 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29  by ticket #3300)
1cc50 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
1cc60 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1cc70 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  t DISTINCT..**.*
1cc80 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
1cc90 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
1cca0 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
1ccb0 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
1ccc0 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
1ccd0 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
1cce0 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
1ccf0 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
1cd00 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
1cd10 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
1cd20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
1cd30 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
1cd40 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
1cd50 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
1cd60 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
1cd70 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1cd80 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
1cd90 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
1cda0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1cdb0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1cdc0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
1cdd0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
1cde0 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
1cdf0 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62    TODO:  For sub
1ce00 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a  queries without.
1ce10 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d  **        A FROM
1ce20 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65   clause, conside
1ce30 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20  r adding a FROM 
1ce40 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73  close with the s
1ce50 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1ce60 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1ce70 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1ce80 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1ce90 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1cea0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1ceb0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1cec0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1ced0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1cee0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1cef0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1cf00 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1cf10 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1cf20 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1cf30 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1cf40 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1cf50 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
1cf60 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1cf70 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20  *)  Restriction 
1cf80 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64  (10) was removed
1cf90 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f   from the code o
1cfa0 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74  n 2005-02-05 but
1cfb0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63   we.**        ac
1cfc0 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64  cidently carried
1cfd0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72   the comment for
1cfe0 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d  ward until 2014-
1cff0 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c  09-15.  Original
1d000 0a 2a 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a  .**        text:
1d010 20 22 54 68 65 20 73 75 62 71 75 65 72 79 20 64   "The subquery d
1d020 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1d030 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1d040 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20  ter query .**   
1d050 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 75 73       does not us
1d060 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20  e LIMIT.".**.** 
1d070 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
1d080 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1d090 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1d0a0 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
1d0b0 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
1d0c0 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
1d0d0 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
1d0e0 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1d0f0 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
1d100 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
1d110 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
1d120 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
1d130 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
1d140 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
1d150 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1d160 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  nd outer query d
1d170 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  o not both use L
1d180 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
1d190 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1d1a0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
1d1b0 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
1d1c0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1d1d0 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  y is not part of
1d1e0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1d1f0 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  ct or the.**    
1d200 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65      subquery doe
1d210 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d  s not have a LIM
1d220 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
1d230 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
1d240 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
1d250 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
1d260 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68  .**.**  (16)  Th
1d270 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1d280 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1d290 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72  e or the subquer
1d2a0 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20  y does.**       
1d2b0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
1d2c0 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
1d2d0 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
1d2e0 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
1d2f0 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
1d300 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
1d310 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
1d320 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
1d330 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75  **  (17)  The su
1d340 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1d350 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1d360 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49  , or it is a UNI
1d370 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20  ON ALL .**      
1d380 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73    compound claus
1d390 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65  e made up entire
1d3a0 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67  ly of non-aggreg
1d3b0 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64  ate queries, and
1d3c0 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20   .**        the 
1d3d0 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a  parent query:.**
1d3e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1d3f0 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72  s not itself par
1d400 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1d410 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20  select,.**      
1d420 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20      * is not an 
1d430 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53  aggregate or DIS
1d440 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64  TINCT query, and
1d450 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1d460 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a  s not a join.**.
1d470 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
1d480 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
1d490 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
1d4a0 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
1d4b0 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
1d4c0 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
1d4d0 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
1d4e0 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
1d4f0 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
1d500 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
1d510 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
1d520 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
1d530 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
1d540 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1d550 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
1d560 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
1d570 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
1d580 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
1d590 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1d5a0 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
1d5b0 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
1d5c0 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
1d5d0 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
1d5e0 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
1d5f0 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
1d600 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1d610 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1d620 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
1d630 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
1d640 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
1d650 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
1d660 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
1d670 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
1d680 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1d690 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
1d6a0 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
1d6b0 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
1d6c0 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
1d6d0 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
1d6e0 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
1d6f0 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
1d700 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
1d710 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
1d720 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
1d730 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
1d740 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
1d750 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
1d760 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
1d770 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1d780 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1d790 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1d7a0 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
1d7b0 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74  R by clause of t
1d7c0 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
1d7d0 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
1d7e0 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
1d7f0 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
1d800 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
1d810 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62  *  (19)  The sub
1d820 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1d830 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1d840 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1d850 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
1d860 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
1d870 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20  se..**.**  (20) 
1d880 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1d890 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1d8a0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20  select, then it 
1d8b0 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  must not use.** 
1d8c0 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20         an ORDER 
1d8d0 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b  BY clause.  Tick
1d8e0 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f  et #3773.  We co
1d8f0 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63  uld relax this c
1d900 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20  onstraint.**    
1d910 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20      somewhat by 
1d920 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20  saying that the 
1d930 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1d940 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73  ER BY clause mus
1d950 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65  t.**        appe
1d960 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64  ar as unmodified
1d970 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
1d980 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1d990 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20  ry.  But we.**  
1d9a0 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
1d9b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
1d9c0 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
1d9d0 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
1d9e0 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20  *.**  (21)  The 
1d9f0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1da00 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1da10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1da20 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1da30 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
1da40 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
1da50 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32  fc])..**.**  (22
1da60 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1da70 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
1da80 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28  ve CTE..**.**  (
1da90 32 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20  23)  The parent 
1daa0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
1dab0 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73  ve CTE, or the s
1dac0 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
1dad0 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70  a.**        comp
1dae0 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73  ound query. This
1daf0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20   restriction is 
1db00 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72  because transfor
1db10 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ming the.**     
1db20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63     parent to a c
1db30 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f  ompound query co
1db40 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20  nfuses the code 
1db50 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20  that handles.** 
1db60 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65         recursive
1db70 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74   queries in mult
1db80 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a  iSelect()..**.**
1db90 20 20 28 32 34 29 20 20 54 68 65 20 73 75 62 71    (24)  The subq
1dba0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1dbb0 67 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73  ggregate that us
1dbc0 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  es the built-in 
1dbd0 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20  min() or .**    
1dbe0 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e      or max() fun
1dbf0 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75  ctions.  (Withou
1dc00 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
1dc10 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65  on, a query like
1dc20 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c  :.**        "SEL
1dc30 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45  ECT x FROM (SELE
1dc40 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f  CT max(y), x FRO
1dc50 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74  M t1)" would not
1dc60 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20   necessarily.** 
1dc70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
1dc80 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68  e value X for wh
1dc90 69 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61  ich Y was maxima
1dca0 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20  l.).**.**.** In 
1dcb0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
1dcc0 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
1dcd0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1dce0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1dcf0 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
1dd00 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
1dd10 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
1dd20 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
1dd30 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
1dd40 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20   aggregates and 
1dd50 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73  subqueryIsAgg is
1dd60 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62   true if the sub
1dd70 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
1dd80 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
1dd90 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
1dda0 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
1ddb0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1ddc0 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
1ddd0 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
1dde0 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
1ddf0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
1de00 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
1de10 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
1de20 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
1de30 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
1de40 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
1de50 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
1de60 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
1de70 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
1de80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
1de90 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
1dea0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1deb0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1dec0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1ded0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1dee0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
1def0 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
1df00 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
1df10 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
1df20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1df30 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
1df40 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
1df50 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
1df60 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
1df70 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
1df80 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
1df90 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
1dfa0 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
1dfb0 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
1dfc0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
1dfd0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
1dfe0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
1dff0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1e000 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
1e010 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
1e020 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
1e030 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a   *pParent;    /*
1e040 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41   Current UNION A
1e050 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f  LL term of the o
1e060 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  ther query */.  
1e070 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
1e080 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
1e090 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
1e0a0 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
1e0b0 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
1e0c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
1e0d0 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
1e0e0 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
1e0f0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1e100 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
1e110 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1e120 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1e130 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
1e140 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
1e150 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1e160 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
1e170 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
1e180 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
1e190 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
1e1a0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
1e1b0 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
1e1c0 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
1e1d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
1e1e0 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
1e1f0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
1e200 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1e210 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1e220 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1e230 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
1e240 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1e250 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1e260 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e270 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
1e280 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
1e290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1e2a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1e2b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
1e2c0 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
1e2d0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
1e2e0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
1e2f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1e300 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
1e310 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
1e320 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  ;  /* Unable to 
1e330 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64  flatten compound
1e340 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66   queries */.  if
1e350 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
1e360 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
1e370 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
1e380 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1e390 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1e3a0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
1e3b0 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
1e3c0 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
1e3d0 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
1e3e0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
1e3f0 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
1e400 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
1e410 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
1e420 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
1e430 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
1e440 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
1e450 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 69  Agg ){.    if( i
1e460 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1e4a0 31 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  1)   */.    if( 
1e4b0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
1e4c0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e4f0 28 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66 28  (2a)  */.    if(
1e500 20 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20 45   (p->pWhere && E
1e510 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e520 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62 71  ->pWhere,EP_Subq
1e530 75 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20 28  uery)).     || (
1e540 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
1e550 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29 20  lags(p->pEList) 
1e560 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d  & EP_Subquery)!=
1e570 30 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74  0.     || (sqlit
1e580 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
1e590 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20 45  p->pOrderBy) & E
1e5a0 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20  P_Subquery)!=0. 
1e5b0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1e5c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e5f0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1e600 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  b)  */.    }.  }
1e610 0a 20 20 20 20 0a 20 20 70 53 75 62 53 72 63 20  .    .  pSubSrc 
1e620 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
1e630 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
1e640 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
1e650 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
1e660 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1e670 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
1e680 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
1e690 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
1e6a0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
1e6b0 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d  , we allowed som
1e6c0 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c  e combining of L
1e6d0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
1e6e0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
1e6f0 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75  y could be compu
1e700 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
1e710 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c  ime.  But when L
1e720 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
1e730 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69    ** became arbi
1e740 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1e750 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  s, we were force
1e760 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63  d to add restric
1e770 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20  tions (13).  ** 
1e780 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69  and (14). */.  i
1e790 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1e7a0 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  && p->pLimit ) r
1e7b0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e7c0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e7d0 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69  tion (13) */.  i
1e7e0 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  f( pSub->pOffset
1e7f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e810 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e820 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69  tion (14) */.  i
1e830 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1e840 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d  & SF_Compound)!=
1e850 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  0 && pSub->pLimi
1e860 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
1e870 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
1e8b0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
1e8c0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
1e8d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8f0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e900 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (7)  */.  if( p
1e910 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1e920 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  SF_Distinct ) re
1e930 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1e940 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e950 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (5)  */.  if( p
1e960 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1e970 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
1e980 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
1e990 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e9a0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1e9b0 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20   (8)(9) */.  }. 
1e9c0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1e9d0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1e9e0 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49  !=0 && subqueryI
1e9f0 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74  sAgg ){.     ret
1ea00 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
1ea10 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36  * Restriction (6
1ea20 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  )  */.  }.  if( 
1ea30 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
1ea40 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1ea50 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ea90 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
1eaa0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
1eab0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1eac0 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eae0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
1eaf0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1eb00 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
1eb10 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb30 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
1eb40 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1eb50 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
1eb60 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1eb70 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
1eb80 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1eb90 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1eba0 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
1ebb0 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d   testcase( pSub-
1ebc0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1ebd0 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20 74 65  ecursive );.  te
1ebe0 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65  stcase( pSub->se
1ebf0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d  lFlags & SF_MinM
1ec00 61 78 41 67 67 20 29 3b 0a 20 20 69 66 28 20 70  axAgg );.  if( p
1ec10 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1ec20 28 53 46 5f 52 65 63 75 72 73 69 76 65 7c 53 46  (SF_Recursive|SF
1ec30 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20  _MinMaxAgg) ){. 
1ec40 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
1ec50 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32  Restrictions (22
1ec60 29 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20  ) and (24) */.  
1ec70 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
1ec80 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
1ec90 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50  ive) && pSub->pP
1eca0 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
1ecb0 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
1ecc0 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d  tion (23) */.  }
1ecd0 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20  ..  /* OBSOLETE 
1ece0 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20  COMMENT 1:.  ** 
1ecf0 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
1ed00 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1ed10 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
1ed20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1ed30 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
1ed40 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
1ed50 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
1ed60 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
1ed70 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
1ed80 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
1ed90 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
1eda0 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
1edb0 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
1edc0 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
1edd0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
1ede0 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
1edf0 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
1ee00 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
1ee10 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
1ee20 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
1ee30 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
1ee40 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
1ee50 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
1ee60 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
1ee70 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 2:.  ** Restr
1ee80 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
1ee90 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
1eea0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1eeb0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1eec0 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
1eed0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
1eee0 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
1eef0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
1ef00 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
1ef10 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
1ef20 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
1ef30 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
1ef40 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
1ef50 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
1ef60 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
1ef70 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1ef80 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1ef90 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1efa0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1efb0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1efc0 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
1efd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
1efe0 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
1eff0 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
1f000 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
1f010 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
1f020 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
1f030 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
1f040 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
1f050 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  R JOIN..  **.  *
1f060 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53  * THIS OVERRIDES
1f070 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1f080 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45  TS 1 AND 2 ABOVE
1f090 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33  :.  ** Ticket #3
1f0a0 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66  300 shows that f
1f0b0 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69  lattening the ri
1f0c0 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
1f0d0 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20  FT JOIN.  ** is 
1f0e0 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e  fraught with dan
1f0f0 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76  ger.  Best to av
1f100 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68  oid the whole th
1f110 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  ing.  If the.  *
1f120 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  * subquery is th
1f130 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1f140 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
1f150 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
1f160 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
1f170 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  ubitem->fg.joint
1f180 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
1f190 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f1a0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
1f1b0 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
1f1c0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1f1d0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
1f1e0 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
1f1f0 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
1f200 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
1f210 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
1f220 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
1f230 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
1f240 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
1f250 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
1f260 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
1f270 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
1f280 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
1f290 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
1f2a0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
1f2b0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
1f2c0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
1f2d0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f2e0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
1f2f0 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
1f300 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
1f310 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1f320 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
1f330 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
1f340 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1f350 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
1f360 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
1f370 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
1f380 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
1f390 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1f3a0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1f3b0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1f3c0 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
1f3d0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
1f3e0 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1f3f0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1f400 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1f410 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
1f420 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1f430 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30  t( pSub->pSrc!=0
1f440 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f450 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  ( pSub->pEList->
1f460 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45  nExpr==pSub1->pE
1f470 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1f480 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d       if( (pSub1-
1f490 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1f4a0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1f4b0 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20  egate))!=0.     
1f4c0 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72    || (pSub1->pPr
1f4d0 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70  ior && pSub1->op
1f4e0 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20  !=TK_ALL) .     
1f4f0 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
1f500 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 29  ->nSrc<1.      )
1f510 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1f520 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1f530 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1f540 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  1->pSrc->nSrc>1 
1f550 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1f560 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
1f570 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
1f580 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1f590 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
1f5a0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
1f5b0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
1f5c0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
1f5d0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
1f5e0 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  a[ii].u.x.iOrder
1f5f0 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
1f600 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1f610 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a   }.  }..  /*****
1f620 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1f630 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e  s point, flatten
1f640 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1f650 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43  . *****/.  SELEC
1f660 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
1f670 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25  p,("flatten %s.%
1f680 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e  p from term %d\n
1f690 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f6a0 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c        pSub->zSel
1f6b0 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f  Name, pSub, iFro
1f6c0 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  m));..  /* Autho
1f6d0 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
1f6e0 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
1f6f0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
1f700 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
1f710 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
1f720 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1f730 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
1f740 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
1f750 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
1f760 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
1f770 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1f780 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
1f790 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
1f7a0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1f7b0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1f7c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1f7d0 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
1f7e0 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
1f7f0 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
1f800 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
1f810 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
1f820 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
1f830 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
1f840 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
1f850 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
1f860 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
1f870 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
1f880 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
1f890 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
1f8a0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1f8b0 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
1f8c0 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
1f8d0 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
1f8e0 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
1f8f0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1f900 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
1f910 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
1f920 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
1f930 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
1f940 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
1f950 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
1f960 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
1f970 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
1f980 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
1f990 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
1f9a0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
1f9b0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
1f9c0 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
1f9d0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
1f9e0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
1f9f0 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
1fa00 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
1fa10 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
1fa20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1fa30 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1fa40 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1fa50 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
1fa60 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1fa70 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1fa80 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1fa90 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
1faa0 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
1fab0 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
1fac0 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
1fad0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
1fae0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1faf0 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
1fb00 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
1fb10 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
1fb20 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
1fb30 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
1fb40 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
1fb50 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1fb60 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1fb70 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
1fb80 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
1fb90 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
1fba0 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
1fbb0 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
1fbc0 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
1fbd0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1fbe0 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
1fbf0 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
1fc00 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
1fc10 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1fc20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
1fc30 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1fc40 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1fc50 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
1fc60 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
1fc70 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  imit;.    Expr *
1fc80 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
1fc90 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  fset;.    Select
1fca0 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
1fcb0 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
1fcc0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
1fcd0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
1fce0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1fcf0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
1fd00 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74  ;.    p->pOffset
1fd10 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
1fd20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
1fd30 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
1fd40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
1fd50 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62  tName(pNew, pSub
1fd60 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20  ->zSelName);.   
1fd70 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
1fd80 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c  ffset;.    p->pL
1fd90 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
1fda0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1fdb0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
1fdc0 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
1fdd0 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c     p->op = TK_AL
1fde0 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  L;.    if( pNew=
1fdf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 ){.      p->p
1fe00 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1fe10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fe20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
1fe30 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
1fe40 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
1fe50 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
1fe60 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65  .      pNew->pNe
1fe70 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d  xt = p;.      p-
1fe80 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a  >pPrior = pNew;.
1fe90 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
1fea0 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  E(2,pParse,p,.  
1feb0 20 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e         ("compoun
1fec0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1fed0 65 6e 65 72 20 63 72 65 61 74 65 73 20 25 73 2e  ener creates %s.
1fee0 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20  %p as peer\n",. 
1fef0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53          pNew->zS
1ff00 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a  elName, pNew));.
1ff10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
1ff20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ff30 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1ff40 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74    /* Begin flatt
1ff50 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d  ening the iFrom-
1ff60 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
1ff70 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a  FROM clause .  *
1ff80 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  * in the outer q
1ff90 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75  uery..  */.  pSu
1ffa0 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62  b = pSub1 = pSub
1ffb0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  item->pSelect;..
1ffc0 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
1ffd0 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
1ffe0 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
1fff0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
20000 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f  ** subquery.  */
20010 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
20020 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
20030 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c  Database);.  sql
20040 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20050 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
20060 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
20070 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
20080 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74  Alias);.  pSubit
20090 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
200a0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
200b0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  Name = 0;.  pSub
200c0 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30  item->zAlias = 0
200d0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  ;.  pSubitem->pS
200e0 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  elect = 0;..  /*
200f0 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20   Defer deleting 
20100 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
20110 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20120 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
20130 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ry until code ge
20140 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  neration is.  **
20150 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65   complete, since
20160 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c   there may still
20170 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62   exist Expr.pTab
20180 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20   entries that.  
20190 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ** refer to the 
201a0 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66  subquery even af
201b0 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  ter flattening. 
201c0 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20   Ticket #3346.. 
201d0 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65   **.  ** pSubite
201e0 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79  m->pTab is alway
201f0 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65  s non-NULL by te
20200 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  st restrictions 
20210 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e  and tests above.
20220 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  .  */.  if( ALWA
20230 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  YS(pSubitem->pTa
20240 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62  b!=0) ){.    Tab
20250 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20  le *pTabToDel = 
20260 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
20270 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65      if( pTabToDe
20280 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b  l->nTabRef==1 ){
20290 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54  .      Parse *pT
202a0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
202b0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
202c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54  Parse);.      pT
202d0 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f  abToDel->pNextZo
202e0 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c  mbie = pToplevel
202f0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
20300 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
20310 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
20320 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
20330 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
20340 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20  l->nTabRef--;.  
20350 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
20360 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
20370 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
20380 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
20390 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
203a0 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
203b0 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
203c0 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
203d0 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
203e0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
203f0 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
20400 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
20410 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
20420 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
20430 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
20440 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
20450 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
20460 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
20470 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
20480 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
20490 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
204a0 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
204b0 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
204c0 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
204d0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
204e0 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
204f0 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
20500 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
20510 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
20520 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
20530 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
20540 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
20550 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
20560 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
20570 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
20580 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
20590 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
205a0 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
205b0 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
205c0 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
205d0 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
205e0 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
205f0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
20600 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
20610 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
20620 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
20630 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
20640 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
20650 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
20660 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
20670 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
20680 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
20690 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
206a0 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20      u8 jointype 
206b0 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63  = 0;.    pSubSrc
206c0 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
206d0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
206e0 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
206f0 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
20700 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
20710 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
20720 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
20730 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
20740 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
20750 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
20760 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
20770 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
20780 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
20790 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
207a0 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
207b0 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
207c0 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
207d0 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
207e0 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f   pSubitem->fg.jo
207f0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
20800 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
20810 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
20820 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
20830 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
20840 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
20850 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
20860 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
20870 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
20880 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
20890 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
208a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
208b0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
208c0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
208d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
208e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
208f0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
20900 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
20910 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
20920 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
20930 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
20940 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
20950 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
20960 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
20970 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
20980 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
20990 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
209a0 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
209b0 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
209c0 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
209d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
209e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
209f0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
20a00 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
20a10 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
20a20 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
20a30 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
20a40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
20a50 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
20a60 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
20a70 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
20a80 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
20a90 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
20aa0 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
20ab0 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
20ac0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
20ad0 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
20ae0 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
20af0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
20b00 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73  query FROM claus
20b10 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20  e to 4 slots..  
20b20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20    ** The middle 
20b30 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
20b40 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
20b50 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
20b60 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20  pace.    ** for 
20b70 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73  the two elements
20b80 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
20b90 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
20ba0 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
20bb0 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
20bc0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20bd0 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71  pSrc = pSrc = sq
20be0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
20bf0 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53  rge(db, pSrc, nS
20c00 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29  ubSrc-1,iFrom+1)
20c10 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
20c20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
20c30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20c40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20c50 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
20c60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
20c70 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  rms from the sub
20c80 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
20c90 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
20ca0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
20cb0 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
20cc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
20cd0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
20ce0 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b  e(db, pSrc->a[i+
20cf0 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a  iFrom].pUsing);.
20d00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
20d10 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66  rc->a[i+iFrom].f
20d20 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29  g.isTabFunc==0 )
20d30 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
20d40 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
20d50 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
20d60 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
20d70 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
20d80 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
20d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
20da0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f  ->a[iFrom].fg.jo
20db0 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
20dc0 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
20dd0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
20de0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
20df0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
20e00 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
20e10 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
20e20 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
20e30 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
20e40 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
20e50 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
20e60 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
20e70 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
20e80 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
20e90 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
20ea0 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
20eb0 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
20ec0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
20ed0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
20ee0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
20ef0 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
20f00 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
20f10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
20f20 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
20f30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20f40 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
20f50 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
20f60 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
20f70 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
20f80 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
20f90 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
20fa0 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
20fb0 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
20fc0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
20fd0 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
20fe0 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
20ff0 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50  /.    pList = pP
21000 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  arent->pEList;. 
21010 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
21020 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
21030 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  {.      if( pLis
21040 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
21050 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
21060 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
21070 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c  3DbStrDup(db, pL
21080 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
21090 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
210a0 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
210b0 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
210c0 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  a[i].zName = zNa
210d0 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
210e0 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
210f0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
21100 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
21110 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f  nt, any non-zero
21120 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c   iOrderByCol val
21130 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ues indicate tha
21140 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  t the.      ** O
21150 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65  RDER BY column e
21160 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65  xpression is ide
21170 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f  ntical to the iO
21180 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20  rderByCol'th.   
21190 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
211a0 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
211b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
211c0 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20  ub. Since these 
211d0 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
211e0 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  do not necessari
211f0 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ly correspond to
21200 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45   columns in SELE
21210 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61  CT statement pPa
21220 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a  rent,.      ** z
21230 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20  ero them before 
21240 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20  transfering the 
21250 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
21260 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21270 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69  ** Not doing thi
21280 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65  s may cause an e
21290 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71  rror if a subseq
212a0 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69  uent call to thi
212b0 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
212c0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
212d0 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75  flatten a compou
212e0 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74  nd sub-query int
212f0 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20  o pParent.      
21300 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79  ** (the only way
21310 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
21320 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f   is if the compo
21330 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73  und sub-query is
21340 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
21350 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62  tly part of pSub
21360 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63  ->pSrc). See tic
21370 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d  ket [d11a6e908f]
21380 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  .  */.      Expr
21390 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
213a0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
213b0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
213c0 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
213d0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
213e0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
213f0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
21400 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21410 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21420 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
21430 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21440 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30   pSub->pPrior==0
21450 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
21460 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  t->pOrderBy = pO
21470 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
21480 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
21490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65  ;.    }.    pWhe
214a0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
214b0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
214c0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  here, 0);.    if
214d0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
214e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
214f0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
21500 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  g==0 );.      pP
21510 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
21520 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
21530 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21540 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
21550 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21560 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
21570 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 0a 20  e3ExprAnd(db, . 
21580 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21590 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
215a0 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 2c 20 70  ->pHaving, 0), p
215b0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 0a  Parent->pHaving.
215c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
215d0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
215e0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
215f0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
21600 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
21610 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
21620 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
21630 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
21640 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
21650 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
21660 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65  prAnd(db, pWhere
21670 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
21680 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
21690 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
216a0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ed==0 ){.      s
216b0 75 62 73 74 53 65 6c 65 63 74 28 70 50 61 72 73  ubstSelect(pPars
216c0 65 2c 20 70 50 61 72 65 6e 74 2c 20 69 50 61 72  e, pParent, iPar
216d0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
216e0 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  t, 0);.    }.  .
216f0 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
21700 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
21710 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
21720 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
21730 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
21740 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
21750 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
21760 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
21770 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
21780 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
21790 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
217a0 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
217b0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
217c0 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
217d0 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
217e0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
217f0 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
21800 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
21810 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
21820 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
21830 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
21840 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
21850 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
21860 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
21870 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
21880 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
21890 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
218a0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
218b0 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
218c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
218d0 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
218e0 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
218f0 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
21900 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
21910 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
21920 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
21930 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
21940 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
21950 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
21960 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
21970 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
21980 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
21990 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
219a0 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e  "After flattenin
219b0 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  g:\n"));.    sql
219c0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
219d0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
219e0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
219f0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
21a00 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
21a10 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
21a20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
21a30 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
21a40 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ....#if !defined
21a50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
21a60 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
21a70 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
21a80 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  IEW)./*.** Make 
21a90 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61  copies of releva
21aa0 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
21ab0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74  terms of the out
21ac0 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a  er query into.**
21ad0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
21ae0 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20  e of subquery.  
21af0 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
21b00 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
21b10 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
21b20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
21b30 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20  ) WHERE x=5 AND 
21b40 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e  y=10;.**.** Tran
21b50 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a  sformed into:.**
21b60 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
21b70 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
21b80 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
21b90 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
21ba0 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20  AND c-d=10).**  
21bb0 20 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44     WHERE x=5 AND
21bc0 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65   y=10;.**.** The
21bd0 20 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68   hope is that th
21be0 65 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f  e terms added to
21bf0 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   the inner query
21c00 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f   will make it mo
21c10 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e  re.** efficient.
21c20 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74  .**.** Do not at
21c30 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d  tempt this optim
21c40 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a  ization if:.**.*
21c50 2a 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e 65  *   (1) The inne
21c60 72 20 71 75 65 72 79 20 69 73 20 61 6e 20 61 67  r query is an ag
21c70 67 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74 68  gregate.  (In th
21c80 61 74 20 63 61 73 65 2c 20 77 65 27 64 20 72 65  at case, we'd re
21c90 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20  ally want.**    
21ca0 20 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f     to copy the o
21cb0 75 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73  uter WHERE-claus
21cc0 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  e terms onto the
21cd0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f   HAVING clause o
21ce0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  f the.**       i
21cf0 6e 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  nner query.  But
21d00 20 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20 77   they probably w
21d10 6f 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65 20  on't help there 
21d20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72  so do not bother
21d30 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54  .).**.**   (2) T
21d40 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
21d50 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
21d60 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e  part of a common
21d70 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f   table expressio
21d80 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54  n..**.**   (3) T
21d90 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68  he inner query h
21da0 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
21db0 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61  e (since the cha
21dc0 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52  nges to the WHER
21dd0 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65  E.**       close
21de0 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68   would change th
21df0 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
21e00 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20   LIMIT)..**.**  
21e10 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (4) The inner q
21e20 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
21e30 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
21e40 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20  EFT JOIN.  (The 
21e50 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20  caller.**       
21e60 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72 65  enforces this re
21e70 73 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20  striction since 
21e80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  this routine doe
21e90 73 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67  s not have enoug
21ea0 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72  h.**       infor
21eb0 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29  mation to know.)
21ec0 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65  .**.**   (5) The
21ed0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
21ee0 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61  pression origina
21ef0 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  tes in the ON or
21f00 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a   USING clause.**
21f10 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54         of a LEFT
21f20 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   JOIN..**.** Ret
21f30 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e  urn 0 if no chan
21f40 67 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64  ges are made and
21f50 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65   non-zero if one
21f60 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63   or more WHERE c
21f70 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61  lause.** terms a
21f80 72 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e  re duplicated in
21f90 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  to the subquery.
21fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
21fb0 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
21fc0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
21fd0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
21fe0 72 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72  rse context (for
21ff0 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72   malloc() and er
22000 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a  ror reporting) *
22010 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
22020 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q,        /* The
22030 20 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20   subquery whose 
22040 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
22050 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20  to be augmented 
22060 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
22070 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
22080 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
22090 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
220a0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73  y */.  int iCurs
220b0 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or           /* 
220c0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
220d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
220e0 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
220f0 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20  ;.  int nChng = 
22100 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  0;.  Select *pX;
22110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
22120 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 63  r looping over c
22130 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20  ompound SELECTs 
22140 69 6e 20 70 53 75 62 71 20 2a 2f 0a 20 20 69 66  in pSubq */.  if
22150 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65  ( pWhere==0 ) re
22160 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70 58  turn 0;.  for(pX
22170 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70  =pSubq; pX; pX=p
22180 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  X->pPrior){.    
22190 69 66 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67  if( (pX->selFlag
221a0 73 20 26 20 28 53 46 5f 41 67 67 72 65 67 61 74  s & (SF_Aggregat
221b0 65 7c 53 46 5f 52 65 63 75 72 73 69 76 65 29 29  e|SF_Recursive))
221c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  !=0 ){.      tes
221d0 74 63 61 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c  tcase( pX->selFl
221e0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
221f0 74 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  te );.      test
22200 63 61 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c 61  case( pX->selFla
22210 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
22220 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
22230 61 73 65 28 20 70 58 21 3d 70 53 75 62 71 20 29  ase( pX!=pSubq )
22240 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
22250 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
22260 73 20 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f  s (1) and (2) */
22270 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
22280 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d   pSubq->pLimit!=
22290 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
222a0 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
222b0 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77  n (3) */.  }.  w
222c0 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70  hile( pWhere->op
222d0 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
222e0 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77  nChng += pushDow
222f0 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72  nWhereTerms(pPar
22300 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72  se, pSubq, pWher
22310 65 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73  e->pRight, iCurs
22320 6f 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20  or);.    pWhere 
22330 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b  = pWhere->pLeft;
22340 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
22350 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72  asProperty(pWher
22360 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  e,EP_FromJoin) )
22370 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
22380 73 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20  striction 5 */. 
22390 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
223a0 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
223b0 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29  pWhere, iCursor)
223c0 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b   ){.    nChng++;
223d0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62  .    while( pSub
223e0 71 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  q ){.      pNew 
223f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
22400 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68  (pParse->db, pWh
22410 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ere, 0);.      p
22420 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28  New = substExpr(
22430 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 69 43  pParse, pNew, iC
22440 75 72 73 6f 72 2c 20 70 53 75 62 71 2d 3e 70 45  ursor, pSubq->pE
22450 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 53 75  List);.      pSu
22460 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  bq->pWhere = sql
22470 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
22480 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70  se->db, pSubq->p
22490 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
224a0 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75 62      pSubq = pSub
224b0 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d  q->pPrior;.    }
224c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
224d0 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  hng;.}.#endif /*
224e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
224f0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
22500 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
22510 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
22520 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
22530 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22540 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
22550 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
22560 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
22570 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
22580 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
22590 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
225a0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
225b0 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
225c0 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
225d0 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
225e0 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
225f0 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
22600 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
22610 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
22620 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
22630 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
22640 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
22650 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
22660 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
22670 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
22680 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
22690 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
226a0 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
226b0 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
226c0 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
226d0 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
226e0 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
226f0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
22700 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
22710 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
22720 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
22730 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
22740 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
22750 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
22760 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
22770 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
22780 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
22790 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
227a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
227b0 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
227c0 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
227d0 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
227e0 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
227f0 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
22800 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
22810 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
22820 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
22830 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
22840 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
22850 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
22860 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
22870 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
22880 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
22890 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
228a0 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
228b0 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
228c0 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
228d0 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
228e0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
228f0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
22900 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
22910 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
22920 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
22930 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
22940 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
22950 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
22960 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
22970 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
22980 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
22990 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
229a0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
229b0 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
229c0 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
229d0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
229e0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
229f0 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
22a00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
22a10 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
22a20 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
22a30 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
22a40 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
22a50 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
22a60 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
22a70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22a80 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
22a90 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
22aa0 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
22ab0 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
22ac0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
22ad0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
22ae0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
22af0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
22b00 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
22b10 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
22b20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
22b30 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
22b40 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
22b50 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
22b60 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
22b70 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
22b80 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
22b90 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
22ba0 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
22bb0 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
22bc0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
22bd0 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
22be0 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
22bf0 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
22c00 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
22c10 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
22c20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
22c30 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
22c40 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
22c50 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
22c60 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
22c70 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22c80 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
22c90 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
22ca0 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
22cb0 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
22cc0 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
22cd0 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
22ce0 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
22cf0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
22d00 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
22d10 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
22d20 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
22d30 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
22d40 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
22d50 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
22d60 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
22d70 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
22d80 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
22d90 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
22da0 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
22db0 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
22dc0 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
22dd0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
22de0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
22df0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
22e00 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
22e10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22e20 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
22e30 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
22e40 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
22e50 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
22e60 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  .pFunc->funcFlag
22e70 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  s&SQLITE_FUNC_CO
22e80 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  UNT)==0 ) return
22e90 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
22ea0 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e  >flags&EP_Distin
22eb0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ct ) return 0;..
22ec0 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
22ed0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
22ee0 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20  ource-list item 
22ef0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
22f00 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e  ument was augmen
22f10 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49  ted with an.** I
22f20 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
22f30 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f  , then try to lo
22f40 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69  cate the specifi
22f50 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  ed index. If the
22f60 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61  re.** was such a
22f70 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
22f80 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e  named index cann
22f90 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  ot be found, ret
22fa0 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
22fb0 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61  RROR and leave a
22fc0 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
22fd0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f  e. Otherwise, po
22fe0 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d  pulate .** pFrom
22ff0 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74  ->pIndex and ret
23000 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
23010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
23020 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72  exedByLookup(Par
23030 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
23040 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
23050 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
23060 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46  From->pTab && pF
23070 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  rom->fg.isIndexe
23080 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  dBy ){.    Table
23090 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
230a0 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a  pTab;.    char *
230b0 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72  zIndexedBy = pFr
230c0 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  om->u1.zIndexedB
230d0 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  y;.    Index *pI
230e0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
230f0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a  =pTab->pIndex; .
23100 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20          pIdx && 
23110 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
23120 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64  Idx->zName, zInd
23130 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20  exedBy); .      
23140 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
23150 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
23160 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
23170 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23180 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
23190 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
231a0 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20  ndexedBy, 0);.  
231b0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
231c0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
231d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
231e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
231f0 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65    pFrom->pIBInde
23200 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20  x = pIdx;.  }.  
23210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23220 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74  ;.}./*.** Detect
23230 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
23240 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
23250 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59   use an ORDER BY
23260 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a   clause with .**
23270 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
23280 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
23290 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ce..**.**    SEL
232a0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
232b0 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
232c0 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  . FROM t2 ORDER 
232d0 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  BY .. COLLATE ..
232e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ..**.** These ar
232f0 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
23300 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a   subquery:.**.**
23310 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23320 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  M (SELECT ... FR
23330 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
23340 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29  ECT ... FROM t2)
23350 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59  .**     ORDER BY
23360 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e   ... COLLATE ...
23370 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
23380 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  sformation is ne
23390 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
233a0 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  the multiSelectO
233b0 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65  rderBy() routine
233c0 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67  .** above that g
233d0 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
233e0 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  e for a compound
233f0 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20   SELECT with an 
23400 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
23410 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20  ** uses a merge 
23420 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72  algorithm that r
23430 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65  equires the same
23440 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
23450 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65  nce on the.** re
23460 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20  sult columns as 
23470 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  on the ORDER BY 
23480 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63  clause.  See tic
23490 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77  ket.** http://ww
234a0 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
234b0 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61  /info/6709574d2a
234c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
234d0 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e  sformation is on
234e0 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58  ly needed for EX
234f0 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c  CEPT, INTERSECT,
23500 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54   and UNION..** T
23510 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
23520 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65  rator works fine
23530 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63   with multiSelec
23540 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20  tOrderBy() even 
23550 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72  when.** there ar
23560 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20  e COLLATE terms 
23570 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  in the ORDER BY.
23580 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
23590 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
235a0 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57  lectToSubquery(W
235b0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
235c0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
235d0 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  t i;.  Select *p
235e0 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  New;.  Select *p
235f0 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  X;.  sqlite3 *db
23600 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
23610 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53  ist_item *a;.  S
23620 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b  rcList *pNewSrc;
23630 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23640 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b  ;.  Token dummy;
23650 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ..  if( p->pPrio
23660 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  r==0 ) return WR
23670 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66  C_Continue;.  if
23680 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
23690 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
236a0 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58  ntinue;.  for(pX
236b0 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f  =p; pX && (pX->o
236c0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d  p==TK_ALL || pX-
236d0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b  >op==TK_SELECT);
236e0 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
236f0 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20  }.  if( pX==0 ) 
23700 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23710 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f  nue;.  a = p->pO
23720 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72  rderBy->a;.  for
23730 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  (i=p->pOrderBy->
23740 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69  nExpr-1; i>=0; i
23750 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69  --){.    if( a[i
23760 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ].pExpr->flags &
23770 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72   EP_Collate ) br
23780 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eak;.  }.  if( i
23790 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  <0 ) return WRC_
237a0 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20  Continue;..  /* 
237b0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
237c0 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
237d0 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  ns the transform
237e0 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
237f0 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  d. */..  pParse 
23800 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
23810 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
23820 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
23830 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
23840 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
23850 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
23860 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ew==0 ) return W
23870 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73  RC_Abort;.  mems
23880 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69  et(&dummy, 0, si
23890 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20  zeof(dummy));.  
238a0 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65  pNewSrc = sqlite
238b0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
238c0 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c  omTerm(pParse,0,
238d0 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c  0,0,&dummy,pNew,
238e0 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  0,0);.  if( pNew
238f0 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
23900 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e  WRC_Abort;.  *pN
23910 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53  ew = *p;.  p->pS
23920 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20  rc = pNewSrc;.  
23930 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  p->pEList = sqli
23940 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
23950 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
23960 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
23970 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20  ASTERISK, 0));. 
23980 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45   p->op = TK_SELE
23990 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  CT;.  p->pWhere 
239a0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  = 0;.  pNew->pGr
239b0 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65  oupBy = 0;.  pNe
239c0 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  w->pHaving = 0;.
239d0 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
239e0 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f   = 0;.  p->pPrio
239f0 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78  r = 0;.  p->pNex
23a00 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74  t = 0;.  p->pWit
23a10 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46  h = 0;.  p->selF
23a20 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
23a30 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ound;.  assert( 
23a40 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
23a50 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20  F_Converted)==0 
23a60 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  );.  p->selFlags
23a70 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64   |= SF_Converted
23a80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
23a90 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20  ->pPrior!=0 );. 
23aa0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70   pNew->pPrior->p
23ab0 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
23ac0 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  New->pLimit = 0;
23ad0 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
23ae0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
23af0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
23b00 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
23b10 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63  ee if the FROM c
23b20 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d  lause term pFrom
23b30 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65   has table-value
23b40 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  d function.** ar
23b50 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20  guments.  If it 
23b60 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  does, leave an e
23b70 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
23b80 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
23b90 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73  n.** non-zero, s
23ba0 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f  ince pFrom is no
23bb0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  t allowed to be 
23bc0 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  a table-valued f
23bd0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
23be0 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46  ic int cannotBeF
23bf0 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
23c00 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
23c10 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
23c20 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
23c30 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
23c40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
23c50 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25  rMsg(pParse, "'%
23c60 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63  s' is not a func
23c70 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e  tion", pFrom->zN
23c80 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
23c90 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
23ca0 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
23cb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
23cc0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
23cd0 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
23ce0 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
23cf0 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
23d00 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
23d10 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
23d20 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
23d30 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
23d40 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
23d50 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
23d60 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
23d70 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
23d80 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
23d90 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
23da0 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
23db0 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
23dc0 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
23dd0 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
23de0 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
23df0 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
23e00 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
23e10 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
23e20 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
23e30 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
23e40 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
23e50 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
23e60 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
23e70 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
23e80 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
23e90 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23eb0 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f   Current innermo
23ec0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
23ed0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
23ee0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
23ef0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
23f00 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
23f10 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
23f20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
23f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
23f40 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
23f50 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
23f60 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
23f70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
23f80 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
23f90 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
23fa0 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
23fb0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
23fc0 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
23fd0 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
23fe0 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
23ff0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
24000 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
24010 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
24020 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
24030 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
24040 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
24050 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
24060 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
24070 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
24080 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
24090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
240a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
240b0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
240c0 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
240d0 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
240e0 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
240f0 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
24100 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
24110 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
24120 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
24130 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
24140 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
24150 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
24160 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
24170 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
24180 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
24190 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
241a0 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
241b0 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
241c0 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
241d0 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
241e0 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
241f0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
24200 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
24210 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
24220 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
24230 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
24240 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
24250 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
24260 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
24270 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
24280 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
24290 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
242a0 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
242b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
242c0 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
242d0 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
242e0 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
242f0 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
24300 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57  0 || (pParse->pW
24310 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ith==0 && pParse
24320 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30  ->pWithToFree==0
24330 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ) );.  if( pWith
24340 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24350 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70  pParse->pWith!=p
24360 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74  With );.    pWit
24370 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
24380 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
24390 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
243a0 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46  With;.    if( bF
243b0 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57  ree ) pParse->pW
243c0 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74  ithToFree = pWit
243d0 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h;.  }.}../*.** 
243e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  This function ch
243f0 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74  ecks if argument
24400 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f   pFrom refers to
24410 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20   a CTE declared 
24420 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c  by .** a WITH cl
24430 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63  ause on the stac
24440 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e  k currently main
24450 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61  tained by the pa
24460 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66  rser. And,.** if
24470 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
24480 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72  ssing a CTE expr
24490 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ession, if it is
244a0 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20   a recursive.** 
244b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
244c0 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a   current CTE..**
244d0 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c  .** If pFrom fal
244e0 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f  ls into either o
244f0 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f  f the two catego
24500 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f  ries above, pFro
24510 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f  m->pTab.** and o
24520 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
24530 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64  populated accord
24540 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ingly. The calle
24550 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a  r should check.*
24560 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  * (pFrom->pTab!=
24570 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  0) to determine 
24580 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
24590 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63   successful matc
245a0 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a  h.** was found..
245b0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
245c0 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20   not a match is 
245d0 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  found, SQLITE_OK
245e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
245f0 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
24600 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
24610 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65  does occur, an e
24620 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
24630 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a  stored in the.**
24640 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65   parser and some
24650 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
24660 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
24670 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
24680 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70  atic int withExp
24690 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70  and(.  Walker *p
246a0 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63  Walker, .  struc
246b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
246c0 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65  pFrom.){.  Parse
246d0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
246e0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71  er->pParse;.  sq
246f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
24700 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74  se->db;.  struct
24710 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20   Cte *pCte;     
24720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
24730 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c  ched CTE (or NUL
24740 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a  L if no match) *
24750 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b  /.  With *pWith;
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75      /* WITH clau
24780 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c  se that pCte bel
24790 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
247a0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
247b0 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20  b==0 );..  pCte 
247c0 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61  = searchWith(pPa
247d0 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f  rse->pWith, pFro
247e0 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66  m, &pWith);.  if
247f0 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61  ( pCte ){.    Ta
24800 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45  ble *pTab;.    E
24810 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
24820 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65  .    Select *pSe
24830 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  l;.    Select *p
24840 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
24850 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73       /* Left-mos
24860 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
24870 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d  nt */.    int bM
24880 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20  ayRecursive;    
24890 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
248a0 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e  if compound join
248b0 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c  ed by UNION [ALL
248c0 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70  ] */.    With *p
248d0 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20  SavedWith;      
248e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
248f0 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73  l value of pPars
24900 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20  e->pWith */..   
24910 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74   /* If pCte->zCt
24920 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  eErr is non-NULL
24930 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
24940 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
24950 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
24960 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
24970 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
24980 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
24990 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
249a0 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
249b0 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  . If pCte->zCteE
249c0 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rr is NULL, then
249d0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   this is not a r
249e0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
249f0 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ce..    ** In th
24a00 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64  is case, proceed
24a10 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  .  */.    if( pC
24a20 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20  te->zCteErr ){. 
24a30 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
24a40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74  rMsg(pParse, pCt
24a50 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65  e->zCteErr, pCte
24a60 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
24a70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24a80 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
24a90 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  f( cannotBeFunct
24aa0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
24ab0 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  m) ) return SQLI
24ac0 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61  TE_ERROR;..    a
24ad0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
24ae0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
24af0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
24b00 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
24b10 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
24b20 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
24b30 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
24b40 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
24b50 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20    pTab->nTabRef 
24b60 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  = 1;.    pTab->z
24b70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
24b80 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d  StrDup(db, pCte-
24b90 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
24ba0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
24bb0 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
24bc0 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
24bd0 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
24be0 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
24bf0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
24c00 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
24c10 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69  eral | TF_NoVisi
24c20 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46  bleRowid;.    pF
24c30 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
24c40 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
24c50 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
24c60 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  t, 0);.    if( d
24c70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24c80 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24c90 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
24ca0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
24cb0 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f  Select );..    /
24cc0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
24cd0 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43  is a recursive C
24ce0 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20  TE. */.    pSel 
24cf0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
24d00 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73  ;.    bMayRecurs
24d10 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70  ive = ( pSel->op
24d20 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c  ==TK_ALL || pSel
24d30 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
24d40 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
24d50 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
24d60 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
24d70 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
24d80 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
24d90 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
24da0 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
24db0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
24dc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24dd0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
24de0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
24df0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
24e00 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
24e10 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
24e20 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
24e30 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
24e40 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
24e50 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
24e60 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
24e70 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
24e80 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
24e90 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69       pItem->fg.i
24ea0 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a  sRecursive = 1;.
24eb0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
24ec0 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20  nTabRef++;.     
24ed0 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
24ee0 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73  ags |= SF_Recurs
24ef0 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ive;.        }. 
24f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
24f10 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65    /* Only one re
24f20 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
24f30 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
24f40 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62  */ .    if( pTab
24f50 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20  ->nTabRef>2 ){. 
24f60 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
24f70 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20  rMsg(.          
24f80 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c  pParse, "multipl
24f90 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
24fa0 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a  recursive table:
24fb0 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d   %s", pCte->zNam
24fc0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
24fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24fe0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
24ff0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54  assert( pTab->nT
25000 61 62 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53  abRef==1 || ((pS
25010 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  el->selFlags&SF_
25020 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54  Recursive) && pT
25030 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29  ab->nTabRef==2 )
25040 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43  );..    pCte->zC
25050 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61  teErr = "circula
25060 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22  r reference: %s"
25070 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68  ;.    pSavedWith
25080 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   = pParse->pWith
25090 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
250a0 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20  ith = pWith;.   
250b0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
250c0 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ve ){.      Sele
250d0 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65  ct *pPrior = pSe
250e0 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
250f0 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
25100 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20  >pWith==0 );.   
25110 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68     pPrior->pWith
25120 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a   = pSel->pWith;.
25130 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
25140 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
25150 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20   pPrior);.      
25160 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20  pPrior->pWith = 
25170 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
25180 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
25190 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
251a0 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
251b0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
251c0 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28  pWith;..    for(
251d0 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
251e0 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
251f0 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
25200 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
25210 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
25220 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
25230 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
25240 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
25250 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
25260 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
25270 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
25280 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
25290 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61  ble %s has %d va
252a0 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75  lues for %d colu
252b0 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mns",.          
252c0 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70    pCte->zName, p
252d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43  EList->nExpr, pC
252e0 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
252f0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
25300 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
25310 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
25320 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
25330 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
25340 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
25350 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
25360 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
25370 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
25380 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
25390 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
253a0 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
253b0 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
253c0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
253d0 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
253e0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
253f0 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
25400 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d  te->zCteErr = "m
25410 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76  ultiple recursiv
25420 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73  e references: %s
25430 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
25440 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
25450 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73 69  teErr = "recursi
25460 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ve reference in 
25470 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b  a subquery: %s";
25480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
25490 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
254a0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
254b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d  .    }.    pCte-
254c0 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  >zCteErr = 0;.  
254d0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
254e0 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
254f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
25500 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
25510 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25520 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49  OMIT_CTE./*.** I
25530 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73  f the SELECT pas
25540 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
25550 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  d argument has a
25560 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54  n associated WIT
25570 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f  H .** clause, po
25580 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  p it from the st
25590 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61  ack stored as pa
255a0 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20  rt of the Parse 
255b0 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
255c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
255d0 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65  sed as the xSele
255e0 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61  ctCallback2() ca
255f0 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c  llback by.** sql
25600 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
25610 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20  () when walking 
25620 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f  a SELECT tree to
25630 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a   resolve table.*
25640 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65  * names and othe
25650 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  r FROM clause el
25660 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74  ements. .*/.stat
25670 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f  ic void selectPo
25680 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  pWith(Walker *pW
25690 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
256a0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
256b0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
256c0 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72  arse;.  if( pPar
256d0 73 65 2d 3e 70 57 69 74 68 20 26 26 20 70 2d 3e  se->pWith && p->
256e0 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
256f0 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66   With *pWith = f
25700 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
25710 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20  >pWith;.    if( 
25720 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20  pWith!=0 ){.    
25730 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
25740 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29  ->pWith==pWith )
25750 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
25760 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70  pWith = pWith->p
25770 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Outer;.    }.  }
25780 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
25790 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30   selectPopWith 0
257a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
257b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
257c0 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
257d0 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
257e0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
257f0 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
25800 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
25810 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
25820 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
25830 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
25840 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
25850 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
25860 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
25870 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
25880 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
25890 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
258a0 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
258b0 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
258c0 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
258d0 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
258e0 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
258f0 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
25900 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
25910 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
25920 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
25930 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
25940 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
25950 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
25960 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
25970 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
25980 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
25990 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
259a0 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
259b0 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
259c0 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
259d0 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
259e0 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
259f0 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
25a00 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
25a10 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
25a20 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65  essing up the pe
25a30 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  rsistent represe
25a40 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
25a50 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
25a60 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
25a70 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
25a80 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
25a90 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e  ccommodate the N
25aa0 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
25ab0 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
25ac0 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
25ad0 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
25ae0 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
25af0 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
25b00 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
25b10 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
25b20 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
25b30 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
25b40 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
25b50 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
25b60 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
25b70 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
25b80 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
25b90 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
25ba0 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
25bb0 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
25bc0 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
25bd0 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
25be0 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
25bf0 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
25c00 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
25c10 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
25c20 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
25c30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25c40 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
25c50 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
25c60 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
25c70 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
25c80 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
25c90 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
25ca0 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
25cb0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
25cc0 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
25cd0 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70  , *pRight, *pExp
25ce0 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67  r;.  u16 selFlag
25cf0 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b  s = p->selFlags;
25d00 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ..  p->selFlags 
25d10 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
25d20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
25d30 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72  Failed  ){.    r
25d40 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25d50 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52  .  }.  if( NEVER
25d60 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20  (p->pSrc==0) || 
25d70 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  (selFlags & SF_E
25d80 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20  xpanded)!=0 ){. 
25d90 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
25da0 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  une;.  }.  pTabL
25db0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
25dc0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
25dd0 69 73 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57  ist;.  if( p->pW
25de0 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ith ){.    sqlit
25df0 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
25e00 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b  e, p->pWith, 0);
25e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
25e20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
25e30 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
25e40 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
25e50 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
25e60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
25e70 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
25e80 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
25e90 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
25ea0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
25eb0 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
25ec0 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
25ed0 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
25ee0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
25ef0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
25f00 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
25f10 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
25f20 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
25f30 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
25f40 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
25f50 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
25f60 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
25f70 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
25f80 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
25f90 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
25fa0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
25fb0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
25fc0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
25fd0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
25fe0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
25ff0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e  sert( pFrom->fg.
26000 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c  isRecursive==0 |
26010 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  | pFrom->pTab!=0
26020 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
26030 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  m->fg.isRecursiv
26040 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
26050 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
26060 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e  >pTab==0 );.#ifn
26070 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26080 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68  CTE.    if( with
26090 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20  Expand(pWalker, 
260a0 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
260b0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69  WRC_Abort;.    i
260c0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  f( pFrom->pTab )
260d0 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a   {} else.#endif.
260e0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
260f0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
26100 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
26110 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
26120 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
26130 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
26140 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
26150 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
26160 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
26170 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
26180 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
26190 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
261a0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
261b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61     if( sqlite3Wa
261c0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
261d0 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e  , pSel) ) return
261e0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
261f0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
26200 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
26210 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
26220 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
26230 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
26240 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
26250 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
26260 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
26270 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
26280 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
26290 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f  (db, "sqlite_sq_
262a0 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  %p", (void*)pTab
262b0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
262c0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
262d0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
262e0 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  ior; }.      sql
262f0 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
26300 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
26310 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
26320 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
26330 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
26340 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
26350 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
26360 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
26370 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
26380 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
26390 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
263a0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
263b0 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
263c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
263d0 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
263e0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
263f0 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
26400 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
26410 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
26420 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
26430 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
26440 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
26450 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
26460 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
26470 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
26480 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
26490 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
264a0 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78  Tab->nTabRef>=0x
264b0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
264c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
264d0 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
264e0 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
264f0 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
26500 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
26510 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
26520 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
26530 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
26540 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
26560 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
26570 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74       if( !IsVirt
26580 75 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e  ual(pTab) && can
26590 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
265a0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
265b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
265c0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
265d0 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  }.#if !defined(S
265e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
265f0 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
26600 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
26610 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
26620 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
26630 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  ) || pTab->pSele
26640 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31  ct ){.        i1
26650 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  6 nCol;.        
26660 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
26670 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
26680 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
26690 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
266a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
266b0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
266c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
266d0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
266e0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
266f0 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
26700 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
26710 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
26720 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  me(pFrom->pSelec
26730 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
26740 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
26750 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  pTab->nCol;.    
26760 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
26770 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   -1;.        sql
26780 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
26790 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
267a0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
267b0 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43   pTab->nCol = nC
267c0 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ol;.      }.#end
267d0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
267e0 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
267f0 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
26800 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
26810 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
26820 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
26830 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
26840 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
26850 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
26860 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
26870 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
26880 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
26890 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
268a0 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
268b0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
268c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
268d0 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
268e0 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
268f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
26900 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
26910 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
26920 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
26930 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
26940 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
26950 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
26960 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
26970 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
26980 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
26990 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
269a0 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
269b0 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
269c0 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
269d0 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
269e0 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
269f0 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70  e TK_ASTERISK op
26a00 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
26a10 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
26a20 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  d in the column.
26a30 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20    ** list.  The 
26a40 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
26a50 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
26a60 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  e the TK_ASTERIS
26a70 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  K.  ** expressio
26a80 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61  ns and expand ea
26a90 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
26aa0 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
26ab0 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61  s in.  ** all ta
26ac0 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
26ad0 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
26ae0 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
26af0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
26b00 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
26b10 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
26b20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
26b30 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
26b40 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
26b50 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
26b60 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
26b70 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
26b80 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
26b90 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
26ba0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
26bb0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
26bc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
26bd0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
26be0 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
26bf0 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
26c00 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
26c10 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
26c20 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
26c30 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
26c40 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
26c50 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
26c60 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
26c70 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
26c80 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
26c90 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
26ca0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
26cb0 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
26cc0 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
26cd0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
26ce0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
26cf0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
26d00 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
26d10 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
26d20 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
26d30 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
26d40 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
26d50 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
26d60 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
26d70 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
26d80 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
26d90 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
26da0 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
26db0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
26dc0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
26dd0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
26de0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
26df0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
26e00 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
26e10 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
26e20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
26e30 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
26e40 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
26e50 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52   pRight = pE->pR
26e60 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
26e70 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
26e80 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20  OT || pRight!=0 
26e90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
26ea0 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
26eb0 0a 20 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e  .       && (pE->
26ec0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
26ed0 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54  ight->op!=TK_AST
26ee0 45 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a  ERISK).      ){.
26ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
26f00 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65  particular expre
26f10 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ssion does not n
26f20 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
26f30 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
26f40 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
26f50 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
26f60 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
26f70 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20  , a[k].pExpr);. 
26f80 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
26f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
26fa0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
26fb0 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
26fc0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
26fd0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
26fe0 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d  nExpr-1].zSpan =
26ff0 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20   a[k].zSpan;.   
27000 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d         a[k].zNam
27010 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
27020 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b   a[k].zSpan = 0;
27030 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27040 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
27050 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
27060 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
27070 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
27080 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
27090 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
270a0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
270b0 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
270c0 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
270d0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
270e0 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
270f0 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
27100 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
27110 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
27120 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
27130 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
27140 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
27150 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DOT ){.         
27160 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65   assert( pE->pLe
27170 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ft!=0 );.       
27180 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
27190 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e  HasProperty(pE->
271a0 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c  pLeft, EP_IntVal
271b0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
271c0 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c   zTName = pE->pL
271d0 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  eft->u.zToken;. 
271e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
271f0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
27200 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
27210 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
27220 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
27230 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
27240 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
27250 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  b;.          Sel
27260 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f  ect *pSub = pFro
27270 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
27280 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
27290 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
272a0 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
272b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68  const char *zSch
272c0 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  emaName = 0;.   
272d0 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
272e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
272f0 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  abName==0 ){.   
27300 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
27310 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
27320 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27330 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
27340 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
27350 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eak;.          i
27360 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70  f( pSub==0 || (p
27370 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
27380 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d  SF_NestedFrom)==
27390 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
273a0 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20   pSub = 0;.     
273b0 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
273c0 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
273d0 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
273e0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
273f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
27400 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
27410 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44  }.            iD
27420 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
27430 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
27440 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
27450 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
27460 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20  Name = iDb>=0 ? 
27470 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
27480 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  SName : "*";.   
27490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
274a0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
274b0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
274c0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
274d0 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
274e0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
274f0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
27500 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
27510 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
27520 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
27530 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
27540 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
27550 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
27560 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
27570 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
27580 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
27590 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
275a0 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
275b0 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
275c0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
275d0 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
275e0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
275f0 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
27600 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
27610 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
27620 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
27630 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
27640 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
27650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27660 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
27670 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
27680 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
27690 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
276a0 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69  as 'hidden', omi
276b0 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78  t it from the ex
276c0 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
276d0 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
276e0 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65   list unless the
276f0 20 53 45 4c 45 43 54 20 68 61 73 20 74 68 65 20   SELECT has the 
27700 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
27710 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
27720 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20  bit set..       
27730 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27740 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46      if( (p->selF
27750 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64  lags & SF_Includ
27760 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20  eHidden)==0.    
27770 20 20 20 20 20 20 20 20 20 26 26 20 49 73 48 69           && IsHi
27780 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
27790 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20  ->aCol[j]) .    
277a0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
277b0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
277c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
277d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62  .            tab
277e0 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20  leSeen = 1;..   
277f0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
27800 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
27810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27820 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f  f( (pFrom->fg.jo
27830 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
27840 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
27850 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
27860 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
27870 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
27880 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
27890 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
278a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
278b0 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
278c0 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
278d0 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278f0 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
27900 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
27910 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
27920 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
27950 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
27960 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
27970 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27990 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
279a0 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
279b0 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
279c0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
279d0 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
279e0 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
279f0 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
27a00 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
27a10 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
27a30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27a40 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
27a50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
27a60 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
27a70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
27a80 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
27a90 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
27aa0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
27ab0 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
27ac0 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
27ad0 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
27ae0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
27af0 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
27b00 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
27b10 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
27b20 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
27b30 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
27b40 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
27b50 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
27b60 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
27b80 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b  ( zSchemaName ){
27b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27ba0 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
27bb0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
27bc0 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20  zSchemaName);.  
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
27be0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
27bf0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
27c00 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29  T, pLeft, pExpr)
27c10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27c20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
27c30 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
27c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27c50 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
27c60 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
27c70 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
27c80 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
27c90 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
27ca0 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27cc0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
27ce0 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
27cf0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27d00 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
27d10 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
27d20 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
27d30 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
27d40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
27d50 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61  okenInit(&sColna
27d60 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
27d70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27d80 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
27d90 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
27da0 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
27db0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
27dc0 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  New && (p->selFl
27dd0 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
27de0 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
27df0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
27e00 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
27e10 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65  X = &pNew->a[pNe
27e20 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  w->nExpr-1];.   
27e30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
27e40 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
27e50 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
27e60 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
27e70 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  up(db, pSub->pEL
27e80 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29  ist->a[j].zSpan)
27e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27ea0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
27eb0 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
27ec0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27ee0 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
27ef0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
27f00 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20  "%s.%s.%s",.    
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
27f40 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43  me, zTabName, zC
27f50 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
27f60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
27f70 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
27f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27f90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
27fa0 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20   pX->bSpanIsTab 
27fb0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
27fc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
27fd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
27fe0 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
27ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28000 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
28010 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
28020 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
28030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
28040 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28050 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
28060 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
28070 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
28080 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28090 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
280a0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
280b0 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
280c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
280d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
280e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
280f0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
28100 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
28110 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
28120 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
28130 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
28140 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
28150 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
28160 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
28170 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
28180 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
28190 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
281a0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
281b0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
281c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  );.    return WR
281d0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e  C_Abort;.  }.#en
281e0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
281f0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
28200 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
28210 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
28220 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
28230 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
28240 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
28250 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
28260 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
28270 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
28280 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
28290 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
282a0 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
282b0 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
282c0 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
282d0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
282e0 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
282f0 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
28300 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
28310 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
28320 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
28330 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
28340 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
28350 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
28360 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
28370 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
28380 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
28390 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
283a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
283b0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
283c0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
283d0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
283e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
283f0 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
28400 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
28410 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
28420 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
28430 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
28440 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
28450 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
28460 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
28470 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
28480 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
28490 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
284a0 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
284b0 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
284c0 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
284d0 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
284e0 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
284f0 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
28500 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
28510 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
28520 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
28530 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
28540 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
28550 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
28560 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
28570 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
28580 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
28590 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
285a0 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
285b0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
285c0 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
285d0 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
285e0 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
285f0 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
28600 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
28610 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
28620 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
28630 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
28640 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
28650 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
28660 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
28670 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
28680 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
28690 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
286a0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
286b0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
286c0 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
286d0 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
286e0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
286f0 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
28700 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
28710 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
28720 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
28730 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
28740 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
28750 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
28760 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
28770 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50  lback2 = selectP
28780 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65  opWith;.  sqlite
28790 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
287a0 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
287b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
287c0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
287d0 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
287e0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
287f0 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
28800 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
28810 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
28820 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
28830 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
28840 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
28850 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
28860 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
28870 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
28880 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
28890 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
288a0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
288b0 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
288c0 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
288d0 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
288e0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
288f0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
28900 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
28910 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
28920 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
28930 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
28940 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
28950 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
28960 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
28970 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
28980 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
28990 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
289a0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
289b0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
289c0 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
289d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
289e0 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
289f0 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
28a00 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
28a10 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
28a20 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
28a30 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
28a40 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
28a50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28a60 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
28a70 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
28a80 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
28a90 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
28aa0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
28ab0 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20  ypeInfo)==0 );. 
28ac0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
28ad0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
28ae0 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
28af0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54  er->pParse;.  pT
28b00 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
28b10 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  ;.  for(i=0, pFr
28b20 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
28b30 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
28b40 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
28b50 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
28b60 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
28b70 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
28b80 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
28b90 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
28ba0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
28bb0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
28bc0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
28bd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
28be0 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
28bf0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
28c00 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
28c10 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20  .      if( pSel 
28c20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
28c30 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
28c40 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
28c50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 71  rior;.        sq
28c60 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
28c70 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
28c80 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
28c90 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  b, pSel);.      
28ca0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  }.    }.  }.}.#e
28cb0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
28cc0 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64  s routine adds d
28cd0 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  atatype and coll
28ce0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
28cf0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a  nformation to.**
28d00 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
28d10 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f  tures of all FRO
28d20 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
28d30 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45  ies in a.** SELE
28d40 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
28d50 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75  .** Use this rou
28d60 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20  tine after name 
28d70 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
28d80 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
28d90 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
28da0 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
28db0 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
28dc0 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct){.#ifndef SQL
28dd0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
28de0 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  Y.  Walker w;.  
28df0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
28e00 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53  zeof(w));.  w.xS
28e10 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
28e20 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
28e30 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
28e40 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
28e50 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
28e60 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
28e70 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
28e80 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
28e90 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
28ea0 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
28eb0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
28ec0 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
28ed0 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
28ee0 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
28ef0 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
28f00 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
28f10 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
28f20 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
28f30 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
28f40 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
28f50 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
28f60 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
28f70 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
28f80 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
28f90 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
28fa0 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
28fb0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
28fc0 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
28fd0 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
28fe0 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
28ff0 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
29000 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
29010 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
29020 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
29030 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
29040 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
29050 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
29060 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29070 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
29080 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
29090 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
290a0 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
290b0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
290c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
290d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
290e0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
290f0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
29100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29110 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
29120 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
29130 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
29140 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
29150 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
29160 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
29170 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
29180 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
29190 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
291a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
291b0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
291c0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
291d0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
291e0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
291f0 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
29200 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
29210 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
29220 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
29230 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
29240 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
29250 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
29260 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
29270 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
29280 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
29290 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
292a0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
292b0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
292c0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
292d0 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
292e0 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
292f0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
29300 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
29310 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
29320 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
29330 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
29340 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
29350 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
29360 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
29370 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
29380 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
29390 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
293a0 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
293b0 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
293c0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
293d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
293e0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
293f0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
29400 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
29410 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
29420 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
29430 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
29440 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
29450 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
29460 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
29470 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
29480 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
29490 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
294a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
294b0 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
294c0 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
294d0 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
294e0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
294f0 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
29500 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
29510 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
29520 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
29530 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
29540 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
29550 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
29560 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
29570 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
29580 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
29590 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
295a0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
295b0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
295c0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
295d0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
295e0 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
295f0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
29600 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
29610 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
29620 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
29630 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
29640 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
29650 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
29660 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
29670 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
29680 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
29690 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
296a0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
296b0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
296c0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
296d0 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
296e0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
296f0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
29700 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
29710 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
29720 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
29730 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
29740 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
29750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
29760 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29770 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
29780 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
29790 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
297a0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
297b0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
297c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
297d0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
297e0 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
297f0 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
29800 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
29810 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
29820 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
29830 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
29840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29850 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
29860 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
29870 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
29880 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20  e, pE->x.pList, 
29890 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
298a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
298b0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
298c0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
298d0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298f0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
29900 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
29910 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
29920 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
29930 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
29940 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
29950 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
29960 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
29970 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
29980 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
29990 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
299a0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
299b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
299c0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
299d0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
299e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
299f0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
29a00 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
29a10 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
29a20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
29a30 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
29a40 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
29a50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
29a60 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
29a70 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
29a80 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
29a90 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
29aa0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
29ab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
29ac0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
29ad0 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
29ae0 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
29af0 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
29b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
29b10 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
29b20 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
29b30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
29b40 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
29b50 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
29b60 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
29b70 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
29b80 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
29b90 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
29ba0 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
29bb0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
29bc0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
29bd0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
29be0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
29bf0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
29c00 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
29c10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
29c20 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
29c30 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
29c40 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
29c50 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
29c60 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
29c70 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
29c80 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
29c90 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
29ca0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
29cb0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
29cc0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
29cd0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
29ce0 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
29cf0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
29d00 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
29d10 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
29d20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
29d30 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
29d40 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
29d50 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
29d60 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
29d70 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
29d80 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
29d90 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
29da0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
29db0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
29dc0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
29dd0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
29de0 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45  egAgg, 0, SQLITE
29df0 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
29e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
29e10 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
29e20 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
29e30 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
29e40 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
29e50 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
29e60 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29e70 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
29e80 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20  ase( nArg==0 ); 
29e90 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74   /* Error condit
29ea0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ion */.      tes
29eb0 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b  tcase( nArg>1 );
29ec0 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72     /* Also an er
29ed0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64  ror */.      cod
29ee0 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
29ef0 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
29f00 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
29f10 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
29f20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
29f30 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
29f40 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
29f50 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
29f60 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
29f70 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
29f80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
29f90 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
29fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
29fb0 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
29fc0 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
29fd0 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
29fe0 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
29ff0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
2a000 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
2a010 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
2a020 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
2a030 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2a040 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
2a050 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2a060 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
2a070 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
2a080 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2a090 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2a0a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a0b0 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
2a0c0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2a0d0 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20  ator ) regHit = 
2a0e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2a0f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a100 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
2a110 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30  llSeq, regHit, 0
2a120 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
2a130 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
2a140 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a150 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2a160 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20  OP_AggStep0, 0, 
2a170 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
2a180 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2a190 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
2a1a0 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
2a1b0 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
2a1c0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2a1d0 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
2a1e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2a1f0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
2a200 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
2a210 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
2a220 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2a230 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
2a240 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
2a250 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
2a260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2a270 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2a280 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73  drNext);.      s
2a290 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2a2a0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2a2b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65    }.  }..  /* Be
2a2c0 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  fore populating 
2a2d0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2a2e0 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72  registers, clear
2a2f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2a300 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  e..  ** Otherwis
2a310 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  e, if any of the
2a320 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e   required column
2a330 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65   values are alre
2a340 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a  ady present .  *
2a350 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20  * in registers, 
2a360 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
2a370 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f  ) may use OP_SCo
2a380 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76  py to copy the v
2a390 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d  alue.  ** to pC-
2a3a0 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68  >iMem. But by th
2a3b0 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65  e time the value
2a3c0 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72   is used, the or
2a3d0 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a  iginal register.
2a3e0 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65    ** may have be
2a3f0 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64  en used, invalid
2a400 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c  ating the underl
2a410 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64  ying buffer hold
2a420 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78  ing the.  ** tex
2a430 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e  t or blob value.
2a440 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33   See ticket [883
2a450 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20  034dcb5]..  **. 
2a460 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75   ** Another solu
2a470 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f  tion would be to
2a480 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53   change the OP_S
2a490 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70  Copy used to cop
2a4a0 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61  y cached.  ** va
2a4b0 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f  lues to an OP_Co
2a4c0 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  py..  */.  if( r
2a4d0 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64  egHit ){.    add
2a4e0 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74  rHitTest = sqlit
2a4f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2a500 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20  OP_If, regHit); 
2a510 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2a520 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
2a530 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2a540 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rse);.  for(i=0,
2a550 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
2a560 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
2a570 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
2a580 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
2a590 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
2a5a0 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
2a5b0 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
2a5c0 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
2a5d0 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71  ctMode = 0;.  sq
2a5e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2a5f0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ear(pParse);.  i
2a600 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29  f( addrHitTest )
2a610 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2a620 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2a630 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d  rHitTest);.  }.}
2a640 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
2a650 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20  ngle OP_Explain 
2a660 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
2a670 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61  he VDBE to expla
2a680 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63  in a simple.** c
2a690 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22  ount(*) query ("
2a6a0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2a6b0 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a  FROM pTab")..*/.
2a6c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a6d0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74  MIT_EXPLAIN.stat
2a6e0 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53  ic void explainS
2a6f0 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61  impleCount(.  Pa
2a700 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a720 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
2a730 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
2a760 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
2a770 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a790 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f  /* Index used to
2a7a0 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20   optimize scan, 
2a7b0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  or NULL */.){.  
2a7c0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
2a7d0 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  ain==2 ){.    in
2a7e0 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78  t bCover = (pIdx
2a7f0 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64  !=0 && (HasRowid
2a800 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69  (pTab) || !IsPri
2a810 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
2a820 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  x)));.    char *
2a830 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50  zEqp = sqlite3MP
2a840 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
2a850 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73  , "SCAN TABLE %s
2a860 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  %s%s",.        p
2a870 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
2a880 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55      bCover ? " U
2a890 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
2a8a0 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20  DEX " : "",.    
2a8b0 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64      bCover ? pId
2a8c0 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20  x->zName : "".  
2a8d0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
2a8e0 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
2a8f0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62      pParse->pVdb
2a900 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  e, OP_Explain, p
2a910 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2a920 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34  , 0, 0, zEqp, P4
2a930 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a  _DYNAMIC.    );.
2a940 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
2a950 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70  fine explainSimp
2a960 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23  leCount(a,b,c).#
2a970 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
2a980 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
2a990 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2a9a0 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ent given in the
2a9b0 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a   p argument.  .*
2a9c0 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
2a9d0 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63   are returned ac
2a9e0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53  cording to the S
2a9f0 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
2aa00 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ure..** See comm
2aa10 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e  ents in sqliteIn
2aa20 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20  t.h for further 
2aa30 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
2aa40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2aa50 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
2aa60 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
2aa70 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
2aa80 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
2aa90 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
2aaa0 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
2aab0 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
2aac0 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2aad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2aae0 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
2aaf0 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
2ab00 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
2ab10 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
2ab20 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
2ab30 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
2ab40 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
2ab50 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
2ab60 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2ab70 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2ab80 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
2ab90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2aba0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
2abb0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
2abc0 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
2abd0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
2abe0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
2abf0 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
2ac00 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
2ac10 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
2ac20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2ac30 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
2ac40 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2ac50 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
2ac60 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2ac70 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
2ac80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ac90 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
2aca0 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
2acb0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
2acc0 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
2acd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2ace0 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
2acf0 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
2ad00 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
2ad10 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69  List = 0;  /* Li
2ad20 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
2ad30 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
2ad40 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2ad50 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
2ad60 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
2ad70 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
2ad80 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
2ad90 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2ada0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
2adb0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
2adc0 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
2add0 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
2ade0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2adf0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
2ae00 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
2ae10 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
2ae20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
2ae30 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63  NULL */.  int rc
2ae40 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2ae50 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
2ae60 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
2ae70 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74  nction */.  Dist
2ae80 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63  inctCtx sDistinc
2ae90 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f  t; /* Info on ho
2aea0 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49  w to code the DI
2aeb0 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a  STINCT keyword *
2aec0 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72  /.  SortCtx sSor
2aed0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t;         /* In
2aee0 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
2aef0 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
2af00 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e  lause */.  AggIn
2af10 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
2af20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
2af30 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
2af40 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
2af50 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
2af60 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
2af70 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
2af80 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
2af90 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2afa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
2afb0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2afc0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2afd0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2afe0 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53  .  int iRestoreS
2aff0 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
2b000 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70  ->iSelectId;.  p
2b010 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2b020 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74   = pParse->iNext
2b030 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64  SelectId++;.#end
2b040 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  if..  db = pPars
2b050 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  e->db;.  if( p==
2b060 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
2b070 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
2b080 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
2b090 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2b0a0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
2b0b0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
2b0c0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
2b0d0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2b0e0 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
2b0f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
2b100 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45  Info));.#if SELE
2b110 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2b120 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2b130 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c  tIndent++;.  SEL
2b140 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
2b150 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f  e,p, ("begin pro
2b160 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  cessing:\n"));. 
2b170 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2b180 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2b190 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
2b1a0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2b1b0 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2b1c0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
2b1d0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2b1e0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2b1f0 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61  _DistFifo );.  a
2b200 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2b210 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2b220 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20  eDest!=SRT_Fifo 
2b230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2b240 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2b250 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2b260 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20  _DistQueue );.  
2b270 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2b280 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2b290 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75  >eDest!=SRT_Queu
2b2a0 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  e );.  if( Ignor
2b2b0 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2b2c0 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
2b2d0 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
2b2e0 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
2b2f0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
2b300 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
2b310 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2b320 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
2b330 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2b340 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20  T_Discard ||.   
2b350 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2b360 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20  Dest==SRT_Queue 
2b370 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2b380 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c  ==SRT_DistFifo |
2b390 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2b3a0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2b3b0 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73  istQueue || pDes
2b3c0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69  t->eDest==SRT_Fi
2b3d0 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f  fo);.    /* If O
2b3e0 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f  RDER BY makes no
2b3f0 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
2b400 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e  he output then n
2b410 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20  either does.    
2b420 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69  ** DISTINCT so i
2b430 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
2b440 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c   too. */.    sql
2b450 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2b460 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
2b470 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  By);.    p->pOrd
2b480 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
2b490 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2b4a0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
2b4b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
2b4c0 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
2b4d0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72  ;.  memset(&sSor
2b4e0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f  t, 0, sizeof(sSo
2b4f0 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f  rt));.  sSort.pO
2b500 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2b510 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
2b520 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
2b530 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2b540 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2b550 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
2b560 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
2b570 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
2b580 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67  st!=0 );.  isAgg
2b590 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
2b5a0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
2b5b0 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  =0;.#if SELECTTR
2b5c0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2b5d0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2b5e0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2b5f0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2b600 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20  0x100,pParse,p, 
2b610 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
2b620 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
2b630 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2b640 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2b650 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2b660 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c 61 74 74   /* Try to flatt
2b670 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  en subqueries in
2b680 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2b690 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   up into the mai
2b6a0 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66  n query.  */.#if
2b6b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2b6c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
2b6d0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
2b6e0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
2b6f0 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
2b700 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
2b710 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
2b720 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2b730 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2b740 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
2b750 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
2b760 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
2b770 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67  ct;.    int isAg
2b780 67 53 75 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  gSub;.    Table 
2b790 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
2b7a0 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 53 75  Tab;.    if( pSu
2b7b0 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2b7c0 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d  ..    /* Catch m
2b7d0 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64  ismatch in the d
2b7e0 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20  eclared columns 
2b7f0 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  of a view and th
2b800 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
2b810 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ** columns in th
2b820 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20  e SELECT on the 
2b830 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  RHS */.    if( p
2b840 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d  Tab->nCol!=pSub-
2b850 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
2b860 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2b870 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2b880 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c  "expected %d col
2b890 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75  umns for '%s' bu
2b8a0 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20  t got %d",.     
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8c0 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
2b8d0 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e  b->zName, pSub->
2b8e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2b8f0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
2b900 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
2b910 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53    isAggSub = (pS
2b920 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
2b930 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
2b940 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
2b950 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
2b960 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73   p, i, isAgg, is
2b970 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20  AggSub) ){.     
2b980 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
2b990 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
2b9a0 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
2b9b0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
2b9c0 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20  isAggSub ){.    
2b9d0 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20      isAgg = 1;. 
2b9e0 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61         p->selFla
2b9f0 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
2ba00 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
2ba10 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    i = -1;.    }.
2ba20 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
2ba30 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
2ba40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2ba50 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2ba60 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  nd;.    if( !Ign
2ba70 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2ba80 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53  est) ){.      sS
2ba90 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
2baa0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
2bab0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2bac0 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
2bad0 20 74 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   the VDBE under 
2bae0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c  construction, al
2baf0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 56  locating a new V
2bb00 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  DBE if one.  ** 
2bb10 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
2bb20 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20   exist */.  v = 
2bb30 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
2bb40 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
2bb50 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2bb60 5f 65 6e 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53  _end;..#ifndef S
2bb70 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
2bb80 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
2bb90 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20  Handle compound 
2bba0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2bbb0 73 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61  s using the sepa
2bbc0 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74  rate multiSelect
2bbd0 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72  ().  ** procedur
2bbe0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
2bbf0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
2bc00 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  c = multiSelect(
2bc10 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
2bc20 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65  );.    explainSe
2bc30 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
2bc40 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
2bc50 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 23  toreSelectId);.#
2bc60 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2bc70 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43  NABLED.    SELEC
2bc80 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
2bc90 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64  p,("end compound
2bca0 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69  -select processi
2bcb0 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50 61  ng\n"));.    pPa
2bcc0 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
2bcd0 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt--;.#endif.   
2bce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2bcf0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
2bd00 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
2bd10 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
2bd20 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2bd30 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  e.  */.#if !defi
2bd40 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2bd50 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
2bd60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2bd70 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d  T_VIEW).  for(i=
2bd80 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
2bd90 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
2bda0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2bdb0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
2bdc0 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20  bList->a[i];.   
2bdd0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
2bde0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
2bdf0 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
2be00 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75  ect;.    if( pSu
2be10 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2be20 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d  ..    /* Sometim
2be30 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
2be40 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20  a subquery will 
2be50 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72  be generated mor
2be60 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e  e than.    ** on
2be70 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75  ce, if the subqu
2be80 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74  ery is part of t
2be90 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2bea0 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a  in a LEFT JOIN,.
2beb0 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70      ** for examp
2bec0 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
2bed0 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65  e, do not regene
2bee0 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
2bef0 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a   manifest.    **
2bf00 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63   a view or the c
2bf10 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70  o-routine to imp
2bf20 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20  lement a view.  
2bf30 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  The first instan
2bf40 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66  ce.    ** is suf
2bf50 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20  ficient, though 
2bf60 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
2bf70 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76  o manifest the v
2bf80 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20  iew does need.  
2bf90 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b    ** to be invok
2bfa0 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20  ed again. */.   
2bfb0 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72   if( pItem->addr
2bfc0 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20  FillSub ){.     
2bfd0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76   if( pItem->fg.v
2bfe0 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29  iaCoroutine==0 )
2bff0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2c000 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2c010 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e  P_Gosub, pItem->
2c020 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  regReturn, pItem
2c030 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a  ->addrFillSub);.
2c040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
2c050 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
2c060 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
2c070 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79  Parse.nHeight by
2c080 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
2c090 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65  he largest expre
2c0a0 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65  ssion.    ** tre
2c0b0 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  e referred to by
2c0c0 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
2c0d0 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
2c0e0 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
2c0f0 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
2c100 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
2c110 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
2c120 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
2c130 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
2c140 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
2c150 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
2c160 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
2c170 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
2c180 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
2c190 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
2c1a0 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
2c1b0 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
2c1c0 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
2c1d0 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
2c1e0 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
2c1f0 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  t(p);..    /* Ma
2c200 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e  ke copies of con
2c210 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75  stant WHERE-clau
2c220 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  se terms in the 
2c230 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e  outer query down
2c240 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74  .    ** inside t
2c250 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
2c260 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20  is can help the 
2c270 73 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20  subquery to run 
2c280 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
2c290 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2c2a0 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pItem->fg.join
2c2b0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
2c2c0 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 75 73 68  ==0.     && push
2c2d0 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
2c2e0 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e  Parse, pSub, p->
2c2f0 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69  pWhere, pItem->i
2c300 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23  Cursor).    ){.#
2c310 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2c320 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28  NABLED.      if(
2c330 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2c340 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2c350 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41         SELECTTRA
2c360 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2c370 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d  p,("After WHERE-
2c380 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e  clause push-down
2c390 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  :\n"));.        
2c3a0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2c3b0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2c3c0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2c3d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
2c3e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
2c3f0 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71  plement the subq
2c400 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20  uery.    **.    
2c410 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
2c420 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
2c430 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  s a co-routine i
2c440 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
2c450 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 20  re true:.    ** 
2c460 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
2c470 65 72 79 20 69 73 20 67 75 61 72 61 6e 74 65 65  ery is guarantee
2c480 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65  d to be the oute
2c490 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20  r loop (so that 
2c4a0 69 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  it.    **       
2c4b0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2c4c0 6f 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6d 6f  o be computed mo
2c4d0 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20  re than once).  
2c4e0 20 20 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20    **   (2)  The 
2c4f0 41 4c 4c 20 6b 65 79 77 6f 72 64 20 61 66 74 65  ALL keyword afte
2c500 72 20 53 45 4c 45 43 54 20 69 73 20 6f 6d 69 74  r SELECT is omit
2c510 74 65 64 2e 20 20 28 41 70 70 6c 69 63 61 74 69  ted.  (Applicati
2c520 6f 6e 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 20  ons are.    **  
2c530 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f        allowed to
2c540 20 73 61 79 20 22 53 45 4c 45 43 54 20 41 4c 4c   say "SELECT ALL
2c550 22 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73  " instead of jus
2c560 74 20 22 53 45 4c 45 43 54 22 20 74 6f 20 64 69  t "SELECT" to di
2c570 73 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20  sable.    **    
2c580 20 20 20 20 74 68 65 20 75 73 65 20 6f 66 20 63      the use of c
2c590 6f 2d 72 6f 75 74 69 6e 65 73 2e 29 0a 20 20 20  o-routines.).   
2c5a0 20 2a 2a 20 20 20 28 33 29 20 20 43 6f 2d 72 6f   **   (3)  Co-ro
2c5b0 75 74 69 6e 65 73 20 61 72 65 20 6e 6f 74 20 64  utines are not d
2c5c0 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 73 71  isabled using sq
2c5d0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2c5e0 6f 6c 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  ol().    **     
2c5f0 20 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54     with SQLITE_T
2c600 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
2c610 54 49 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20 20  TIONS..    **.  
2c620 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74    ** TODO: Are t
2c630 68 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f  here other reaso
2c640 6e 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f  ns beside (1) to
2c650 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e   use a co-routin
2c660 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65  e.    ** impleme
2c670 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a  ntation?.    */.
2c680 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20      if( i==0.   
2c690 20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e    && (pTabList->
2c6a0 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
2c6b0 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
2c6c0 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
2c6d0 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
2c6e0 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28  ROSS))!=0)  /* (
2c6f0 31 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 28 70  1) */.     && (p
2c700 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c710 41 6c 6c 29 3d 3d 30 20 20 20 20 20 20 20 20 20  All)==0         
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
2c740 20 2a 2f 0a 20 20 20 20 20 26 26 20 4f 70 74 69   */.     && Opti
2c750 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2c760 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43  db, SQLITE_SubqC
2c770 6f 72 6f 75 74 69 6e 65 29 20 20 20 20 20 20 20  oroutine)       
2c780 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a          /* (3) *
2c790 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  /.    ){.      /
2c7a0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f  * Implement a co
2c7b0 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  -routine that wi
2c7c0 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  ll return a sing
2c7d0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
2c7e0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
2c7f0 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  t on each invoca
2c800 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
2c810 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2c820 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2c830 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a  rrentAddr(v)+1;.
2c840 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
2c850 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
2c860 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2c870 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2c880 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
2c890 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2c8a0 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54  Return, 0, addrT
2c8b0 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
2c8c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
2c8d0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2c8e0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ame));.      pIt
2c8f0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2c900 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  = addrTop;.     
2c910 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2c920 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
2c930 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
2c940 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2c950 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2c960 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2c970 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2c980 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2c990 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
2c9a0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
2c9b0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
2c9c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
2c9d0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2c9e0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2c9f0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
2ca00 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
2ca10 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   1;.      pItem-
2ca20 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73  >regResult = des
2ca30 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73  t.iSdst;.      s
2ca40 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
2ca50 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d  outine(v, pItem-
2ca60 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2ca70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2ca80 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
2ca90 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p-1);.      sqli
2caa0 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
2cab0 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
2cac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2cad0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
2cae0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2caf0 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65  l fill an epheme
2cb00 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20  ral table with. 
2cb10 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74       ** the cont
2cb20 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71  ent of this subq
2cb30 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64  uery.  pItem->ad
2cb40 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70  drFillSub will p
2cb50 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f  oint.      ** to
2cb60 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2cb70 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75  the generated su
2cb80 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d  broutine.  pItem
2cb90 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20  ->regReturn.    
2cba0 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74    ** is a regist
2cbb0 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  er allocated to 
2cbc0 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74  hold the subrout
2cbd0 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  ine return addre
2cbe0 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ss.      */.    
2cbf0 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20    int topAddr;. 
2cc00 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64       int onceAdd
2cc10 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
2cc20 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20   retAddr;.      
2cc30 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61  assert( pItem->a
2cc40 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b  ddrFillSub==0 );
2cc50 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2cc60 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
2cc70 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2cc80 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65  topAddr = sqlite
2cc90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2cca0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49  P_Integer, 0, pI
2ccb0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2ccc0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
2ccd0 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41  drFillSub = topA
2cce0 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  ddr+1;.      if(
2ccf0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72   pItem->fg.isCor
2cd00 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20  related==0 ){.  
2cd10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2cd20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
2cd30 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69  correlated and i
2cd40 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73  f we are not ins
2cd50 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ide of.        *
2cd60 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65  * a trigger, the
2cd70 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  n we only need t
2cd80 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61  o compute the va
2cd90 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  lue of the subqu
2cda0 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ery.        ** o
2cdb0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nce. */.        
2cdc0 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74  onceAddr = sqlit
2cdd0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
2cde0 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
2cdf0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2ce00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2ce10 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2ce20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2ce30 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2ce40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ce50 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
2ce60 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
2ce70 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
2ce80 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2ce90 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2cea0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2ceb0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2cec0 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
2ced0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2cee0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2cef0 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2cf00 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2cf10 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2cf20 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2cf30 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2cf40 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2cf50 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2cf60 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
2cf70 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
2cf80 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
2cf90 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
2cfa0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
2cfb0 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
2cfc0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
2cfd0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
2cfe0 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
2cff0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2d000 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2d010 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
2d020 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2d030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d040 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
2d050 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
2d060 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
2d070 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
2d080 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
2d090 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2d0a0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
2d0b0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50  lect_end;.    pP
2d0c0 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
2d0d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2d0e0 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 7d  prHeight(p);.  }
2d0f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 61  .#endif..  /* Va
2d100 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f  rious elements o
2d110 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70  f the SELECT cop
2d120 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76  ied into local v
2d130 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a  ariables for.  *
2d140 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f  * convenience */
2d150 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
2d160 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20  EList;.  pWhere 
2d170 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
2d180 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
2d190 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
2d1a0 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
2d1b0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2d1c0 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  t = (p->selFlags
2d1d0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
2d1e0 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  =0;..#if SELECTT
2d1f0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2d200 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2d210 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
2d220 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2d230 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
2d240 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d  ("After all FROM
2d250 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73  -clause analysis
2d260 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
2d270 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2d280 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
2d290 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2d2a0 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
2d2b0 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
2d2c0 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
2d2d0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
2d2e0 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
2d2f0 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
2d300 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2d310 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
2d320 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
2d330 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
2d340 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
2d350 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
2d360 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
2d370 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
2d380 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
2d390 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
2d3a0 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
2d3b0 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
2d3c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
2d3d0 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
2d3e0 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52   GROUP BY xyz OR
2d3f0 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
2d400 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
2d410 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
2d420 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
2d430 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
2d440 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
2d450 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
2d460 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
2d470 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
2d480 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
2d490 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
2d4a0 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
2d4b0 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
2d4c0 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
2d4d0 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
2d4e0 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
2d4f0 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
2d500 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
2d510 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
2d520 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
2d530 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
2d540 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
2d550 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
2d560 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
2d570 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
2d580 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
2d590 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74  pOrderBy, pEList
2d5a0 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
2d5b0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2d5c0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
2d5d0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
2d5e0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
2d5f0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
2d600 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
2d610 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
2d620 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
2d630 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
2d640 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
2d650 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
2d660 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
2d670 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
2d680 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
2d690 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
2d6a0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
2d6b0 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
2d6c0 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
2d6d0 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
2d6e0 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
2d6f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
2d700 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
2d710 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
2d720 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
2d730 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2d740 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
2d750 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
2d760 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
2d770 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49  p,("Transform DI
2d780 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55  STINCT into GROU
2d790 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  P BY:\n"));.    
2d7a0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2d7b0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2d7c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2d7d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2d7e0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2d7f0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72   clause, then cr
2d800 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
2d810 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20  l index to.  ** 
2d820 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20  do the sorting. 
2d830 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e   But this sortin
2d840 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  g ephemeral inde
2d850 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20  x might end up. 
2d860 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64   ** being unused
2d870 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
2d880 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e   be extracted in
2d890 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
2d8a0 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20  r..  ** If that 
2d8b0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
2d8c0 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  n the OP_OpenEph
2d8d0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
2d8e0 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
2d8f0 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
2d900 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69  _Noop once we fi
2d910 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
2d920 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2d930 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64  is.  ** not need
2d940 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61  ed.  The sSort.a
2d950 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72  ddrSortIndex var
2d960 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2d970 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a   facilitate.  **
2d980 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
2d990 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
2d9a0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
2d9b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2d9c0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
2d9d0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2d9e0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
2d9f0 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
2da00 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2da10 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
2da20 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
2da30 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
2da40 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
2da50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2da60 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2da70 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
2da80 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
2da90 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
2daa0 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
2dab0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
2dac0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2dad0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2dae0 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
2daf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
2db00 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
2db10 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
2db20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
2db30 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
2db40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
2db50 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
2db60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
2db70 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
2db80 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
2db90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2dba0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2dbb0 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
2dbc0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
2dbd0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
2dbe0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
2dbf0 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
2dc00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2dc10 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70  bel(v);.  if( (p
2dc20 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2dc30 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29  FixedLimit)==0 )
2dc40 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  {.    p->nSelect
2dc50 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
2dc60 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
2dc70 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69  .  }.  computeLi
2dc80 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
2dc90 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
2dca0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
2dcb0 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53  0 && sSort.addrS
2dcc0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
2dcd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2dce0 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53  angeOpcode(v, sS
2dcf0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2dd00 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  x, OP_SorterOpen
2dd10 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72  );.    sSort.sor
2dd20 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c  tFlags |= SORTFL
2dd30 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  AG_UseSorter;.  
2dd40 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20  }..  /* Open an 
2dd50 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
2dd60 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
2dd70 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
2dd80 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
2dd90 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
2dda0 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
2ddb0 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
2ddc0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2ddd0 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
2dde0 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
2ddf0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2de00 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
2de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
2de30 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
2de40 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de60 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72  (char*)keyInfoFr
2de70 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2de80 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30  e, p->pEList,0,0
2de90 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2deb0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2dec0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2ded0 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
2dee0 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44  ORDERED);.    sD
2def0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2df00 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
2df10 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20  CT_UNORDERED;.  
2df20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74  }else{.    sDist
2df30 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2df40 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2df50 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
2df60 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
2df70 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
2df80 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   No aggregate fu
2df90 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47  nctions and no G
2dfa0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
2dfb0 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
2dfc0 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63  lags = (sDistinc
2dfd0 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45  t.isTnct ? WHERE
2dfe0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a  _WANT_DISTINCT :
2dff0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
2e000 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
2e010 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20  ==SF_FixedLimit 
2e020 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  );.    wctrlFlag
2e030 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  s |= p->selFlags
2e040 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74   & SF_FixedLimit
2e050 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
2e060 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2e070 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f  n. */.    pWInfo
2e080 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2e090 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2e0a0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73  bList, pWhere, s
2e0b0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20  Sort.pOrderBy,. 
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
2e0e0 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c  >pEList, wctrlFl
2e0f0 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ags, p->nSelectR
2e100 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ow);.    if( pWI
2e110 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
2e120 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
2e130 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  ( sqlite3WhereOu
2e140 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
2e150 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63  nfo) < p->nSelec
2e160 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d  tRow ){.      p-
2e170 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
2e180 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2e190 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2e1a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e1b0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2e1c0 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65   && sqlite3Where
2e1d0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2e1e0 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73  o) ){.      sDis
2e1f0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2e200 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2e210 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
2e220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e230 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
2e240 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f  {.      sSort.nO
2e250 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68  BSat = sqlite3Wh
2e260 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2e270 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72  nfo);.      sSor
2e280 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  t.bOrderedInnerL
2e290 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65  oop = sqlite3Whe
2e2a0 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  reOrderedInnerLo
2e2b0 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  op(pWInfo);.    
2e2c0 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53    if( sSort.nOBS
2e2d0 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72  at==sSort.pOrder
2e2e0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
2e2f0 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
2e300 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rBy = 0;.      }
2e310 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2e320 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
2e330 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
2e340 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
2e350 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
2e360 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
2e370 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
2e380 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
2e390 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
2e3a0 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
2e3b0 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
2e3c0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
2e3d0 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  if( sSort.addrSo
2e3e0 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53  rtIndex>=0 && sS
2e3f0 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20  ort.pOrderBy==0 
2e400 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e410 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
2e420 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2e430 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a  rtIndex);.    }.
2e440 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
2e450 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
2e460 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65  oop. */.    sele
2e470 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
2e480 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d  se, p, pEList, -
2e490 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73  1, &sSort, &sDis
2e4a0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
2e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4c0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f    sqlite3WhereCo
2e4d0 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e  ntinueLabel(pWIn
2e4e0 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
2e4f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e500 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
2e510 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f  pWInfo));..    /
2e520 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
2e530 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
2e540 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2e550 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
2e560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2e570 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e  * This case when
2e580 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67   there exist agg
2e590 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2e5a0 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63   or a GROUP BY c
2e5b0 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20  lause.    ** or 
2e5c0 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  both */.    Name
2e5d0 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
2e5e0 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
2e5f0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
2e600 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
2e610 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
2e620 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
2e630 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
2e640 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
2e650 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
2e660 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
2e670 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
2e680 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
2e690 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
2e6a0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
2e6b0 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
2e6c0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
2e6d0 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
2e6e0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
2e6f0 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e710 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
2e720 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
2e730 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
2e740 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
2e750 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
2e760 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
2e770 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
2e780 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
2e790 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
2e7a0 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
2e7b0 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
2e7c0 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
2e7d0 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
2e7e0 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
2e7f0 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
2e800 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b      int addrEnd;
2e810 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
2e820 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  f processing for
2e830 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
2e840 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62      int sortPTab
2e850 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64   = 0;   /* Pseud
2e860 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64  otable used to d
2e870 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65  ecode sorting re
2e880 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  sults */.    int
2e890 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20   sortOut = 0;   
2e8a0 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73   /* Output regis
2e8b0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ter from the sor
2e8c0 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ter */.    int o
2e8d0 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f  rderByGrp = 0; /
2e8e0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47 52  * True if the GR
2e8f0 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52  OUP BY and ORDER
2e900 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d 65   BY are the same
2e910 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   */..    /* Remo
2e920 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61  ve any and all a
2e930 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74  liases between t
2e940 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
2e950 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f  d the.    ** GRO
2e960 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
2e970 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
2e980 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
2e990 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  nt k;           
2e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e9b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2e9c0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
2e9d0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
2e9e0 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  m;  /* For loopi
2e9f0 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69  ng over expressi
2ea00 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a  on in a list */.
2ea10 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e  .      for(k=p->
2ea20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
2ea30 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Item=p->pEList->
2ea40 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
2ea50 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
2ea60 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
2ea70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2ea80 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70      for(k=pGroup
2ea90 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  By->nExpr, pItem
2eaa0 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e  =pGroupBy->a; k>
2eab0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
2eac0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
2ead0 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
2eae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2eaf0 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69 74  ssert( 66==sqlit
2eb00 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b  e3LogEst(100) );
2eb10 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
2eb20 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70 2d  electRow>66 ) p-
2eb30 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36 36  >nSelectRow = 66
2eb40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2eb50 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
2eb60 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29  lite3LogEst(1) )
2eb70 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
2eb80 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  ctRow = 0;.    }
2eb90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2eba0 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55  e is both a GROU
2ebb0 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45  P BY and an ORDE
2ebc0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
2ebd0 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20  they are.    ** 
2ebe0 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20  identical, then 
2ebf0 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62  it may be possib
2ec00 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  le to disable th
2ec10 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2ec20 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  e .    ** on the
2ec30 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68   grounds that th
2ec40 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20  e GROUP BY will 
2ec50 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74  cause elements t
2ec60 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20  o come out .    
2ec70 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ** in the correc
2ec80 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f  t order. It also
2ec90 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47   may not - the G
2eca0 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73  ROUP BY might us
2ecb0 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
2ecc0 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
2ecd0 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
2ece0 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2ecf0 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
2ed00 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
2ed10 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
2ed20 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
2ed30 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
2ed40 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
2ed50 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
2ed60 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
2ed70 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
2ed80 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
2ed90 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
2eda0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2edb0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2edc0 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
2edd0 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
2ede0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
2edf0 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
2ee00 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
2ee10 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
2ee20 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
2ee30 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
2ee40 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
2ee50 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
2ee60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2ee70 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
2ee80 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
2ee90 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2eea0 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
2eeb0 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
2eec0 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
2eed0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
2eee0 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
2eef0 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
2ef00 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2ef10 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
2ef20 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
2ef30 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
2ef40 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
2ef50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
2ef60 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
2ef70 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
2ef80 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
2ef90 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
2efa0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2efb0 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
2efc0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2efd0 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
2efe0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
2eff0 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
2f000 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2f010 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
2f020 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2f030 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
2f040 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2f050 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2f060 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
2f070 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
2f080 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
2f090 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2f0a0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
2f0b0 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
2f0c0 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2f0d0 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
2f0e0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2f0f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2f100 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
2f110 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
2f120 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2f130 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
2f140 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
2f150 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2f160 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2f170 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
2f180 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2f190 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2f1a0 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
2f1b0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2f1c0 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
2f1d0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
2f1e0 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
2f1f0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2f200 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
2f210 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
2f220 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2f230 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2f240 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
2f250 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
2f260 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
2f270 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
2f280 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
2f290 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
2f2a0 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
2f2b0 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
2f2c0 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
2f2d0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2f2e0 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
2f2f0 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
2f300 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
2f310 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
2f320 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
2f330 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20      int addr1;  
2f340 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
2f350 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
2f360 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
2f370 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
2f380 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
2f390 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2f3a0 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
2f3b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2f3c0 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
2f3d0 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2f3e0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
2f3f0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
2f400 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2f410 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
2f420 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
2f430 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
2f440 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2f450 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
2f460 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
2f470 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
2f480 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
2f490 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
2f4a0 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
2f4b0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
2f4c0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
2f4d0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
2f4e0 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
2f4f0 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
2f500 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
2f510 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
2f520 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
2f530 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2f540 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
2f550 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
2f560 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
2f570 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
2f580 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
2f590 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
2f5a0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
2f5b0 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
2f5c0 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
2f5d0 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
2f5e0 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
2f5f0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2f600 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
2f610 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
2f620 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
2f630 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
2f640 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2f650 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
2f660 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
2f670 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
2f680 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2f690 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
2f6a0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2f6b0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2f6c0 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67  GroupBy, 0, sAgg
2f6d0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Info.nColumn);. 
2f6e0 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
2f6f0 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
2f700 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
2f710 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
2f720 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2f730 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
2f740 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2f750 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
2f760 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2f770 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
2f780 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2f790 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
2f7a0 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
2f7b0 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
2f7c0 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
2f7d0 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
2f7e0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2f7f0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
2f800 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
2f810 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
2f820 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
2f830 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2f840 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2f850 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2f860 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2f870 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
2f880 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2f890 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
2f8a0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2f8b0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
2f8c0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
2f8d0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
2f8e0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
2f8f0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
2f900 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
2f910 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2f920 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2f930 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2f940 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
2f950 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f960 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2f970 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
2f980 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2f990 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
2f9a0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2f9b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2f9c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2f9d0 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
2f9e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2f9f0 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
2fa00 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
2fa10 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2fa20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2fa30 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
2fa40 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
2fa50 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
2fa60 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
2fa70 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
2fa80 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
2fa90 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
2faa0 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
2fab0 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
2fac0 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
2fad0 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
2fae0 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
2faf0 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
2fb00 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
2fb10 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
2fb20 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
2fb30 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
2fb40 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
2fb50 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
2fb60 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
2fb70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2fb80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2fb90 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2fba0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2fbb0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
2fbc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2fbd0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2fbe0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
2fbf0 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
2fc00 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
2fc10 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
2fc20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
2fc30 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
2fc40 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
2fc50 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2fc60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2fc70 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2fc80 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2fc90 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
2fca0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2fcb0 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
2fcc0 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
2fcd0 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
2fce0 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
2fcf0 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
2fd00 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
2fd10 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
2fd20 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
2fd30 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
2fd40 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
2fd50 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
2fd60 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
2fd70 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
2fd80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
2fd90 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
2fda0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fdb0 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
2fdc0 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
2fdd0 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
2fde0 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
2fdf0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
2fe00 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
2fe10 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
2fe20 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
2fe30 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
2fe40 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
2fe50 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2fe60 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
2fe70 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
2fe80 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
2fe90 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
2fea0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
2feb0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2fec0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
2fed0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
2fee0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
2fef0 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
2ff00 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2ff10 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2ff20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
2ff30 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
2ff40 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
2ff50 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
2ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2ff70 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
2ff80 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
2ff90 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2ffa0 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
2ffb0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
2ffc0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
2ffd0 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
2ffe0 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
2fff0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
30000 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
30010 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
30020 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
30030 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
30040 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
30050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30060 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
30070 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
30080 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30090 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
300a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
300b0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
300c0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
300d0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
300e0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
300f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
30100 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
30110 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
30120 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Base, 0, 0);.   
30130 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
30140 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
30150 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
30160 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
30170 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
30180 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
30190 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
301a0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
301b0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
301c0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
301d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
301e0 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
301f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
30200 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
30210 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65  lumnToReg(pParse
30220 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
30230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30240 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
30250 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
30260 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a  l->iTable, r1);.
30270 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
30280 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
302a0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
302b0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
302c0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
302d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
302e0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
302f0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
30300 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
30310 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30320 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
30330 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49  terInsert, sAggI
30340 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
30350 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
30360 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
30370 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
30380 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
30390 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
303a0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
303b0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
303c0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
303d0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
303e0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
303f0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
30400 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61  dxPTab = sortPTa
30410 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
30420 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74  ++;.        sort
30430 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Out = sqlite3Get
30440 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
30450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30460 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
30470 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72  _OpenPseudo, sor
30480 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20  tPTab, sortOut, 
30490 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
304a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
304b0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
304c0 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
304d0 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
304e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
304f0 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50  mment((v, "GROUP
30500 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62   BY sort")); Vdb
30510 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
30520 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
30530 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
30540 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30550 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
30560 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
30570 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
30580 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70  he index or temp
30590 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64  orary table used
305a0 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59   by the GROUP BY
305b0 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77   sort.      ** w
305c0 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65  ill naturally de
305d0 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68  liver rows in th
305e0 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64  e order required
305f0 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59   by the ORDER BY
30600 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
30610 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68  , cancel the eph
30620 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65  emeral table ope
30630 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e  n coded earlier.
30640 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
30650 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
30660 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
30670 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
30680 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
30690 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20  gardless..      
306a0 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54  ** Use the SQLIT
306b0 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66  E_GroupByOrder f
306c0 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f  lag with SQLITE_
306d0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
306e0 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ER to .      ** 
306f0 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
30700 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
30710 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
30720 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72   */.      if( or
30730 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69  derByGrp && Opti
30740 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
30750 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
30760 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20  ByOrder) .      
30770 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74   && (groupBySort
30780 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65   || sqlite3Where
30790 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29  IsSorted(pWInfo)
307a0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
307b0 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
307c0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  y = 0;.        s
307d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
307e0 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
307f0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
30800 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
30810 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  * Evaluate the c
30820 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
30830 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20  terms and store 
30840 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e  in b0, b1, b2...
30850 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73  .      ** (b0 is
30860 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
30870 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20   iBMem+0, b1 is 
30880 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20  iBMem+1, and so 
30890 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20  forth).      ** 
308a0 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65  Then compare the
308b0 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
308c0 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20  Y terms against 
308d0 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
308e0 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ms.      ** from
308f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
30900 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  w currently stor
30910 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32  ed in a0, a1, a2
30920 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
30930 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70     addrTopOfLoop
30940 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
30950 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
30960 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
30970 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
30980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  );.      if( gro
30990 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
309a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
309b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
309c0 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f  erData, sAggInfo
309d0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  .sortingIdx,.   
309e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309f0 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20         sortOut, 
30a00 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20  sortPTab);.     
30a10 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
30a20 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
30a30 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
30a40 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
30a50 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
30a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30a70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
30a80 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d  sortPTab, j, iBM
30a90 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
30aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30ab0 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
30ac0 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
30ad0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
30ae0 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
30af0 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
30b00 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
30b10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30b20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30b30 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
30b40 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
30b50 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
30b60 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
30b70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
30b80 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
30b90 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
30ba0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
30bb0 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
30bc0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
30bd0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
30be0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
30bf0 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31  , OP_Jump, addr1
30c00 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b  +1, 0, addr1+1);
30c10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
30c20 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
30c30 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
30c40 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
30c50 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
30c60 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
30c70 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
30c80 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
30c90 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
30ca0 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
30cb0 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
30cc0 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
30cd0 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
30ce0 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
30cf0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
30d00 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
30d10 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
30d20 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
30d30 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
30d40 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
30d50 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
30d60 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
30d70 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
30d80 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
30d90 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
30da0 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
30db0 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
30dc0 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
30dd0 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
30de0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
30df0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
30e00 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
30e10 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
30e20 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
30e30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30e40 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
30e50 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
30e60 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
30e70 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
30e80 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
30e90 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
30ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
30eb0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
30ec0 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
30ed0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
30ee0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
30ef0 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
30f00 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
30f10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30f20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
30f30 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
30f40 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
30f50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
30f60 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
30f70 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
30f80 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
30f90 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
30fa0 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
30fb0 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
30fc0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
30fd0 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
30fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
30ff0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
31000 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
31010 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
31020 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
31030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31040 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
31050 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67  ger, 1, iUseFlag
31060 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
31070 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
31080 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d  te data in accum
31090 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
310a0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
310b0 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20  loop.      */.  
310c0 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
310d0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
310e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
310f0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
31100 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
31110 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f  ingIdx, addrTopO
31120 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  fLoop);.        
31130 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
31140 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31150 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
31160 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
31170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
31180 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
31190 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
311a0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
311b0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
311c0 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
311d0 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
311e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
311f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
31200 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
31210 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
31220 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
31230 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
31240 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20  nal row"));..   
31250 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20     /* Jump over 
31260 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a  the subroutines.
31270 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
31280 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
31290 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20  , addrEnd);..   
312a0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
312b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
312c0 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c   outputs a singl
312d0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
312e0 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
312f0 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69  .  This subrouti
31300 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61  ne first looks a
31310 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20  t the iUseFlag. 
31320 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20   If iUseFlag.   
31330 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68     ** is less th
31340 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
31350 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ero, the subrout
31360 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
31370 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   If.      ** the
31380 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c   processing call
31390 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20  s for the query 
313a0 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73  to abort, this s
313b0 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
313c0 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  ** increments th
313d0 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d  e iAbortFlag mem
313e0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66  ory location bef
313f0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ore returning in
31400 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
31410 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61  to signal the ca
31420 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20  ller to abort.. 
31430 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
31440 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c  drSetAbort = sql
31450 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
31460 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
31470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
31480 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
31490 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
314a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
314b0 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20  ((v, "set abort 
314c0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
314d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
314e0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
314f0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
31500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
31510 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
31520 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
31530 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
31540 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
31550 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
31560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31570 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
31580 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61  Pos, iUseFlag, a
31590 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b  ddrOutputRow+2);
315a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
315b0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
315c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
315d0 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
315e0 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
315f0 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
31600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
31610 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
31620 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
31630 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
31640 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
31650 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
31660 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
31670 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
31680 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
31690 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
316a0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
316b0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
316c0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
316d0 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72  EList, -1, &sSor
316e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
316f0 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74 69           &sDisti
31700 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
31710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31720 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b    addrOutputRow+
31730 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29  1, addrSetAbort)
31740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
31750 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
31760 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
31770 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
31780 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
31790 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74  d groupby result
317a0 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a   generator"));..
317b0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
317c0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
317d0 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74  hat will reset t
317e0 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75  he group-by accu
317f0 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f  mulator.      */
31800 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
31810 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
31820 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
31830 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
31840 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
31850 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
31860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
31870 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
31880 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a  egReset);.     .
31890 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
318a0 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20  GroupBy.  Begin 
318b0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
318c0 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20  s without GROUP 
318d0 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  BY: */.    else 
318e0 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
318f0 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e   *pDel = 0;.#ifn
31900 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31910 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20  BTREECOUNT.     
31920 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
31930 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
31940 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c  isSimpleCount(p,
31950 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20   &sAggInfo))!=0 
31960 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
31970 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29   isSimpleCount()
31980 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
31990 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74  er to a Table st
319a0 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20  ructure, then.  
319b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
319c0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66   statement is of
319d0 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20   the form:.     
319e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
319f0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
31a00 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20  *) FROM <tbl>.  
31a10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31a20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61   ** where the Ta
31a30 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65  ble structure re
31a40 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74  turned represent
31a50 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20  s table <tbl>.. 
31a60 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31a70 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d    ** This statem
31a80 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e  ent is so common
31a90 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69   that it is opti
31aa0 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e  mized specially.
31ab0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
31ac0 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63  OP_Count instruc
31ad0 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64  tion is executed
31ae0 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69   either on the i
31af0 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74  ntkey table that
31b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
31b10 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f  ains the data fo
31b20 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72  r table <tbl> or
31b30 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69   on one of its i
31b40 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20  ndexes. It.     
31b50 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20     ** is better 
31b60 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f  to execute the o
31b70 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61  p on an index, a
31b80 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c  s indexes are al
31b90 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  most.        ** 
31ba0 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63  always spread ac
31bb0 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20  ross less pages 
31bc0 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65  than their corre
31bd0 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e  sponding tables.
31be0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
31bf0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
31c00 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
31c10 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
31c20 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
31c30 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ma);.        con
31c40 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50  st int iCsr = pP
31c50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
31c60 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73    /* Cursor to s
31c70 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  can b-tree */.  
31c80 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
31c90 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
31ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
31cb0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
31cc0 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  */.        KeyIn
31cd0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30  fo *pKeyInfo = 0
31ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31cf0 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73  /* Keyinfo for s
31d00 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a  canned index */.
31d10 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
31d20 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
31d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31d40 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64  Best index found
31d50 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
31d60 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70     int iRoot = p
31d70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20  Tab->tnum;      
31d80 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
31d90 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20  page of scanned 
31da0 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20  b-tree */..     
31db0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
31dc0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
31dd0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
31de0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
31df0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
31e00 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
31e10 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
31e20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
31e30 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  or the index tha
31e40 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74  t has the lowest
31e50 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20   scan cost..    
31e60 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31e70 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44  * (2011-04-15) D
31e80 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20  o not do a full 
31e90 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64  scan of an unord
31ea0 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20  ered index..    
31eb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31ec0 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44  * (2013-10-03) D
31ed0 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20  o not count the 
31ee0 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61 72  entries in a par
31ef0 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20  tial index..    
31f00 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31f10 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68  * In practice th
31f20 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
31f30 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ure will not be 
31f40 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79  used. It is only
31f50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73   .        ** pas
31f60 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f  sed to keep OP_O
31f70 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20  penRead happy.. 
31f80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31f90 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
31fa0 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d 20  pTab) ) pBest = 
31fb0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
31fc0 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
31fd0 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
31fe0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
31ff0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
32000 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
32010 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64  if( pIdx->bUnord
32020 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
32030 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64     && pIdx->szId
32040 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62  xRow<pTab->szTab
32050 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  Row.           &
32060 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  & pIdx->pPartIdx
32070 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20  Where==0.       
32080 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c      && (!pBest |
32090 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  | pIdx->szIdxRow
320a0 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77  <pBest->szIdxRow
320b0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
320c0 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
320d0 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
320e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
320f0 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74         if( pBest
32100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52   ){.          iR
32110 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75  oot = pBest->tnu
32120 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  m;.          pKe
32130 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
32140 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
32150 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20  arse, pBest);.  
32160 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
32170 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d   /* Open a read-
32180 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65  only cursor, exe
32190 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e  cute the OP_Coun
321a0 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72  t, close the cur
321b0 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sor. */.        
321c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
321d0 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  4Int(v, OP_OpenR
321e0 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74  ead, iCsr, iRoot
321f0 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20  , iDb, 1);.     
32200 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
32210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
32220 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
32230 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
32240 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
32250 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d  INFO);.        }
32260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
32280 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41  _Count, iCsr, sA
32290 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
322a0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
322b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
322c0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43  (v, OP_Close, iC
322d0 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  sr);.        exp
322e0 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
322f0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42  pParse, pTab, pB
32300 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
32310 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
32320 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
32330 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20  NT */.      {.  
32340 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
32350 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  f the query is o
32360 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  f one of the fol
32370 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20  lowing forms:.  
32380 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32390 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e   **   SELECT min
323a0 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
323b0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
323c0 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   max(x) FROM ...
323d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
323e0 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
323f0 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f   then ask the co
32400 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f  de in where.c to
32410 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74   attempt to sort
32420 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20   results.       
32430 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20   ** as if there 
32440 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e  was an "ORDER ON
32450 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e   x" or "ORDER ON
32460 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e   x DESC" clause.
32470 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20   .        ** If 
32480 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20  where.c is able 
32490 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c  to produce resul
324a0 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69  ts sorted in thi
324b0 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  s order, then.  
324c0 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62        ** add vdb
324d0 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20  e code to break 
324e0 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65  out of the proce
324f0 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72  ssing loop after
32500 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
32510 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
32520 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73   (since the firs
32530 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
32540 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20  he loop is .    
32550 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
32560 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  d to operate on 
32570 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65  the row with the
32580 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69   minimum or maxi
32590 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  mum .        ** 
325a0 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20  value of x, the 
325b0 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65  only row require
325c0 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  d)..        **. 
325d0 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63         ** A spec
325e0 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65  ial flag must be
325f0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
32600 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74  e3WhereBegin() t
32610 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20  o slightly.     
32620 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68     ** modify beh
32630 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73  avior as follows
32640 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
32650 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74       **   + If t
32660 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53  he query is a "S
32670 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74  ELECT min(x)", t
32680 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64  hen the loop cod
32690 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  ed by.        **
326a0 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f       where.c sho
326b0 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20  uld not iterate 
326c0 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20  over any values 
326d0 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75  with a NULL valu
326e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
326f0 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20   for x..        
32700 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
32710 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  + The optimizer 
32720 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
32730 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20  (the thing that 
32740 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20  decides which.  
32750 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
32760 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f  ex or indices to
32770 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61   use) should pla
32780 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  ce a different p
32790 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20  riority on .    
327a0 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73      **     satis
327b0 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52  fying the 'ORDER
327c0 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e   BY' clause than
327d0 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65   it does in othe
327e0 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20  r cases..       
327f0 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f   **     Refer to
32800 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e   code and commen
32810 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f  ts in where.c fo
32820 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20  r details..     
32830 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78     */.        Ex
32840 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20  prList *pMinMax 
32850 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
32860 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44  flag = WHERE_ORD
32870 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  ERBY_NORMAL;.   
32880 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61 73       .        as
32890 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
328a0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
328b0 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
328c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
328d0 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a  ->pHaving==0 ){.
328e0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
328f0 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41   minMaxQuery(&sA
32900 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78  ggInfo, &pMinMax
32910 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32920 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
32930 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78  g==0 || (pMinMax
32940 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e  !=0 && pMinMax->
32950 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20  nExpr==1) );..  
32960 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29        if( flag )
32970 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  {.          pMin
32980 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Max = sqlite3Exp
32990 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69  rListDup(db, pMi
329a0 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  nMax, 0);.      
329b0 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
329c0 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ax;.          as
329d0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
329e0 46 61 69 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d 61  Failed || pMinMa
329f0 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x!=0 );.        
32a00 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
32a10 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
32a20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
32a30 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
32a40 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44   flag!=WHERE_ORD
32a50 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20  ERBY_MIN ?1:0;. 
32a60 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
32a70 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
32a80 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
32a90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32aa0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
32ab0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
32ac0 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
32ad0 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
32ae0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
32af0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
32b00 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
32b10 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
32b20 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
32b30 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20  gle row.        
32b40 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
32b50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
32b60 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
32b70 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
32b80 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57  nfo);.        pW
32b90 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
32ba0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
32bb0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
32bc0 65 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 2c 66 6c  e, pMinMax, 0,fl
32bd0 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ag,0);.        i
32be0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
32bf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32c00 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
32c10 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
32c20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
32c30 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
32c40 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
32c50 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
32c60 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
32c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
32c80 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e  inMax==0 || pMin
32c90 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  Max->nExpr==1 );
32ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
32cb0 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
32cc0 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a  ed(pWInfo)>0 ){.
32cd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32ce0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c  3VdbeGoto(v, sql
32cf0 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
32d00 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20  bel(pWInfo));.  
32d10 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
32d20 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
32d30 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
32d40 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
32d50 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
32d60 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
32d70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32d80 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
32d90 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
32da0 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
32db0 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
32dc0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
32dd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f      }..      sSo
32de0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
32df0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
32e00 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
32e10 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
32e20 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
32e30 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
32e40 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
32e50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
32e60 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20  st, -1, 0, 0, . 
32e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e80 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
32e90 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
32ea0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
32eb0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
32ec0 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
32ed0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
32ee0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
32ef0 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
32f00 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
32f10 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
32f20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
32f30 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
32f40 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
32f50 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
32f60 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
32f70 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
32f80 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
32f90 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
32fa0 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
32fb0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
32fc0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
32fd0 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
32fe0 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
32ff0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
33000 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
33010 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
33020 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
33030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33040 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
33050 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
33060 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
33070 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
33080 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
33090 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
330a0 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
330b0 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
330c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
330d0 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
330e0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
330f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
33100 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
33110 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
33120 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
33130 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
33140 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
33150 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
33160 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
33170 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
33180 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
33190 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
331a0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
331b0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
331c0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
331d0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
331e0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
331f0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
33200 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
33210 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
33220 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
33230 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
33240 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
33250 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
33260 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
33270 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
33280 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
33290 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
332a0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
332b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
332c0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
332d0 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
332e0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
332f0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
33300 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
33310 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
33320 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
33330 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
33340 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
33350 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45  aFunc);.#if SELE
33360 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
33370 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
33380 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70  pParse,p,("end p
33390 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
333a0 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
333b0 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
333c0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
333d0 0a                                               .