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

Artifact d12f3539f80db38b09015561b569e0eb1c4b6c5f:


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 4f 72 64 65 72 42 79 20         pOrderBy 
19890 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
198a0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
198b0 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
198c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
198d0 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
198e0 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
198f0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
19900 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
19910 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
19920 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
19930 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
19940 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
19950 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
19960 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
19970 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
19980 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
19990 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
199a0 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
199b0 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
199c0 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
199d0 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
199e0 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
199f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19a00 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
19a10 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
19a20 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
19a30 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
19a40 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
19a50 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
19a60 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
19a70 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
19a80 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
19a90 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
19aa0 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
19ab0 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a  nOrderBy + 1));.
19ac0 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
19ad0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
19ae0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
19af0 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b  m;.    aPermute[
19b00 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  0] = nOrderBy;. 
19b10 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65     for(i=1, pIte
19b20 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
19b30 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  <=nOrderBy; i++,
19b40 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19b50 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
19b60 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
19b70 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
19b80 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
19b90 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
19ba0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
19bb0 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
19bc0 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
19bd0 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
19be0 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
19bf0 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
19c00 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
19c10 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
19c20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
19c30 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
19c40 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
19c50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19c60 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
19c70 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
19c80 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
19c90 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
19ca0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
19cb0 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
19cc0 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
19cd0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
19ce0 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
19cf0 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
19d00 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
19d10 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
19d20 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
19d30 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
19d40 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
19d50 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
19d60 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
19d70 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
19d80 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
19d90 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
19da0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
19db0 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
19dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19dd0 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
19de0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
19df0 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
19e00 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
19e10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
19e20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
19e30 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
19e40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
19e50 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
19e60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19e70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
19e80 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
19e90 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
19ea0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
19eb0 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
19ec0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
19ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
19ee0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
19ef0 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
19f00 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
19f10 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
19f20 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
19f30 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
19f40 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
19f50 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
19f60 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
19f70 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
19f80 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
19f90 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
19fa0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
19fb0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
19fc0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
19fd0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
19fe0 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
19ff0 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
1a000 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1a010 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1a020 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
1a030 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
1a040 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
1a050 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
1a060 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
1a070 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1a080 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
1a090 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
1a0a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
1a0b0 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
1a0c0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
1a0d0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1a0e0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
1a0f0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
1a100 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
1a110 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
1a120 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
1a130 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
1a140 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
1a150 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1a160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a170 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
1a180 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
1a190 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
1a1a0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1c0 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
1a1d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a1e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1a1f0 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
1a200 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
1a210 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
1a220 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
1a230 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1a240 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1a250 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
1a260 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
1a270 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1a280 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
1a290 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
1a2a0 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
1a2b0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a2c0 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
1a2d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a2e0 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
1a2f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
1a300 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
1a310 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
1a320 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
1a330 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
1a340 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
1a350 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1a360 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
1a370 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
1a380 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
1a390 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
1a3a0 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
1a3b0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1a3c0 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
1a3d0 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
1a3e0 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
1a3f0 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
1a400 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  ..  */.  addrSel
1a410 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
1a420 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1a430 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20   + 1;.  addr1 = 
1a440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a450 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
1a460 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c  utine, regAddrA,
1a470 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29   0, addrSelectA)
1a480 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1a490 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54  (v, "left SELECT
1a4a0 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
1a4b0 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
1a4c0 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  A;.  explainSetI
1a4d0 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
1a4e0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
1a4f0 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
1a500 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
1a510 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
1a520 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
1a530 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41  oroutine(v, regA
1a540 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
1a550 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1a560 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65  addr1);..  /* Ge
1a570 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
1a580 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
1a590 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1a5a0 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
1a5b0 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
1a5c0 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
1a5d0 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
1a5e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a5f0 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64  ddr(v) + 1;.  ad
1a600 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
1a610 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
1a620 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
1a630 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65  AddrB, 0, addrSe
1a640 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f  lectB);.  VdbeCo
1a650 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74  mment((v, "right
1a660 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
1a670 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
1a680 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
1a690 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
1a6a0 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
1a6b0 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
1a6c0 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
1a6d0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
1a6e0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
1a6f0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
1a700 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1a710 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
1a720 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
1a730 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
1a740 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
1a750 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
1a760 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1a770 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1a780 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
1a790 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1a7a0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
1a7b0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
1a7c0 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
1a7d0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
1a7e0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
1a7f0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
1a800 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1a810 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1a820 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1a830 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
1a840 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1a850 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1a860 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1a870 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
1a880 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1a8b0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1a8c0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1a8d0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1a8e0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1a8f0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1a900 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
1a910 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1a920 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1a930 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1a940 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1a950 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
1a960 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
1a970 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
1a980 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
1a990 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
1a9a0 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
1a9b0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1a9c0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1a9d0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1a9e0 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
1a9f0 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
1aa00 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1aa10 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1aa20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b  ;.  }.  sqlite3K
1aa30 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
1aa40 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Dup);..  /* Gene
1aa50 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1aa60 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
1aa70 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
1aa80 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
1aa90 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
1aaa0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
1aab0 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
1aac0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1aad0 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
1aae0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1aaf0 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1ab00 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65   addrEofA = labe
1ab10 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  lEnd;.  }else{  
1ab20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1ab30 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
1ab40 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1ab50 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
1ab60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ab70 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1ab80 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1ab90 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
1aba0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1abb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1abc0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62  d, regAddrB, lab
1abd0 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  elEnd);.        
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
1ac00 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1ac10 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1ac20 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  o(v, addrEofA);.
1ac30 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
1ac40 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
1ac50 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
1ac60 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
1ac70 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20  ectRow);.  }..  
1ac80 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1ac90 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1aca0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1acb0 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
1acc0 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1acd0 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1ace0 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
1acf0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1ad00 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1ad10 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
1ad20 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
1ad30 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
1ad40 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
1ad50 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
1ad60 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
1ad70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
1ad80 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
1ad90 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1ada0 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
1adb0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
1adc0 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
1add0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1ade0 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
1adf0 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
1ae00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ae10 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1ae20 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrA, labelEnd);
1ae30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1ae40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ae50 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1ae60 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
1ae70 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1ae80 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1ae90 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
1aea0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1aeb0 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
1aec0 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
1aed0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1aee0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1aef0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1af00 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
1af10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1af20 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1af30 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64  A, addrEofA); Vd
1af40 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1af50 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1af60 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1af70 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1af80 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1af90 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
1afa0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1afb0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
1afc0 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1afd0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
1afe0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1aff0 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1b000 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
1b010 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
1b020 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
1b030 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
1b040 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1b050 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
1b060 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b070 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b080 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1b090 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1b0a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1b0b0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b0c0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
1b0d0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b0e0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1b0f0 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
1b100 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1b110 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
1b120 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1b130 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
1b140 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1b150 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
1b160 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1b170 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1b180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b190 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1b1a0 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
1b1b0 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
1b1c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b1d0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1b1e0 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
1b1f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b200 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1b210 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1b220 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
1b230 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
1b240 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
1b250 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
1b260 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1b270 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
1b280 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b290 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b2a0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f  drA, addrEofA_no
1b2b0 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1b2c0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1b2d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b2e0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1b2f0 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1b300 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1b310 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
1b320 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
1b330 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1b340 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b350 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1b360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b370 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
1b380 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
1b390 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
1b3a0 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
1b3b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1b3c0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
1b3d0 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
1b3e0 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
1b3f0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1b410 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
1b420 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
1b430 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1b440 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
1b450 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
1b460 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b470 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
1b480 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
1b490 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  tB); VdbeCoverag
1b4a0 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e(v);..  /* Jump
1b4b0 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
1b4c0 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
1b4d0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
1b4e0 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
1b4f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b500 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
1b510 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
1b520 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
1b530 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
1b540 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1b550 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
1b560 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
1b570 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
1b580 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
1b590 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
1b5a0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
1b5b0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
1b5c0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1b5d0 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70   pFirst->pSrc, p
1b5e0 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
1b5f0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
1b600 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
1b610 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
1b620 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
1b630 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1b640 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
1b650 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
1b660 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1b670 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1b680 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
1b690 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
1b6a0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1b6b0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1b6c0 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  = p;..  /*** TBD
1b6d0 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
1b6e0 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
1b6f0 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
1b700 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
1b710 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
1b720 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  /.  explainCompo
1b730 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
1b740 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
1b750 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  , 0);.  return p
1b760 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a  Parse->nErr!=0;.
1b770 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
1b780 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b790 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1b7a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b7b0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
1b7c0 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
1b7d0 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
1b7e0 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
1b7f0 50 61 72 73 65 2a 2c 20 45 78 70 72 4c 69 73 74  Parse*, ExprList
1b800 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
1b810 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
1b820 73 75 62 73 74 53 65 6c 65 63 74 28 50 61 72 73  substSelect(Pars
1b830 65 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  e*, Select *, in
1b840 74 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  t, ExprList*, in
1b850 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  t);../*.** Scan 
1b860 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
1b870 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
1b880 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
1b890 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
1b8a0 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
1b8b0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
1b8c0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
1b8d0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
1b8e0 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
1b8f0 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
1b900 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
1b910 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
1b920 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
1b930 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1b940 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
1b950 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
1b960 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
1b970 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
1b980 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
1b990 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
1b9a0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
1b9b0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1b9c0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
1b9d0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
1b9e0 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
1b9f0 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
1ba00 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
1ba10 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
1ba20 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
1ba30 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
1ba40 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
1ba50 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
1ba60 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
1ba70 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
1ba80 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
1ba90 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
1baa0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
1bab0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
1bac0 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
1bad0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1bae0 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 65       /* Report e
1baf0 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
1bb00 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1bb10 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
1bb20 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
1bb30 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e  n occurs */.  in
1bb40 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1bb50 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
1bb60 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
1bb70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1bb80 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  st    /* Substit
1bb90 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ute expressions 
1bba0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1bbb0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1bbc0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
1bbd0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1bbe0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1bbf0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
1bc00 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
1bc10 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
1bc20 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
1bc30 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
1bc40 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
1bc50 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
1bc60 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78   *pNew;.      Ex
1bc70 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 45 4c 69  pr *pCopy = pELi
1bc80 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
1bc90 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
1bca0 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
1bcb0 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
1bcc0 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
1bcd0 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
1bce0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
1bcf0 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
1bd00 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
1bd10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1bd20 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79  prIsVector(pCopy
1bd30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1bd40 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d  ite3VectorErrorM
1bd50 73 67 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79  sg(pParse, pCopy
1bd60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1bd70 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1bd80 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1bd90 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20  , pCopy, 0);.   
1bda0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
1bdb0 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
1bdc0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
1bdd0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1bde0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1bdf0 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74   = pExpr->iRight
1be00 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20  JoinTable;.     
1be10 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
1be20 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b   |= EP_FromJoin;
1be30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1be40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1be50 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
1be60 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d  .        pExpr =
1be70 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   pNew;.      }. 
1be80 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1be90 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
1bea0 20 73 75 62 73 74 45 78 70 72 28 70 50 61 72 73   substExpr(pPars
1beb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1bec0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1bed0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
1bee0 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
1bef0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1bf00 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70  Right, iTable, p
1bf10 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
1bf20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1bf30 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1bf40 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75  ect) ){.      su
1bf50 62 73 74 53 65 6c 65 63 74 28 70 50 61 72 73 65  bstSelect(pParse
1bf60 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
1bf70 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ct, iTable, pELi
1bf80 73 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  st, 1);.    }els
1bf90 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  e{.      substEx
1bfa0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1bfb0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  Expr->x.pList, i
1bfc0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1bfd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1bfe0 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74  rn pExpr;.}.stat
1bff0 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
1c000 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
1c010 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
1c020 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 20 68   Report errors h
1c030 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ere */.  ExprLis
1c040 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
1c050 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e   List to scan an
1c060 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  d in which to ma
1c070 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a  ke substitutes *
1c080 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1c090 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1c0a0 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
1c0b0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
1c0c0 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a  t *pEList     /*
1c0d0 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75   Substitute valu
1c0e0 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
1c0f0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1c100 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1c110 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1c120 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1c130 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1c140 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 50  r = substExpr(pP
1c150 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
1c160 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
1c170 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
1c180 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1c190 74 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  tSelect(.  Parse
1c1a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1c1b0 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73  /* Report errors
1c1c0 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
1c1d0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1c1e0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1c1f0 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1c200 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1c210 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
1c220 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1c230 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
1c240 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
1c250 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f  st *pEList,    /
1c260 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
1c270 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50  ues */.  int doP
1c280 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a  rior          /*
1c290 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20   Do substitutes 
1c2a0 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f  on p->pPrior too
1c2b0 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1c2c0 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1c2d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1c2e0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1c2f0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1c300 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73  ;.  do{.    subs
1c310 74 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  tExprList(pParse
1c320 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
1c330 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1c340 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1c350 70 50 61 72 73 65 2c 20 70 2d 3e 70 47 72 6f 75  pParse, p->pGrou
1c360 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  pBy, iTable, pEL
1c370 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
1c380 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1c390 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
1c3a0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1c3b0 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1c3c0 75 62 73 74 45 78 70 72 28 70 50 61 72 73 65 2c  ubstExpr(pParse,
1c3d0 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
1c3e0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1c3f0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1c400 62 73 74 45 78 70 72 28 70 50 61 72 73 65 2c 20  bstExpr(pParse, 
1c410 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
1c420 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1c430 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1c440 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1c450 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1c460 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1c470 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1c480 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1c490 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1c4a0 74 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  t(pParse, pItem-
1c4b0 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  >pSelect, iTable
1c4c0 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20 20  , pEList, 1);.  
1c4d0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1c4e0 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
1c4f0 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72         substExpr
1c500 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 49 74  List(pParse, pIt
1c510 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c  em->u1.pFuncArg,
1c520 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1c530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c540 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f    }while( doPrio
1c550 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72  r && (p = p->pPr
1c560 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e  ior)!=0 );.}.#en
1c570 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1c580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1c590 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1c5a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1c5b0 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1c5c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1c5d0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1c5e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1c5f0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1c600 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1c610 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1c620 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1c630 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1c640 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1c650 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1c660 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1c670 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1c680 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1c690 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1c6a0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1c6b0 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1c6c0 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1c6d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1c6e0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1c6f0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1c700 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1c710 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1c720 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1c730 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1c740 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1c750 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1c760 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1c770 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1c780 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1c790 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1c7a0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1c7b0 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1c7c0 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1c7d0 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1c7e0 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1c7f0 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1c800 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1c810 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1c820 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1c830 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1c840 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1c850 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1c860 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1c870 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1c880 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1c890 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1c8a0 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1c8b0 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1c8c0 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1c8d0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1c8e0 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1c8f0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1c900 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1c910 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1c920 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1c930 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1c940 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1c950 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1c960 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1c970 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1c980 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1c990 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1c9a0 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1c9b0 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1c9c0 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1c9d0 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1c9e0 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1c9f0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1ca00 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1ca10 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
1ca20 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
1ca30 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1ca40 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
1ca50 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1ca60 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1ca70 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1ca80 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
1ca90 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
1caa0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1cab0 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 28  n aggregate or (
1cac0 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1cad0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
1cae0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20  n.**        and 
1caf0 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20 71  (2b) the outer q
1cb00 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1cb10 65 20 73 75 62 71 75 65 72 69 65 73 20 6f 74 68  e subqueries oth
1cb20 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a  er than the one.
1cb30 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d 2d 63  **        FROM-c
1cb40 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 74  lause subquery t
1cb50 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61  hat is a candida
1cb60 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e  te for flattenin
1cb70 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20 20 20  g.  (2b is.**   
1cb80 20 20 20 20 20 64 75 65 20 74 6f 20 74 69 63 6b       due to tick
1cb90 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39  et [2f7170d73bf9
1cba0 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30 31 35  abf80] from 2015
1cbb0 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1cbc0 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
1cbd0 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
1cbe0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1cbf0 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
1cc00 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67  .**        (Orig
1cc10 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33  inally ticket #3
1cc20 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65  06.  Strengthene
1cc30 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30  d by ticket #330
1cc40 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  0).**.**   (4)  
1cc50 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1cc60 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a  not DISTINCT..**
1cc70 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
1cc80 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
1cc90 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
1cca0 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
1ccb0 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
1ccc0 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
1ccd0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
1cce0 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
1ccf0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
1cd00 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
1cd10 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
1cd20 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
1cd30 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
1cd40 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
1cd50 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ries..**.**   (6
1cd60 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1cd70 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
1cd80 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
1cd90 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1cda0 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
1cdb0 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
1cdc0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1cdd0 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
1cde0 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73  e.  TODO:  For s
1cdf0 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  ubqueries withou
1ce00 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52  t.**        A FR
1ce10 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69  OM clause, consi
1ce20 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f  der adding a FRO
1ce30 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65  M close with the
1ce40 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20   special.**     
1ce50 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f     table sqlite_
1ce60 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73  once that consis
1ce70 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72  ts of a single r
1ce80 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  ow containing a.
1ce90 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65  **        single
1cea0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   NULL..**.**   (
1ceb0 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
1cec0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1ced0 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1cee0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
1cef0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
1cf00 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1cf10 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1cf20 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1cf30 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1cf40 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
1cf50 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
1cf60 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f  (**)  Restrictio
1cf70 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76  n (10) was remov
1cf80 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65  ed from the code
1cf90 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62   on 2005-02-05 b
1cfa0 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1cfb0 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69  accidently carri
1cfc0 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66  ed the comment f
1cfd0 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31  orward until 201
1cfe0 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e  4-09-15.  Origin
1cff0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 65 78  al.**        tex
1d000 74 3a 20 22 54 68 65 20 73 75 62 71 75 65 72 79  t: "The subquery
1d010 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1d020 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1d030 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20  outer query .** 
1d040 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20         does not 
1d050 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a  use LIMIT.".**.*
1d060 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
1d070 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1d080 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1d090 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
1d0a0 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
1d0b0 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d  **  (**)  Not im
1d0c0 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
1d0d0 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
1d0e0 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
1d0f0 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
1d100 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
1d110 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
1d120 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
1d130 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
1d140 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1d150 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
1d160 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
1d170 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
1d180 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
1d190 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
1d1a0 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  FFSET..**.**  (1
1d1b0 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
1d1c0 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
1d1d0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1d1e0 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
1d1f0 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
1d200 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
1d210 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  IMIT clause..** 
1d220 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
1d230 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63  et #2339 and tic
1d240 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d  ket [02a8e81d44]
1d250 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20  )..**.**  (16)  
1d260 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1d270 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1d280 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75  ate or the subqu
1d290 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20  ery does.**     
1d2a0 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f     not contain O
1d2b0 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
1d2c0 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
1d2d0 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
1d2e0 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
1d2f0 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
1d300 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
1d310 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
1d320 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20  *.**  (17)  The 
1d330 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
1d340 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1d350 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55  ct, or it is a U
1d360 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20  NION ALL .**    
1d370 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61      compound cla
1d380 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69  use made up enti
1d390 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72  rely of non-aggr
1d3a0 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61  egate queries, a
1d3b0 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  nd .**        th
1d3c0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a  e parent query:.
1d3d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  **.**          *
1d3e0 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70   is not itself p
1d3f0 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
1d400 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20  d select,.**    
1d410 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
1d420 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44  n aggregate or D
1d430 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61  ISTINCT query, a
1d440 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  nd.**          *
1d450 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a   is not a join.*
1d460 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
1d470 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
1d480 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
1d490 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
1d4a0 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
1d4b0 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
1d4c0 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
1d4d0 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
1d4e0 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
1d4f0 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
1d500 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
1d510 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72  es.  The subquer
1d520 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79  y cannot use any
1d530 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1d540 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68      operator oth
1d550 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
1d560 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  L because all th
1d570 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64  e other compound
1d580 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
1d590 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70  tors have an imp
1d5a0 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68  lied DISTINCT wh
1d5b0 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ich is disallowe
1d5c0 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  d by.**        r
1d5d0 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a  estriction (4)..
1d5e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73  **.**        Als
1d5f0 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  o, each componen
1d600 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  t of the sub-que
1d610 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74  ry must return t
1d620 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
1d630 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75  *        of resu
1d640 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73  lt columns. This
1d650 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72   is actually a r
1d660 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61  equirement for a
1d670 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1d680 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61        SELECT sta
1d690 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20  tement, but all 
1d6a0 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f  the code here do
1d6b0 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20  es is make sure 
1d6c0 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20  that no.**      
1d6d0 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29    such (illegal)
1d6e0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c   sub-query is fl
1d6f0 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c  attened. The cal
1d700 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20  ler will detect 
1d710 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79  the.**        sy
1d720 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72  ntax error and r
1d730 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64  eturn a detailed
1d740 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
1d750 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
1d760 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1d770 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1d780 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
1d790 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
1d7a0 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66  DER by clause of
1d7b0 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
1d7c0 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
1d7d0 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
1d7e0 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
1d7f0 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
1d800 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73  .**  (19)  The s
1d810 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1d820 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1d830 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1d840 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
1d850 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
1d860 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30  ause..**.**  (20
1d870 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1d880 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1d890 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69  d select, then i
1d8a0 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a  t must not use.*
1d8b0 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45  *        an ORDE
1d8c0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69  R BY clause.  Ti
1d8d0 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20  cket #3773.  We 
1d8e0 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73  could relax this
1d8f0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
1d900 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62        somewhat b
1d910 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68  y saying that th
1d920 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  e terms of the O
1d930 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d  RDER BY clause m
1d940 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70  ust.**        ap
1d950 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69  pear as unmodifi
1d960 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ed result column
1d970 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
1d980 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a  uery.  But we.**
1d990 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68          have oth
1d9a0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1d9b0 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c   in mind to deal
1d9c0 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e   with that case.
1d9d0 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68  .**.**  (21)  Th
1d9e0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1d9f0 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1da00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1da10 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
1da20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
1da30 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
1da40 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  46fc])..**.**  (
1da50 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  22)  The subquer
1da60 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  y is not a recur
1da70 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  sive CTE..**.** 
1da80 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65 6e   (23)  The paren
1da90 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  t is not a recur
1daa0 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65  sive CTE, or the
1dab0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
1dac0 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  t a.**        co
1dad0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68  mpound query. Th
1dae0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69  is restriction i
1daf0 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66  s because transf
1db00 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  orming the.**   
1db10 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61       parent to a
1db20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1db30 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64  confuses the cod
1db40 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a  e that handles.*
1db50 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69  *        recursi
1db60 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75  ve queries in mu
1db70 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a  ltiSelect()..**.
1db80 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20 73 75  **  (24)  The su
1db90 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
1dba0 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74 20   aggregate that 
1dbb0 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69  uses the built-i
1dbc0 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20  n min() or .**  
1dbd0 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66        or max() f
1dbe0 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68  unctions.  (With
1dbf0 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  out this restric
1dc00 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69  tion, a query li
1dc10 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53  ke:.**        "S
1dc20 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
1dc30 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46  LECT max(y), x F
1dc40 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e  ROM t1)" would n
1dc50 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a  ot necessarily.*
1dc60 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  *        return 
1dc70 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20  the value X for 
1dc80 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78 69  which Y was maxi
1dc90 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49  mal.).**.**.** I
1dca0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
1dcb0 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
1dcc0 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
1dcd0 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
1dce0 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
1dcf0 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
1dd00 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
1dd10 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
1dd20 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
1dd30 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
1dd40 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
1dd50 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
1dd60 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1dd70 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
1dd80 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1dd90 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
1dda0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1ddb0 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
1ddc0 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
1ddd0 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
1dde0 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
1ddf0 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
1de00 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
1de10 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
1de20 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
1de30 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
1de40 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
1de50 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
1de60 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
1de70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1de80 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
1de90 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1dea0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
1deb0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1dec0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1ded0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
1dee0 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
1def0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
1df00 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
1df10 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1df20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
1df30 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
1df40 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
1df50 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
1df60 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
1df70 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
1df80 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1df90 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
1dfa0 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
1dfb0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1dfc0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1dfd0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
1dfe0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1dff0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1e000 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
1e010 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
1e020 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
1e030 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
1e040 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
1e050 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
1e060 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
1e070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
1e080 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
1e090 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
1e0a0 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
1e0b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
1e0c0 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
1e0d0 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
1e0e0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1e0f0 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
1e100 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1e110 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1e120 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
1e130 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
1e140 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1e150 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1e160 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
1e170 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
1e180 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
1e190 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
1e1a0 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
1e1b0 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
1e1c0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
1e1d0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
1e1e0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
1e1f0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1e200 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1e210 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
1e220 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
1e230 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e240 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1e250 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1e260 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
1e270 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
1e280 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1e290 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1e2a0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1e2b0 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
1e2c0 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1e2d0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
1e2e0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1e2f0 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
1e300 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
1e310 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74   );  /* Unable t
1e320 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75  o flatten compou
1e330 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  nd queries */.  
1e340 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1e350 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
1e360 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
1e370 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
1e380 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1e390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1e3a0 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
1e3b0 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
1e3c0 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
1e3d0 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
1e3e0 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
1e3f0 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
1e400 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
1e410 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
1e420 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
1e430 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  ;.  if( subquery
1e440 49 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28  IsAgg ){.    if(
1e450 20 69 73 41 67 67 20 29 20 72 65 74 75 72 6e 20   isAgg ) return 
1e460 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e490 20 28 31 29 20 20 20 2a 2f 0a 20 20 20 20 69 66   (1)   */.    if
1e4a0 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ( pSrc->nSrc>1 )
1e4b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e4e0 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20 20 20 69  n (2a)  */.    i
1e4f0 66 28 20 28 70 2d 3e 70 57 68 65 72 65 20 26 26  f( (p->pWhere &&
1e500 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1e510 28 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53 75  (p->pWhere,EP_Su
1e520 62 71 75 65 72 79 29 29 0a 20 20 20 20 20 7c 7c  bquery)).     ||
1e530 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   (sqlite3ExprLis
1e540 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73 74  tFlags(p->pEList
1e550 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29  ) & EP_Subquery)
1e560 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c  !=0.     || (sql
1e570 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
1e580 73 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26  s(p->pOrderBy) &
1e590 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30   EP_Subquery)!=0
1e5a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1e5b0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e5f0 28 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20  (2b)  */.    }. 
1e600 20 7d 0a 20 20 20 20 0a 20 20 70 53 75 62 53 72   }.    .  pSubSr
1e610 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
1e620 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
1e630 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
1e640 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
1e650 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
1e660 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
1e670 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
1e680 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
1e690 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
1e6a0 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
1e6b0 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
1e6c0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1e6d0 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
1e6e0 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
1e6f0 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
1e700 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
1e710 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1e720 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
1e730 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1e740 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
1e750 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
1e760 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
1e770 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
1e780 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1e790 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
1e7a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1e7b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1e7c0 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
1e7d0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73   if( pSub->pOffs
1e7e0 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  et ) return 0;  
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e800 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1e810 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
1e820 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1e830 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29  s & SF_Compound)
1e840 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  !=0 && pSub->pLi
1e850 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
1e860 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1e8a0 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
1e8b0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
1e8c0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e8f0 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
1e900 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1e910 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
1e920 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1e930 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e940 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28  on (5)  */.  if(
1e950 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1e960 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
1e970 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
1e980 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1e990 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e9a0 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
1e9b0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1e9c0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1e9d0 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72  t)!=0 && subquer
1e9e0 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72  yIsAgg ){.     r
1e9f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ea00 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1ea10 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (6)  */.  }.  if
1ea20 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
1ea30 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1ea40 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1ea50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
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 2f 2a 20 52              /* R
1ea80 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
1ea90 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
1eaa0 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
1eab0 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1eae0 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
1eaf0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1eb00 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
1eb10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1eb20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1eb30 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
1eb40 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
1eb50 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1eb60 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
1eb70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1eb80 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1eb90 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
1eba0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75  .  testcase( pSu
1ebb0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1ebc0 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20  _Recursive );.  
1ebd0 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e  testcase( pSub->
1ebe0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 69  selFlags & SF_Mi
1ebf0 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69 66 28  nMaxAgg );.  if(
1ec00 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1ec10 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 7c  & (SF_Recursive|
1ec20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b  SF_MinMaxAgg) ){
1ec30 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
1ec40 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
1ec50 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a  22) and (24) */.
1ec60 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
1ec70 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
1ec80 72 73 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e  rsive) && pSub->
1ec90 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65  pPrior ){.    re
1eca0 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
1ecb0 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20  iction (23) */. 
1ecc0 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54   }..  /* OBSOLET
1ecd0 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a  E COMMENT 1:.  *
1ece0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
1ecf0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1ed00 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
1ed10 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
1ed20 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
1ed30 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
1ed40 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
1ed50 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
1ed60 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
1ed70 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
1ed80 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1ed90 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1eda0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
1edb0 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
1edc0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1edd0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1ede0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1edf0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1ee00 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1ee10 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
1ee20 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
1ee30 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
1ee40 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
1ee50 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   ** OBSOLETE COM
1ee60 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73  MENT 2:.  ** Res
1ee70 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
1ee80 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1ee90 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1eea0 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1eeb0 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
1eec0 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1eed0 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
1eee0 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
1eef0 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
1ef00 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
1ef10 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1ef20 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1ef30 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
1ef40 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
1ef50 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
1ef60 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1ef70 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1ef80 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1ef90 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1efa0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1efb0 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
1efc0 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
1efd0 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
1efe0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
1eff0 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
1f000 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
1f010 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
1f020 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
1f030 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
1f040 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20  NER JOIN..  **. 
1f050 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44   ** THIS OVERRID
1f060 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ES OBSOLETE COMM
1f070 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f  ENTS 1 AND 2 ABO
1f080 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20  VE:.  ** Ticket 
1f090 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74  #3300 shows that
1f0a0 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1f0b0 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
1f0c0 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69  LEFT JOIN.  ** i
1f0d0 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64  s fraught with d
1f0e0 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20  anger.  Best to 
1f0f0 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20  avoid the whole 
1f100 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20  thing.  If the. 
1f110 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
1f120 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1f130 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
1f140 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
1f150 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  en..  */.  if( (
1f160 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69  pSubitem->fg.joi
1f170 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
1f180 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1f190 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
1f1a0 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20  Restriction 17: 
1f1b0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1f1c0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1f1d0 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d  ELECT, then it m
1f1e0 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c  ust.  ** use onl
1f1f0 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  y the UNION ALL 
1f200 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f  operator. And no
1f210 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  ne of the simple
1f220 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a   select queries.
1f230 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75    ** that make u
1f240 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  p the compound S
1f250 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65  ELECT are allowe
1f260 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74  d to be aggregat
1f270 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20  e or distinct.  
1f280 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
1f290 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
1f2a0 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
1f2b0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1f2c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1f2d0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f2e0 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20   20 */.    }.   
1f2f0 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70   if( isAgg || (p
1f300 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f310 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20  Distinct)!=0 || 
1f320 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b  pSrc->nSrc!=1 ){
1f330 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1f340 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
1f350 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31  Sub1=pSub; pSub1
1f360 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70  ; pSub1=pSub1->p
1f370 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65  Prior){.      te
1f380 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1f390 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1f3a0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1f3b0 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
1f3c0 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  nct );.      tes
1f3d0 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
1f3e0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1f3f0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1f400 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
1f410 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ate );.      ass
1f420 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21  ert( pSub->pSrc!
1f430 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1f440 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  rt( pSub->pEList
1f450 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e  ->nExpr==pSub1->
1f460 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1f470 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
1f480 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1f490 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1f4a0 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20  gregate))!=0.   
1f4b0 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
1f4c0 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
1f4d0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20  op!=TK_ALL) .   
1f4e0 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
1f4f0 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20  rc->nSrc<1.     
1f500 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1f510 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1f520 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
1f530 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e  ub1->pSrc->nSrc>
1f540 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1 );.    }..    
1f550 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
1f560 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  8. */.    if( p-
1f570 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1f580 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1f590 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d   for(ii=0; ii<p-
1f5a0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1f5b0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
1f5c0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1f5d0 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64  ->a[ii].u.x.iOrd
1f5e0 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74  erByCol==0 ) ret
1f5f0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1f600 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a     }.  }..  /***
1f610 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
1f620 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
1f630 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
1f640 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c  ed. *****/.  SEL
1f650 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
1f660 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73  e,p,("flatten %s
1f670 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64  .%p from term %d
1f680 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f690 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53          pSub->zS
1f6a0 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46  elName, pSub, iF
1f6b0 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74  rom));..  /* Aut
1f6c0 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75  horize the subqu
1f6d0 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  ery */.  pParse-
1f6e0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1f6f0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  pSubitem->zName;
1f700 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29  .  TESTONLY(i =)
1f710 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1f720 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1f730 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
1f740 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  );.  testcase( i
1f750 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b  ==SQLITE_DENY );
1f760 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1f770 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
1f780 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  AuthContext;..  
1f790 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  /* If the sub-qu
1f7a0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1f7b0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
1f7c0 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73  nt, then (by res
1f7d0 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31  trictions.  ** 1
1f7e0 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20  7 and 18 above) 
1f7f0 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49  it must be a UNI
1f800 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70  ON ALL and the p
1f810 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74  arent query must
1f820 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65   .  ** be of the
1f830 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
1f840 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70       SELECT <exp
1f850 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73  r-list> FROM (<s
1f860 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72  ub-query>) <wher
1f870 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a  e-clause> .  **.
1f880 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79    ** followed by
1f890 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
1f8a0 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53  IMIT and/or OFFS
1f8b0 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73  ET clauses. This
1f8c0 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61   block.  ** crea
1f8d0 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f  tes N-1 copies o
1f8e0 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  f the parent que
1f8f0 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f  ry without any O
1f900 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f  RDER BY, LIMIT o
1f910 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63  r .  ** OFFSET c
1f920 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73  lauses and joins
1f930 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66   them to the lef
1f940 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74  t-hand-side of t
1f950 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
1f960 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c   using UNION ALL
1f970 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74   operators. In t
1f980 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68  his case N is th
1f990 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70  e number of simp
1f9a0 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73  le.  ** select s
1f9b0 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
1f9c0 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
1f9d0 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ery..  **.  ** E
1f9e0 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
1f9f0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31  *     SELECT a+1
1fa00 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20   FROM (.  **    
1fa10 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
1fa20 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
1fa30 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1fa40 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79          SELECT y
1fa50 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
1fa60 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
1fa70 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1fa80 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d  CT abs(z*2) FROM
1fa90 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29   tab2.  **     )
1faa0 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45   WHERE a!=5 ORDE
1fab0 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
1fac0 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
1fad0 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
1fae0 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d   SELECT x+1 FROM
1faf0 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d   tab WHERE x+1!=
1fb00 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
1fb10 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
1fb20 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61  LECT y+1 FROM ta
1fb30 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20  b WHERE y+1!=5. 
1fb40 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
1fb50 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
1fb60 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f  T abs(z*2)+1 FRO
1fb70 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73  M tab2 WHERE abs
1fb80 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20  (z*2)+1!=5.  ** 
1fb90 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20      ORDER BY 1. 
1fba0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c   **.  ** We call
1fbb0 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f   this the "compo
1fbc0 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
1fbd0 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20  ttening"..  */. 
1fbe0 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e   for(pSub=pSub->
1fbf0 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53  pPrior; pSub; pS
1fc00 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
1fc10 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
1fc20 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ew;.    ExprList
1fc30 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
1fc40 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78  pOrderBy;.    Ex
1fc50 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
1fc60 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72  pLimit;.    Expr
1fc70 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70   *pOffset = p->p
1fc80 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65  Offset;.    Sele
1fc90 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
1fca0 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
1fcb0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1fcc0 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20   p->pSrc = 0;.  
1fcd0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
1fce0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
1fcf0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73   0;.    p->pOffs
1fd00 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  et = 0;.    pNew
1fd10 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
1fd20 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
1fd30 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1fd40 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53  SetName(pNew, pS
1fd50 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20  ub->zSelName);. 
1fd60 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
1fd70 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e  pOffset;.    p->
1fd80 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
1fd90 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
1fda0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
1fdb0 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
1fdc0 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
1fdd0 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ALL;.    if( pNe
1fde0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
1fdf0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1fe00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fe10 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
1fe20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
1fe30 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
1fe40 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
1fe50 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  w;.      pNew->p
1fe60 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
1fe70 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
1fe80 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
1fe90 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a  ACE(2,pParse,p,.
1fea0 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70 6f           ("compo
1feb0 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
1fec0 74 74 65 6e 65 72 20 63 72 65 61 74 65 73 20 25  ttener creates %
1fed0 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c  s.%p as peer\n",
1fee0 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  .         pNew->
1fef0 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29  zSelName, pNew))
1ff00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ff10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ff20 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
1ff30 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61  ..  /* Begin fla
1ff40 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f  ttening the iFro
1ff50 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
1ff60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20  e FROM clause . 
1ff70 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72   ** in the outer
1ff80 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
1ff90 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53  Sub = pSub1 = pS
1ffa0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1ffb0 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
1ffc0 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
1ffd0 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f  e structure asso
1ffe0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
1fff0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20    ** subquery.  
20000 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
20010 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
20020 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73  >zDatabase);.  s
20030 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20040 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
20050 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
20060 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
20070 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62  >zAlias);.  pSub
20080 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
20090 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
200a0 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53  >zName = 0;.  pS
200b0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ubitem->zAlias =
200c0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
200d0 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  pSelect = 0;..  
200e0 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e  /* Defer deletin
200f0 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  g the Table obje
20100 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
20110 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
20120 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20  uery until code 
20130 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20  generation is.  
20140 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e  ** complete, sin
20150 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69  ce there may sti
20160 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54  ll exist Expr.pT
20170 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  ab entries that.
20180 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68    ** refer to th
20190 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20  e subquery even 
201a0 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  after flattening
201b0 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e  .  Ticket #3346.
201c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69  .  **.  ** pSubi
201d0 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77  tem->pTab is alw
201e0 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20  ays non-NULL by 
201f0 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e  test restriction
20200 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76  s and tests abov
20210 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c  e..  */.  if( AL
20220 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70  WAYS(pSubitem->p
20230 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54  Tab!=0) ){.    T
20240 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20  able *pTabToDel 
20250 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  = pSubitem->pTab
20260 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f  ;.    if( pTabTo
20270 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20  Del->nTabRef==1 
20280 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
20290 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
202a0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
202b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
202c0 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
202d0 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
202e0 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
202f0 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
20300 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
20310 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
20320 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
20330 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a  Del->nTabRef--;.
20340 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
20350 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
20360 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
20370 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
20380 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
20390 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
203a0 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
203b0 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
203c0 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
203d0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
203e0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
203f0 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
20400 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
20410 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
20420 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
20430 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
20440 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
20450 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
20460 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
20470 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
20480 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
20490 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
204a0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
204b0 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
204c0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
204d0 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
204e0 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
204f0 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
20500 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
20510 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
20520 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
20530 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
20540 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
20550 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
20560 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
20570 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
20580 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
20590 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
205a0 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
205b0 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
205c0 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
205d0 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
205e0 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
205f0 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
20600 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
20610 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
20620 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
20630 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
20640 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
20650 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
20660 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
20670 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
20680 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
20690 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
206a0 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
206b0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
206c0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
206d0 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
206e0 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
206f0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
20700 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
20710 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
20720 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
20730 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
20740 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
20750 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
20760 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
20770 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
20780 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20790 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
207a0 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
207b0 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
207c0 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
207d0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e   = pSubitem->fg.
207e0 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
207f0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
20800 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
20810 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
20820 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
20830 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
20840 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  /.      pSrc = p
20850 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73  Parent->pSrc = s
20860 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
20870 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
20880 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
20890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
208a0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
208b0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
208c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
208d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
208e0 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  The subquery use
208f0 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20  s a single slot 
20900 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
20910 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a  se of the outer.
20920 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49      ** query.  I
20930 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  f the subquery h
20940 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
20950 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20   element in its 
20960 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20  FROM clause,.   
20970 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20   ** then expand 
20980 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20990 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
209a0 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  r it to hold all
209b0 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a   elements.    **
209c0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
209d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
209e0 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
209f0 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54      **    SELECT
20a00 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53   * FROM tabA, (S
20a10 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62  ELECT * FROM sub
20a20 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a  1, sub2), tabB;.
20a30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
20a40 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
20a50 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73  s 3 slots in its
20a60 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
20a70 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20  ne slot of the. 
20a80 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
20a90 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c  y (the middle sl
20aa0 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74  ot) is used by t
20ab0 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
20ac0 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
20ad0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c  ock of code will
20ae0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
20af0 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  r query FROM cla
20b00 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a  use to 4 slots..
20b10 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c      ** The middl
20b20 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  e slot is expand
20b30 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
20b40 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
20b50 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f   space.    ** fo
20b60 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e  r the two elemen
20b70 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
20b80 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
20b90 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
20ba0 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
20bb0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
20bc0 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
20bd0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
20be0 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
20bf0 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
20c00 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
20c10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20c20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
20c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20c40 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
20c50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
20c60 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
20c70 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
20c80 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
20c90 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
20ca0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
20cb0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
20cc0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
20cd0 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
20ce0 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
20cf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20d00 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
20d10 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  .fg.isTabFunc==0
20d20 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e   );.      pSrc->
20d30 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
20d40 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
20d50 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
20d60 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
20d70 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
20d80 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
20d90 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e  rc->a[iFrom].fg.
20da0 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
20db0 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e  ype;.  .    /* N
20dc0 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
20dd0 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
20de0 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
20df0 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a  sions for .    *
20e00 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
20e10 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
20e20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
20e30 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45      ** .    ** E
20e40 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
20e50 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61     **   SELECT a
20e60 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
20e70 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
20e80 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
20e90 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
20ea0 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
20ec0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
20ed0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
20ee0 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20            /.    
20ef0 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
20f00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
20f10 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
20f20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20f30 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a  _______/.    **.
20f40 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61      ** We look a
20f50 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
20f60 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
20f70 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
20f80 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20  place we see.   
20f90 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
20fa0 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
20fb0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
20fc0 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
20fd0 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20  tute "y+10"..   
20fe0 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   */.    pList = 
20ff0 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b  pParent->pEList;
21000 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21010 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
21020 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  +){.      if( pL
21030 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
21040 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
21050 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
21060 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
21070 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
21080 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
21090 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
210a0 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
210b0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  ->a[i].zName = z
210c0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
210d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
210e0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
210f0 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
21100 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65  oint, any non-ze
21110 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76  ro iOrderByCol v
21120 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74  alues indicate t
21130 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
21140 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e   ORDER BY column
21150 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69   expression is i
21160 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20  dentical to the 
21170 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20  iOrderByCol'th. 
21180 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
21190 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  on returned by S
211a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
211b0 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73  pSub. Since thes
211c0 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a  e values.      *
211d0 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61  * do not necessa
211e0 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20  rily correspond 
211f0 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45  to columns in SE
21200 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
21210 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a  Parent,.      **
21220 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72   zero them befor
21230 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68  e transfering th
21240 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
21250 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
21260 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74    ** Not doing t
21270 68 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e  his may cause an
21280 20 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73   error if a subs
21290 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74  equent call to t
212a0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
212b0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
212c0 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70  o flatten a comp
212d0 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
212e0 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20  nto pParent.    
212f0 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77    ** (the only w
21300 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
21310 65 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d  en is if the com
21320 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20  pound sub-query 
21330 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  is.      ** curr
21340 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53  ently part of pS
21350 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74  ub->pSrc). See t
21360 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38  icket [d11a6e908
21370 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78  f].  */.      Ex
21380 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
21390 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
213a0 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  y;.      for(i=0
213b0 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
213c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
213d0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
213e0 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
213f0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
21400 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
21410 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
21420 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
21430 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d  t( pSub->pPrior=
21440 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
21450 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ent->pOrderBy = 
21460 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
21470 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
21480 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57   0;.    }.    pW
21490 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
214a0 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
214b0 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
214c0 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
214d0 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
214e0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
214f0 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
21500 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
21510 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
21520 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
21530 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
21540 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
21550 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  t->pHaving = sql
21560 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
21570 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21580 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
21590 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 2c  ub->pHaving, 0),
215a0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
215b0 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  g.      );.     
215c0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
215d0 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
215e0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
215f0 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
21600 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
21610 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  , pSub->pGroupBy
21620 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
21630 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
21640 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
21650 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65  ExprAnd(db, pWhe
21660 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  re, pParent->pWh
21670 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ere);.    }.    
21680 73 75 62 73 74 53 65 6c 65 63 74 28 70 50 61 72  substSelect(pPar
21690 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 69 50 61  se, pParent, iPa
216a0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
216b0 73 74 2c 20 30 29 3b 0a 20 20 0a 20 20 20 20 2f  st, 0);.  .    /
216c0 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
216d0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
216e0 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
216f0 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
21700 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
21710 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
21720 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
21730 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
21740 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
21750 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
21760 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
21770 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
21780 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
21790 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
217a0 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
217b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
217c0 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
217d0 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
217e0 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
217f0 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
21800 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
21810 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
21820 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
21830 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
21840 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
21850 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
21860 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
21870 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
21880 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
21890 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
218a0 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
218b0 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
218c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
218d0 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
218e0 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
218f0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
21900 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23  e(db, pSub1);..#
21910 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
21920 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
21930 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
21940 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53  & 0x100 ){.    S
21950 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
21960 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
21970 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22  r flattening:\n"
21980 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
21990 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
219a0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
219b0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  if..  return 1;.
219c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
219d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
219e0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
219f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21a00 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23  IT_VIEW) */....#
21a10 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
21a20 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21a30 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
21a40 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
21a50 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  /*.** Make copie
21a60 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48  s of relevant WH
21a70 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
21a80 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
21a90 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20  ery into.** the 
21aa0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
21ab0 73 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70  subquery.  Examp
21ac0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  le:.**.**    SEL
21ad0 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
21ae0 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
21af0 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S y FROM t1) WHE
21b00 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
21b10 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  .**.** Transform
21b20 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ed into:.**.**  
21b30 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
21b40 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
21b50 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
21b60 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63   WHERE a=5 AND c
21b70 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48  -d=10).**     WH
21b80 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30  ERE x=5 AND y=10
21b90 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65  ;.**.** The hope
21ba0 20 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72   is that the ter
21bb0 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ms added to the 
21bc0 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c  inner query will
21bd0 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a   make it more.**
21be0 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
21bf0 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
21c00 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
21c10 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  on if:.**.**   (
21c20 31 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  1) The inner que
21c30 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  ry is an aggrega
21c40 74 65 2e 20 20 28 49 6e 20 74 68 61 74 20 63 61  te.  (In that ca
21c50 73 65 2c 20 77 65 27 64 20 72 65 61 6c 6c 79 20  se, we'd really 
21c60 77 61 6e 74 0a 2a 2a 20 20 20 20 20 20 20 74 6f  want.**       to
21c70 20 63 6f 70 79 20 74 68 65 20 6f 75 74 65 72 20   copy the outer 
21c80 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72  WHERE-clause ter
21c90 6d 73 20 6f 6e 74 6f 20 74 68 65 20 48 41 56 49  ms onto the HAVI
21ca0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  NG clause of the
21cb0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 6e 65 72 20  .**       inner 
21cc0 71 75 65 72 79 2e 20 20 42 75 74 20 74 68 65 79  query.  But they
21cd0 20 70 72 6f 62 61 62 6c 79 20 77 6f 6e 27 74 20   probably won't 
21ce0 68 65 6c 70 20 74 68 65 72 65 20 73 6f 20 64 6f  help there so do
21cf0 20 6e 6f 74 20 62 6f 74 68 65 72 2e 29 0a 2a 2a   not bother.).**
21d00 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e  .**   (2) The in
21d10 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
21d20 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20   recursive part 
21d30 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  of a common tabl
21d40 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
21d50 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e  .**   (3) The in
21d60 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20  ner query has a 
21d70 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69  LIMIT clause (si
21d80 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20  nce the changes 
21d90 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
21da0 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c        close woul
21db0 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61  d change the mea
21dc0 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49  ning of the LIMI
21dd0 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  T)..**.**   (4) 
21de0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
21df0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
21e00 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
21e10 4f 49 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c 65  OIN.  (The calle
21e20 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f 72  r.**       enfor
21e30 63 65 73 20 74 68 69 73 20 72 65 73 74 72 69 63  ces this restric
21e40 74 69 6f 6e 20 73 69 6e 63 65 20 74 68 69 73 20  tion since this 
21e50 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
21e60 20 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20   have enough.** 
21e70 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f        informatio
21e80 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a  n to know.).**.*
21e90 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45 52  *   (5) The WHER
21ea0 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
21eb0 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69  ion originates i
21ec0 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
21ed0 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20  G clause.**     
21ee0 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e    of a LEFT JOIN
21ef0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
21f00 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61   if no changes a
21f10 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d  re made and non-
21f20 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d  zero if one or m
21f30 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
21f40 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75  .** terms are du
21f50 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68  plicated into th
21f60 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
21f70 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f  tatic int pushDo
21f80 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20  wnWhereTerms(.  
21f90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
21fa0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
21fb0 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c  ontext (for mall
21fc0 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72  oc() and error r
21fd0 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53  eporting) */.  S
21fe0 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20  elect *pSubq,   
21ff0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
22000 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45  uery whose WHERE
22010 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65   clause is to be
22020 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   augmented */.  
22030 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
22040 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
22050 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
22060 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
22070 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20    int iCursor   
22080 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
22090 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
220a0 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
220b0 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
220c0 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20  nt nChng = 0;.  
220d0 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 20 20 20  Select *pX;     
220e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
220f0 70 69 6e 67 20 6f 76 65 72 20 63 6f 6d 70 6f 75  ping over compou
22100 6e 64 20 53 45 4c 45 43 54 73 20 69 6e 20 70 53  nd SELECTs in pS
22110 75 62 71 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ubq */.  if( pWh
22120 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ere==0 ) return 
22130 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70 53 75 62  0;.  for(pX=pSub
22140 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50  q; pX; pX=pX->pP
22150 72 69 6f 72 29 7b 0a 20 20 20 20 69 66 28 20 28  rior){.    if( (
22160 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  pX->selFlags & (
22170 53 46 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f  SF_Aggregate|SF_
22180 52 65 63 75 72 73 69 76 65 29 29 21 3d 30 20 29  Recursive))!=0 )
22190 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
221a0 28 20 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( pX->selFlags &
221b0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b   SF_Aggregate );
221c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
221d0 20 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   pX->selFlags & 
221e0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
221f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22200 70 58 21 3d 70 53 75 62 71 20 29 3b 0a 20 20 20  pX!=pSubq );.   
22210 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
22220 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 29  restrictions (1)
22230 20 61 6e 64 20 28 32 29 20 2a 2f 0a 20 20 20 20   and (2) */.    
22240 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  }.  }.  if( pSub
22250 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a  q->pLimit!=0 ){.
22260 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
22270 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
22280 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   */.  }.  while(
22290 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f   pWhere->op==TK_
222a0 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67  AND ){.    nChng
222b0 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72   += pushDownWher
222c0 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  eTerms(pParse, p
222d0 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52  Subq, pWhere->pR
222e0 69 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a  ight, iCursor);.
222f0 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68      pWhere = pWh
22300 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a  ere->pLeft;.  }.
22310 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
22320 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f  perty(pWhere,EP_
22330 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
22340 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
22350 74 69 6f 6e 20 35 20 2a 2f 0a 20 20 69 66 28 20  tion 5 */.  if( 
22360 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
22370 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72  leConstant(pWher
22380 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20  e, iCursor) ){. 
22390 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20     nChng++;.    
223a0 77 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a  while( pSubq ){.
223b0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
223c0 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
223d0 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c 20  se->db, pWhere, 
223e0 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  0);.      pNew =
223f0 20 73 75 62 73 74 45 78 70 72 28 70 50 61 72 73   substExpr(pPars
22400 65 2c 20 70 4e 65 77 2c 20 69 43 75 72 73 6f 72  e, pNew, iCursor
22410 2c 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 29  , pSubq->pEList)
22420 3b 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70  ;.      pSubq->p
22430 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
22440 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
22450 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65  b, pSubq->pWhere
22460 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
22470 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50  Subq = pSubq->pP
22480 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rior;.    }.  }.
22490 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a    return nChng;.
224a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
224b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
224c0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
224d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
224e0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
224f0 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
22500 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
22510 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
22520 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
22530 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
22540 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
22550 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
22560 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
22570 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
22580 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
22590 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
225a0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
225b0 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
225c0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
225d0 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
225e0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
225f0 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
22600 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
22610 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22620 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
22630 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
22640 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
22650 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
22660 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
22670 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
22680 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
22690 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
226a0 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
226b0 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
226c0 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
226d0 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
226e0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
226f0 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
22700 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
22710 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
22720 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
22730 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
22740 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
22750 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
22760 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
22770 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22780 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
22790 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
227a0 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
227b0 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
227c0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
227d0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
227e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
227f0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
22800 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
22810 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
22820 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
22830 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
22840 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
22850 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
22860 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
22870 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
22880 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
22890 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
228a0 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
228b0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
228c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
228d0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
228e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
228f0 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
22900 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
22910 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
22920 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
22930 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
22940 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
22950 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
22960 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
22970 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
22980 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
22990 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
229a0 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
229b0 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
229c0 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
229d0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
229e0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
229f0 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
22a00 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
22a10 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
22a20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
22a30 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
22a40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
22a50 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
22a60 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
22a70 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
22a80 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
22a90 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
22aa0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
22ab0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
22ac0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
22ad0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
22ae0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
22af0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
22b00 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
22b10 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
22b20 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
22b30 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
22b40 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
22b50 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
22b60 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
22b70 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
22b80 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
22b90 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
22ba0 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
22bb0 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
22bc0 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
22bd0 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
22be0 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
22bf0 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
22c00 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
22c10 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
22c20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
22c30 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
22c40 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
22c50 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
22c60 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
22c70 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
22c80 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
22c90 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
22ca0 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
22cb0 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
22cc0 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
22cd0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
22ce0 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
22cf0 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
22d00 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
22d10 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
22d20 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
22d30 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
22d40 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
22d50 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
22d60 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
22d70 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
22d80 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
22d90 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
22da0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
22db0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
22dc0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
22dd0 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
22de0 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
22df0 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
22e00 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
22e10 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
22e20 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
22e30 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
22e40 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
22e50 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
22e60 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
22e70 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
22e80 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
22e90 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
22ea0 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
22eb0 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
22ec0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
22ed0 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
22ee0 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
22ef0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
22f00 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
22f10 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
22f20 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
22f30 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
22f40 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
22f50 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
22f60 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
22f70 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
22f80 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
22f90 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
22fa0 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
22fb0 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
22fc0 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
22fd0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
22fe0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
22ff0 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
23000 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
23010 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
23020 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
23030 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
23040 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
23050 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
23060 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
23070 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
23080 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75  xedBy = pFrom->u
23090 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20  1.zIndexedBy;.  
230a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
230b0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
230c0 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
230d0 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
230e0 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
230f0 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42  zName, zIndexedB
23100 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  y); .        pId
23110 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
23120 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
23130 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
23140 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
23150 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
23160 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65  ex: %s", zIndexe
23170 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dBy, 0);.      p
23180 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
23190 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
231a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
231b0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
231c0 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  om->pIBIndex = p
231d0 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
231e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
231f0 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70  *.** Detect comp
23200 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
23210 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20  ements that use 
23220 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
23230 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61  se with .** an a
23240 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
23250 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
23260 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e  *.**    SELECT .
23270 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
23280 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
23290 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e  M t2 ORDER BY ..
232a0 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
232b0 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77  ** These are rew
232c0 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71  ritten as a subq
232d0 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  uery:.**.**    S
232e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
232f0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
23300 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
23310 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20  .. FROM t2).**  
23320 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20     ORDER BY ... 
23330 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
23340 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
23350 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
23360 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  ry because the m
23370 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
23380 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  y() routine.** a
23390 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61  bove that genera
233a0 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
233b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
233c0 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
233d0 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73   BY clause.** us
233e0 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72  es a merge algor
233f0 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72  ithm that requir
23400 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
23410 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
23420 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  n the.** result 
23430 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68  columns as on th
23440 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
23450 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a  e.  See ticket.*
23460 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  * http://www.sql
23470 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
23480 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a  /6709574d2a.**.*
23490 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
234a0 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65  ation is only ne
234b0 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c  eded for EXCEPT,
234c0 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20   INTERSECT, and 
234d0 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e  UNION..** The UN
234e0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
234f0 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68   works fine with
23500 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
23510 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a  rBy() even when.
23520 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c  ** there are COL
23530 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68  LATE terms in th
23540 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73  e ORDER BY..*/.s
23550 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72  tatic int conver
23560 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
23570 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72  oSubquery(Walker
23580 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
23590 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
235a0 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
235b0 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20    Select *pX;.  
235c0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
235d0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
235e0 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73  tem *a;.  SrcLis
235f0 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61  t *pNewSrc;.  Pa
23600 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54  rse *pParse;.  T
23610 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69  oken dummy;..  i
23620 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
23630 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
23640 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e  tinue;.  if( p->
23650 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
23660 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
23670 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70  e;.  for(pX=p; p
23680 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b  X && (pX->op==TK
23690 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  _ALL || pX->op==
236a0 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70  TK_SELECT); pX=p
236b0 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69  X->pPrior){}.  i
236c0 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72  f( pX==0 ) retur
236d0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
236e0 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42    a = p->pOrderB
236f0 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  y->a;.  for(i=p-
23700 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
23710 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
23720 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78      if( a[i].pEx
23730 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  pr->flags & EP_C
23740 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a  ollate ) break;.
23750 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
23760 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23770 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  nue;..  /* If we
23780 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
23790 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
237a0 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
237b0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
237c0 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ..  pParse = pWa
237d0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
237e0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
237f0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
23800 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
23810 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
23820 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
23830 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
23840 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ort;.  memset(&d
23850 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ummy, 0, sizeof(
23860 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53  dummy));.  pNewS
23870 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
23880 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
23890 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26  m(pParse,0,0,0,&
238a0 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b  dummy,pNew,0,0);
238b0 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d  .  if( pNewSrc==
238c0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
238d0 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20  bort;.  *pNew = 
238e0 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20  *p;.  p->pSrc = 
238f0 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45  pNewSrc;.  p->pE
23900 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
23910 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
23920 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
23930 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52  xpr(db, TK_ASTER
23940 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f  ISK, 0));.  p->o
23950 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
23960 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a   p->pWhere = 0;.
23970 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
23980 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48   = 0;.  pNew->pH
23990 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65  aving = 0;.  pNe
239a0 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  w->pOrderBy = 0;
239b0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
239c0 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30  ;.  p->pNext = 0
239d0 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30  ;.  p->pWith = 0
239e0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
239f0 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
23a00 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
23a10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e  elFlags & SF_Con
23a20 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20  verted)==0 );.  
23a30 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
23a40 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61  F_Converted;.  a
23a50 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72  ssert( pNew->pPr
23a60 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  ior!=0 );.  pNew
23a70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ->pPrior->pNext 
23a80 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
23a90 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  pLimit = 0;.  pN
23aa0 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b  ew->pOffset = 0;
23ab0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
23ac0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
23ad0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23ae0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23af0 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20   term pFrom has 
23b00 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
23b10 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e  ction.** argumen
23b20 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ts.  If it does,
23b30 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
23b40 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
23b50 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  e and return.** 
23b60 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20  non-zero, since 
23b70 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c  pFrom is not all
23b80 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62  owed to be a tab
23b90 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
23ba0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
23bb0 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  t cannotBeFuncti
23bc0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
23bd0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
23be0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
23bf0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
23c00 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
23c10 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23c20 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73  pParse, "'%s' is
23c30 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22   not a function"
23c40 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pFrom->zName);
23c50 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
23c60 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
23c70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23c80 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
23c90 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28  Argument pWith (
23ca0 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c  which may be NUL
23cb0 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c  L) points to a l
23cc0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65  inked list of ne
23cd0 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f  sted .** WITH co
23ce0 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e  ntexts, from inn
23cf0 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e  er to outermost.
23d00 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64   If the table id
23d10 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  entified by .** 
23d20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
23d30 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61  ent pItem is rea
23d40 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62  lly a common-tab
23d50 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43  le-expression (C
23d60 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74  TE) .** then ret
23d70 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23d80 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74   the CTE definit
23d90 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62  ion for that tab
23da0 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  le. Otherwise.**
23db0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
23dc0 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c  .** If a non-NUL
23dd0 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  L value is retur
23de0 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74  ned, set *ppCont
23df0 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ext to point to 
23e00 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65  the With.** obje
23e10 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ct that the retu
23e20 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73  rned CTE belongs
23e30 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73   to..*/.static s
23e40 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63  truct Cte *searc
23e50 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70  hWith(.  With *p
23e60 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
23e70 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
23e80 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49  ent innermost WI
23e90 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  TH clause */.  s
23ea0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23eb0 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f  em *pItem,     /
23ec0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
23ed0 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65  ement to resolve
23ee0 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43   */.  With **ppC
23ef0 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20  ontext          
23f00 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49        /* OUT: WI
23f10 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  TH clause return
23f20 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74   value belongs t
23f30 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  o */.){.  const 
23f40 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
23f50 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
23f60 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65  ase==0 && (zName
23f70 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29   = pItem->zName)
23f80 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  !=0 ){.    With 
23f90 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57  *p;.    for(p=pW
23fa0 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75  ith; p; p=p->pOu
23fb0 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ter){.      int 
23fc0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
23fd0 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b  ; i<p->nCte; i++
23fe0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
23ff0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
24000 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  ame, p->a[i].zNa
24010 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
24020 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d      *ppContext =
24030 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   p;.          re
24040 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  turn &p->a[i];. 
24050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24070 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn 0;.}../* The
24080 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
24090 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63  maintains a stac
240a0 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48  k of active WITH
240b0 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68   clauses.** with
240c0 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
240d0 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e  WITH clause bein
240e0 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  g at the top of 
240f0 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
24100 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
24110 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c  shes the WITH cl
24120 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74  ause passed as t
24130 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
24140 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74  nt.** onto the t
24150 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
24160 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72   If argument bFr
24170 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ee is true, then
24180 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c   this.** WITH cl
24190 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  ause will never 
241a0 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  be popped from t
241b0 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69  he stack. In thi
241c0 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f  s case it.** sho
241d0 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f  uld be freed alo
241e0 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73  ng with the Pars
241f0 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68  e object. In oth
24200 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a  er cases, when.*
24210 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20  * bFree==0, the 
24220 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c  With object will
24230 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
24240 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20  with the SELECT 
24250 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69  .** statement wi
24260 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61  th which it is a
24270 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f  ssociated..*/.vo
24280 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  id sqlite3WithPu
24290 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
242a0 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75  , With *pWith, u
242b0 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65  8 bFree){.  asse
242c0 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20  rt( bFree==0 || 
242d0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d  (pParse->pWith==
242e0 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69  0 && pParse->pWi
242f0 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a  thToFree==0) );.
24300 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
24310 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
24320 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20  e->pWith!=pWith 
24330 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f  );.    pWith->pO
24340 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70  uter = pParse->p
24350 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
24360 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
24370 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
24380 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f   pParse->pWithTo
24390 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20  Free = pWith;.  
243a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
243b0 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
243c0 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
243d0 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
243e0 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
243f0 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
24400 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
24410 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
24420 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
24430 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
24440 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
24450 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
24460 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
24470 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
24480 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
24490 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
244a0 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
244b0 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
244c0 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
244d0 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
244e0 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
244f0 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
24500 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
24510 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
24520 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
24530 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
24540 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
24550 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
24560 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
24570 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
24580 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
24590 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
245a0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
245b0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
245c0 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
245d0 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
245e0 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
245f0 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
24600 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
24610 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
24620 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
24630 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
24640 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
24650 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
24660 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
24670 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
24680 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
24690 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
246a0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
246b0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
246c0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
246d0 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20  b;.  struct Cte 
246e0 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20  *pCte;          
246f0 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20       /* Matched 
24700 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20  CTE (or NULL if 
24710 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57  no match) */.  W
24720 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20  ith *pWith;     
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24740 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68  * WITH clause th
24750 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20  at pCte belongs 
24760 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
24770 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
24780 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
24790 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
247a0 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70  pWith, pFrom, &p
247b0 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74  With);.  if( pCt
247c0 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  e ){.    Table *
247d0 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69  pTab;.    ExprLi
247e0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
247f0 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
24800 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24820 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
24830 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
24840 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63  .    int bMayRec
24850 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
24860 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
24870 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79  mpound joined by
24880 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a   UNION [ALL] */.
24890 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64      With *pSaved
248a0 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
248b0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
248c0 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57  ue of pParse->pW
248d0 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ith */..    /* I
248e0 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  f pCte->zCteErr 
248f0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74  is non-NULL at t
24900 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
24910 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67  this is an illeg
24920 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73  al.    ** recurs
24930 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ive reference to
24940 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65   CTE pCte. Leave
24950 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
24960 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  rse and return. 
24970 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20     ** early. If 
24980 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
24990 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
249a0 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
249b0 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20  ive reference.. 
249c0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
249d0 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f  se, proceed.  */
249e0 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a  .    if( pCte->z
249f0 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20  CteErr ){.      
24a00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24a10 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43  pParse, pCte->zC
24a20 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61  teErr, pCte->zNa
24a30 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
24a40 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
24a50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61      }.    if( ca
24a60 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70  nnotBeFunction(p
24a70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20  Parse, pFrom) ) 
24a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24a90 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ROR;..    assert
24aa0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
24ab0 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70   );.    pFrom->p
24ac0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
24ad0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
24ae0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
24af0 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  e));.    if( pTa
24b00 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
24b10 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61  C_Abort;.    pTa
24b20 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
24b30 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
24b40 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
24b50 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  p(db, pCte->zNam
24b60 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  e);.    pTab->iP
24b70 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54  Key = -1;.    pT
24b80 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
24b90 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
24ba0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
24bb0 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
24bc0 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
24bd0 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20  |= TF_Ephemeral 
24be0 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f  | TF_NoVisibleRo
24bf0 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  wid;.    pFrom->
24c00 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
24c10 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
24c20 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Cte->pSelect, 0)
24c30 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
24c40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
24c50 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
24c60 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
24c70 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
24c80 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  t );..    /* Che
24c90 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ck if this is a 
24ca0 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a  recursive CTE. *
24cb0 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72  /.    pSel = pFr
24cc0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
24cd0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d   bMayRecursive =
24ce0 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f   ( pSel->op==TK_
24cf0 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d  ALL || pSel->op=
24d00 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
24d10 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
24d20 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ve ){.      int 
24d30 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74  i;.      SrcList
24d40 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e   *pSrc = pFrom->
24d50 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
24d60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24d70 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
24d80 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
24d90 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24da0 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Item = &pSrc->a[
24db0 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
24dc0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
24dd0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
24de0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
24df0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d   .         && 0=
24e00 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
24e10 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43  pItem->zName, pC
24e20 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20  te->zName).     
24e30 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
24e40 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20    pItem->pTab = 
24e50 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
24e60 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pItem->fg.isRecu
24e70 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20  rsive = 1;.     
24e80 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
24e90 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
24ea0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSel->selFlags |
24eb0 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a  = SF_Recursive;.
24ec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24ed0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
24ee0 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69  Only one recursi
24ef0 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ve reference is 
24f00 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20  permitted. */ . 
24f10 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61     if( pTab->nTa
24f20 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20  bRef>2 ){.      
24f30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24f40 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
24f50 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66  e, "multiple ref
24f60 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72  erences to recur
24f70 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c  sive table: %s",
24f80 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pCte->zName.   
24f90 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75     );.      retu
24fa0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
24fb0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
24fc0 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  t( pTab->nTabRef
24fd0 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73  ==1 || ((pSel->s
24fe0 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
24ff0 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
25000 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20  TabRef==2 ));.. 
25010 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
25020 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
25030 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
25040 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
25050 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
25060 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25070 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
25080 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
25090 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
250a0 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50  Prior = pSel->pP
250b0 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65  rior;.      asse
250c0 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74  rt( pPrior->pWit
250d0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
250e0 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53  rior->pWith = pS
250f0 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20  el->pWith;.     
25100 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
25110 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69  ct(pWalker, pPri
25120 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  or);.      pPrio
25130 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20  r->pWith = 0;.  
25140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
25150 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
25160 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
25170 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
25180 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
25190 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
251a0 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
251b0 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
251c0 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
251d0 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
251e0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
251f0 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
25200 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
25210 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
25220 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  !=pCte->pCols->n
25230 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
25240 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25250 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
25260 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20  s has %d values 
25270 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
25280 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74  .            pCt
25290 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74  e->zName, pEList
252a0 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70  ->nExpr, pCte->p
252b0 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20  Cols->nExpr.    
252c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
252d0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
252e0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20  SavedWith;.     
252f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25300 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
25310 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
25320 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20  Cte->pCols;.    
25330 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  }..    sqlite3Co
25340 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
25350 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
25360 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
25370 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
25380 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
25390 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
253a0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
253b0 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
253c0 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
253d0 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70  CteErr = "multip
253e0 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  le recursive ref
253f0 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20  erences: %s";.  
25400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25410 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
25420 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65   = "recursive re
25430 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62  ference in a sub
25440 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20  query: %s";.    
25450 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
25460 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
25470 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
25480 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  }.    pCte->zCte
25490 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
254a0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
254b0 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
254c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
254d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
254e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
254f0 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
25500 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
25510 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
25520 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
25530 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
25540 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
25550 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
25560 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
25570 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
25580 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
25590 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
255a0 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
255b0 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
255c0 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
255d0 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
255e0 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
255f0 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
25600 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
25610 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
25620 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
25630 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
25640 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
25650 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
25660 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
25670 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
25680 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
25690 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
256a0 57 69 74 68 20 26 26 20 70 2d 3e 70 50 72 69 6f  With && p->pPrio
256b0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68  r==0 ){.    With
256c0 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69   *pWith = findRi
256d0 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
256e0 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74 68  h;.    if( pWith
256f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
25700 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
25710 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th==pWith );.   
25720 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
25730 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72   = pWith->pOuter
25740 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
25750 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65  lse.#define sele
25760 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64  ctPopWith 0.#end
25770 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
25780 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
25790 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
257a0 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
257b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
257c0 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
257d0 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
257e0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
257f0 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
25800 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
25810 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
25820 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
25830 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
25840 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
25850 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
25860 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
25870 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
25880 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
25890 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
258a0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
258b0 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
258c0 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
258d0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
258e0 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
258f0 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
25900 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
25910 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
25920 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
25930 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
25940 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
25950 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
25960 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
25970 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
25980 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
25990 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
259a0 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
259b0 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
259c0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
259d0 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
259e0 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
259f0 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74  g up the persist
25a00 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
25a10 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
25a20 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
25a30 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
25a40 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
25a50 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d  clause to accomm
25a60 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
25a70 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
25a80 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
25a90 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
25aa0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
25ab0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
25ac0 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
25ad0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
25ae0 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
25af0 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
25b00 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
25b10 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
25b20 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
25b30 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
25b40 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
25b50 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
25b60 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
25b70 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
25b80 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
25b90 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
25ba0 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
25bb0 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
25bc0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
25bd0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
25be0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
25bf0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
25c00 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
25c10 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
25c20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
25c30 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
25c40 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
25c50 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
25c60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
25c70 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
25c80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
25c90 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52  .  Expr *pE, *pR
25ca0 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20  ight, *pExpr;.  
25cb0 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70  u16 selFlags = p
25cc0 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70  ->selFlags;..  p
25cd0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
25ce0 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28  _Expanded;.  if(
25cf0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25d00 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
25d10 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
25d20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
25d30 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46  Src==0) || (selF
25d40 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
25d50 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
25d60 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
25d70 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
25d80 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
25d90 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
25da0 20 20 69 66 28 20 70 2d 3e 70 57 69 74 68 20 29    if( p->pWith )
25db0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74  {.    sqlite3Wit
25dc0 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d  hPush(pParse, p-
25dd0 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a  >pWith, 0);.  }.
25de0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
25df0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
25e00 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
25e10 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
25e20 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
25e30 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
25e40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25e50 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
25e60 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
25e70 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
25e80 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
25e90 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
25ea0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
25eb0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
25ec0 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
25ed0 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
25ee0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
25ef0 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
25f00 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
25f10 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
25f20 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
25f30 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
25f40 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
25f50 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
25f60 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
25f70 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
25f80 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
25f90 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
25fa0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
25fb0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
25fc0 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
25fd0 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72  ursive==0 || pFr
25fe0 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20  om->pTab!=0 );. 
25ff0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67     if( pFrom->fg
26000 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63  .isRecursive ) c
26010 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
26020 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
26030 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
26040 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
26050 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e     if( withExpan
26060 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  d(pWalker, pFrom
26070 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
26080 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46  bort;.    if( pF
26090 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65  rom->pTab ) {} e
260a0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
260b0 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
260c0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
260d0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
260e0 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
260f0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
26100 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
26110 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
26120 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
26130 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
26140 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
26150 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
26160 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
26170 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b==0 );.      if
26180 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c  ( sqlite3WalkSel
26190 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
261a0 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  l) ) return WRC_
261b0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72  Abort;.      pFr
261c0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
261d0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
261e0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
261f0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
26200 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
26210 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26220 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
26230 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
26240 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
26250 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
26260 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20  "sqlite_sq_%p", 
26270 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
26280 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
26290 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
262a0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
262b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  }.      sqlite3C
262c0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
262d0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
262e0 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
262f0 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
26300 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
26310 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
26320 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
26330 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
26340 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
26350 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
26360 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
26370 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
26380 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
26390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
263a0 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
263b0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
263c0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
263d0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
263e0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
263f0 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
26400 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
26410 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
26420 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
26430 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
26440 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
26450 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26460 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
26470 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20  nTabRef>=0xffff 
26480 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26490 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
264a0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
264b0 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
264c0 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
264d0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
264e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
264f0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
26500 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
26510 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26520 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
26530 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
26540 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
26550 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65  Tab) && cannotBe
26560 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
26570 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
26580 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
26590 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ort;.      }.#if
265a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
265b0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
265c0 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
265d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
265e0 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  E).      if( IsV
265f0 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20  irtual(pTab) || 
26600 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
26610 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f  .        i16 nCo
26620 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  l;.        if( s
26630 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
26640 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
26650 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
26660 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26670 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26680 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
26690 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
266a0 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
266b0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
266c0 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
266d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
266e0 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46  SelectSetName(pF
266f0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54  rom->pSelect, pT
26700 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
26710 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d      nCol = pTab-
26720 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
26730 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  Tab->nCol = -1;.
26740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
26750 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
26760 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
26770 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  t);.        pTab
26780 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
26790 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
267a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
267b0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
267c0 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
267d0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
267e0 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
267f0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
26800 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
26810 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
26820 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26830 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26840 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
26850 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
26860 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
26870 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
26880 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
26890 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
268a0 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
268b0 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
268c0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
268d0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
268e0 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
268f0 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
26900 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
26910 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
26920 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
26930 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
26940 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
26950 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
26960 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
26970 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
26980 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
26990 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
269a0 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
269b0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
269c0 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f  ASTERISK operato
269d0 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
269e0 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
269f0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  the column.  ** 
26a00 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  list.  The follo
26a10 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
26a20 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
26a30 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a   TK_ASTERISK.  *
26a40 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  * expressions an
26a50 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e  d expand each on
26a60 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
26a70 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a   all columns in.
26a80 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e    ** all tables.
26a90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
26aa0 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
26ab0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
26ac0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
26ad0 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
26ae0 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
26af0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
26b00 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
26b10 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
26b20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
26b30 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
26b40 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ( pE->op==TK_AST
26b50 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
26b60 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
26b70 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
26b80 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
26b90 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
26ba0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
26bb0 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
26bc0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
26bd0 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
26be0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
26bf0 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
26c00 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
26c10 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
26c20 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
26c30 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
26c40 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
26c50 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
26c60 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
26c70 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
26c80 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
26c90 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
26ca0 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
26cb0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
26cc0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
26cd0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
26ce0 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
26cf0 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
26d00 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
26d10 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
26d20 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
26d30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
26d40 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
26d50 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
26d60 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
26d70 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
26d80 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
26d90 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26db0 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
26dc0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
26dd0 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
26de0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
26df0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
26e00 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70       pE = a[k].p
26e10 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67  Expr;.      pRig
26e20 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
26e30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26e40 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
26e50 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
26e60 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
26e70 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
26e80 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
26e90 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
26ea0 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
26eb0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
26ec0 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
26ed0 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
26ee0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
26ef0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
26f00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26f10 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
26f20 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
26f30 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
26f40 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
26f50 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
26f60 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
26f70 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
26f80 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
26f90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          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 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
26fc0 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
26fd0 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
26fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
26ff0 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
27000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
27010 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
27020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27030 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
27040 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
27050 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
27060 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
27070 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
27080 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
27090 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
270a0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
270b0 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
270c0 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
270d0 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
270e0 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
270f0 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
27100 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
27110 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
27120 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
27130 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
27140 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
27150 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
27160 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
27170 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
27180 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
27190 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
271a0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
271b0 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
271c0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
271d0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
271e0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
271f0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
27200 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
27210 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
27220 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
27230 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
27240 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
27250 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
27260 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
27270 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
27280 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
27290 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
272a0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
272b0 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
272c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
272d0 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
272e0 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
272f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27300 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
27310 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
27320 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
27330 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
27340 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
27350 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
27360 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
27370 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27380 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
27390 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
273a0 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
273b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
273c0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
273d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
273e0 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
273f0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
27400 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
27410 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
27420 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
27430 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
27440 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
27450 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
27460 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
27470 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
27480 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
27490 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
274a0 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
274b0 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
274c0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
274d0 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
274e0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
274f0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
27500 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
27510 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
27520 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
27530 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
27540 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
27550 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
27560 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
27570 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
27580 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
27590 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
275a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
275b0 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
275d0 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
275e0 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
275f0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
27600 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
27610 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
27630 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27640 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
27650 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
27660 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
27670 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
27680 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
27690 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
276a0 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
276b0 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
276c0 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
276d0 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
276e0 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
276f0 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
27700 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
27710 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
27720 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
27730 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
27740 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
27750 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
27760 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
27770 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
27780 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
27790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
277a0 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
277b0 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
277c0 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
277d0 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
277e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
277f0 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
27800 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
27810 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
27820 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
27830 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
27840 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
27850 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
27860 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
27870 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
27880 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
27890 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
278a0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
278b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
278c0 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
278d0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27910 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
27920 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
27930 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
27940 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
27950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27960 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
27970 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
27980 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
27990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
279a0 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
279b0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
279c0 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
279d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
279e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
279f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27a00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27a10 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
27a20 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
27a30 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
27a40 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
27a50 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
27a60 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
27a70 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
27a80 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
27a90 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
27aa0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
27ab0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
27ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
27ad0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
27ae0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
27af0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
27b00 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
27b10 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
27b20 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
27b30 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
27b40 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
27b50 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
27b60 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
27b70 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
27b80 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
27b90 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
27ba0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
27bb0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
27bc0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
27bd0 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
27be0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27bf0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
27c00 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
27c10 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
27c20 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
27c30 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
27c40 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
27c50 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
27c60 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
27c70 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
27c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27c90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27ca0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
27cb0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
27cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27cd0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
27ce0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
27cf0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
27d00 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
27d10 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
27d20 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
27d30 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
27d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27d50 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
27d60 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
27d70 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
27d80 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
27d90 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
27da0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
27db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27dc0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
27dd0 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
27de0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
27df0 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
27e00 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
27e10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27e20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
27e30 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
27e40 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
27e50 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
27e70 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
27e80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
27e90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
27eb0 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
27ec0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
27ed0 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f00 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
27f10 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
27f20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27f30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
27f40 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
27f50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27f60 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
27f70 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
27f80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27f90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27fa0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
27fb0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
27fc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
27fd0 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
27fe0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
27ff0 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
28000 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28010 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28020 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
28030 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
28040 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
28050 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28060 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28070 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
28080 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
28090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
280a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
280b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
280c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
280d0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
280e0 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
280f0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
28100 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
28110 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
28120 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
28130 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
28140 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
28150 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28160 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
28170 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
28180 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
28190 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
281a0 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rt;.  }.#endif. 
281b0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
281c0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
281d0 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
281e0 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
281f0 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
28200 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
28210 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
28220 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
28230 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
28240 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
28250 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
28260 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
28270 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
28280 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
28290 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
282a0 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
282b0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
282c0 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
282d0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
282e0 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
282f0 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
28300 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
28310 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
28320 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
28330 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
28340 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
28350 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
28360 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
28370 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
28380 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
28390 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
283a0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
283b0 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
283c0 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
283d0 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
283e0 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
283f0 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
28400 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
28410 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
28420 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
28430 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
28440 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
28450 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
28460 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
28470 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
28480 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
28490 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
284a0 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
284b0 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
284c0 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
284d0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
284e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
284f0 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
28500 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
28510 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
28520 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
28530 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
28540 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
28550 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
28560 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
28570 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
28580 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
28590 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
285a0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
285b0 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
285c0 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
285d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
285e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
285f0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
28600 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
28610 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
28620 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
28630 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
28640 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
28650 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
28660 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
28670 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
28680 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70   pParse;.  if( p
28690 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
286a0 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  nd ){.    w.xSel
286b0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
286c0 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
286d0 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
286e0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
286f0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
28700 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
28710 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
28720 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77  ectExpander;.  w
28730 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
28740 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74  2 = selectPopWit
28750 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  h;.  sqlite3Walk
28760 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
28770 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
28780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
28790 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
287a0 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
287b0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
287c0 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
287d0 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
287e0 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
287f0 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
28800 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
28810 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
28820 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
28830 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
28840 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
28850 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
28860 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
28870 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
28880 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
28890 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
288a0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
288b0 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
288c0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
288d0 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
288e0 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
288f0 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
28900 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
28910 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
28920 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
28930 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
28940 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
28950 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
28960 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
28970 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
28980 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
28990 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
289a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
289b0 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
289c0 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
289d0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
289e0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
289f0 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
28a00 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
28a10 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
28a20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
28a30 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
28a40 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
28a50 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73 73  esolved );.  ass
28a60 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
28a70 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
28a80 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  fo)==0 );.  p->s
28a90 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
28aa0 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61  sTypeInfo;.  pPa
28ab0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
28ac0 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73  Parse;.  pTabLis
28ad0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  t = p->pSrc;.  f
28ae0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
28af0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
28b00 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
28b10 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
28b20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
28b30 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  rom->pTab;.    a
28b40 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
28b50 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
28b60 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
28b70 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a  phemeral)!=0 ){.
28b80 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
28b90 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
28ba0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
28bb0 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  ECT */.      Sel
28bc0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
28bd0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
28be0 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
28bf0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
28c00 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
28c10 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
28c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28c30 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
28c40 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
28c50 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
28c60 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
28c70 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
28c80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28c90 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79  tine adds dataty
28ca0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  pe and collating
28cb0 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d   sequence inform
28cc0 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  ation to.** the 
28cd0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73  Table structures
28ce0 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   of all FROM-cla
28cf0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69  use subqueries i
28d00 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  n a.** SELECT st
28d10 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55  atement..**.** U
28d20 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
28d30 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
28d40 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
28d50 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
28d60 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50  ectAddTypeInfo(P
28d70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
28d80 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
28d90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28da0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57  MIT_SUBQUERY.  W
28db0 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
28dc0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
28dd0 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  w));.  w.xSelect
28de0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
28df0 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
28e00 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
28e10 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
28e20 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
28e30 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
28e40 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
28e50 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
28e60 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lect);.#endif.}.
28e70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28e80 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53  tine sets up a S
28e90 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
28ea0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  for processing. 
28eb0 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
28ec0 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
28ed0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  d:.**.**     *  
28ee0 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62  VDBE Cursor numb
28ef0 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64  ers are assigned
28f00 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   to all FROM-cla
28f10 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  use terms..**   
28f20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54    *  Ephemeral T
28f30 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65  able objects are
28f40 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
28f50 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
28f60 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20  queries..**     
28f70 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  *  ON and USING 
28f80 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66  clauses are shif
28f90 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73  ted into WHERE s
28fa0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20  tatements.**    
28fb0 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a   *  Wildcards "*
28fc0 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20  " and "TABLE.*" 
28fd0 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61  in result sets a
28fe0 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20  re expanded..** 
28ff0 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65      *  Identifie
29000 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  rs in expression
29010 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20   are matched to 
29020 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
29030 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
29040 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61  recursively on a
29050 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69  ll subqueries wi
29060 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e  thin the SELECT.
29070 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
29080 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61  SelectPrep(.  Pa
29090 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
290a0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
290b0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
290c0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
290d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
290e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
290f0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
29100 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
29110 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
29120 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74  context for cont
29130 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ainer */.){.  sq
29140 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
29150 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
29160 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50  eturn;.  db = pP
29170 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
29180 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29190 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
291a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
291b0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
291c0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
291d0 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
291e0 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
291f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
29200 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29210 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
29220 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
29230 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
29240 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
29250 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
29260 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
29270 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
29280 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
29290 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
292a0 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
292b0 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
292c0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
292d0 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
292e0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
292f0 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
29300 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
29310 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
29320 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
29330 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
29340 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
29350 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
29360 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
29370 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
29380 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
29390 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
293a0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
293b0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
293c0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
293d0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
293e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
293f0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
29400 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
29410 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
29420 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70  ;.  int nReg = p
29430 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b  AggInfo->nFunc +
29440 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75   pAggInfo->nColu
29450 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  mn;.  if( nReg==
29460 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
29470 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29480 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
29490 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67   all AggInfo reg
294a0 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69  isters are withi
294b0 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63  n the range spec
294c0 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67  ified by.  ** Ag
294d0 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67  gInfo.mnReg..Agg
294e0 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20  Info.mxReg */.  
294f0 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41  assert( nReg==pA
29500 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41  ggInfo->mxReg-pA
29510 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20  ggInfo->mnReg+1 
29520 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
29530 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
29540 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  n; i++){.    ass
29550 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
29560 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  Col[i].iMem>=pAg
29570 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
29580 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
29590 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c  o->aCol[i].iMem<
295a0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
295b0 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   );.  }.  for(i=
295c0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
295d0 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
295e0 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
295f0 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e  ->aFunc[i].iMem>
29600 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
29610 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && 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 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
29640 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e  mxReg );.  }.#en
29650 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dif.  sqlite3Vdb
29660 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
29670 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
29680 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f  >mnReg, pAggInfo
29690 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28  ->mxReg);.  for(
296a0 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
296b0 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
296c0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
296d0 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
296e0 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
296f0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
29700 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
29710 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
29720 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
29730 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
29740 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
29750 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
29760 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
29770 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
29780 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
29790 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
297a0 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
297b0 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
297c0 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
297d0 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
297e0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
297f0 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
29800 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
29810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
29820 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
29830 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
29840 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
29850 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29  ->x.pList, 0, 0)
29860 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29870 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
29880 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
29890 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
298a0 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
298b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298c0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
298d0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
298e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
298f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
29900 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
29910 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
29920 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
29930 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
29940 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
29950 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
29960 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
29970 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
29980 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
29990 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
299a0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
299b0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
299c0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
299d0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
299e0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
299f0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
29a00 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
29a10 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
29a20 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
29a30 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
29a40 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
29a50 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29a60 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
29a70 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
29a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29a90 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op2(v, OP_AggFin
29aa0 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
29ab0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
29ac0 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c  pr : 0);.    sql
29ad0 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
29ae0 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50  (v, pF->pFunc, P
29af0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
29b00 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
29b10 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
29b20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
29b30 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
29b40 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
29b50 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
29b60 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
29b70 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
29b80 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
29b90 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
29ba0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
29bb0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
29bc0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
29bd0 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
29be0 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
29bf0 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
29c00 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
29c10 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
29c20 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
29c30 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
29c40 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
29c50 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
29c60 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
29c70 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
29c80 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
29c90 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
29ca0 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
29cb0 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
29cc0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
29cd0 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
29ce0 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
29cf0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
29d00 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
29d10 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
29d20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
29d30 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
29d40 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
29d50 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
29d60 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
29d70 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
29d80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
29d90 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
29da0 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
29db0 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  , 0, SQLITE_ECEL
29dc0 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
29dd0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
29de0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
29df0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
29e00 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
29e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
29e20 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
29e30 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29e40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29e50 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45  nArg==0 );  /* E
29e60 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
29e70 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
29e80 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a  ( nArg>1 );   /*
29e90 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a   Also an error *
29ea0 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  /.      codeDist
29eb0 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
29ec0 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
29ed0 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
29ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29ef0 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
29f00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
29f10 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
29f20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
29f30 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
29f40 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
29f50 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
29f60 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
29f70 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
29f80 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
29f90 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
29fa0 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
29fb0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
29fc0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
29fd0 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
29fe0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
29ff0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2a000 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2a010 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
2a020 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
2a030 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2a040 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
2a050 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
2a060 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2a070 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
2a080 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
2a090 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
2a0a0 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
2a0b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2a0c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a0d0 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
2a0e0 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
2a0f0 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
2a100 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
2a110 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
2a120 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
2a130 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67  gStep0, 0, regAg
2a140 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20  g, pF->iMem);.  
2a150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2a160 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2a170 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2a180 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a190 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
2a1a0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
2a1b0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
2a1c0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
2a1d0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
2a1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2a1f0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2a200 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2a210 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
2a220 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
2a230 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2a240 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
2a250 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2a260 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2a270 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
2a280 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
2a290 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61  populating the a
2a2a0 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
2a2b0 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ters, clear the 
2a2c0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
2a2d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
2a2e0 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75   any of the requ
2a2f0 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ired column valu
2a300 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  es are already p
2a310 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20  resent .  ** in 
2a320 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74  registers, sqlit
2a330 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79  e3ExprCode() may
2a340 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f   use OP_SCopy to
2a350 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a   copy the value.
2a360 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d    ** to pC->iMem
2a370 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d  . But by the tim
2a380 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75  e the value is u
2a390 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  sed, the origina
2a3a0 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20  l register.  ** 
2a3b0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73  may have been us
2a3c0 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ed, invalidating
2a3d0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2a3e0 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74  buffer holding t
2a3f0 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20  he.  ** text or 
2a400 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20  blob value. See 
2a410 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63  ticket [883034dc
2a420 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  b5]..  **.  ** A
2a430 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20  nother solution 
2a440 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e  would be to chan
2a450 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20  ge the OP_SCopy 
2a460 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63  used to copy cac
2a470 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  hed.  ** values 
2a480 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20  to an OP_Copy.. 
2a490 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74   */.  if( regHit
2a4a0 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54   ){.    addrHitT
2a4b0 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
2a4c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2a4d0 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43  , regHit); VdbeC
2a4e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
2a4f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2a500 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2a510 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
2a520 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
2a530 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
2a540 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
2a550 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
2a560 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2a570 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
2a580 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
2a590 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
2a5a0 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
2a5b0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2a5c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
2a5d0 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
2a5e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2a5f0 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
2a600 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
2a610 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
2a620 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
2a630 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
2a640 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
2a650 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
2a660 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
2a670 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2a680 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
2a690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2a6a0 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
2a6b0 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
2a6c0 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
2a6d0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2a6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2a6f0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
2a700 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a720 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
2a730 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
2a740 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
2a750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a760 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
2a770 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
2a780 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
2a790 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
2a7a0 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f  2 ){.    int bCo
2a7b0 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26  ver = (pIdx!=0 &
2a7c0 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
2a7d0 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
2a7e0 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b  eyIndex(pIdx)));
2a7f0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20  .    char *zEqp 
2a800 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
2a810 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43  (pParse->db, "SC
2a820 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22  AN TABLE %s%s%s"
2a830 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
2a840 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62  zName,.        b
2a850 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20  Cover ? " USING 
2a860 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22  COVERING INDEX "
2a870 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62   : "",.        b
2a880 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e  Cover ? pIdx->zN
2a890 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a  ame : "".    );.
2a8a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a8b0 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70  ddOp4(.        p
2a8c0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
2a8d0 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
2a8e0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
2a8f0 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41  0, zEqp, P4_DYNA
2a900 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  MIC.    );.  }.}
2a910 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2a920 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
2a930 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
2a940 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2a950 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
2a960 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
2a970 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
2a980 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
2a990 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
2a9a0 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
2a9b0 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
2a9c0 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
2a9d0 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
2a9e0 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
2a9f0 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
2aa00 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
2aa10 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2aa20 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
2aa30 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
2aa40 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
2aa50 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
2aa60 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
2aa70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2aa80 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
2aa90 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2aaa0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2aab0 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
2aac0 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
2aad0 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
2aae0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
2aaf0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
2ab00 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
2ab10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
2ab20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2ab30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2ab40 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2ab50 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
2ab60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ab70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2ab80 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
2ab90 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
2aba0 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
2abb0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
2abc0 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
2abd0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
2abe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2abf0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2ac00 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
2ac10 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
2ac20 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
2ac30 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
2ac40 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
2ac50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2ac60 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
2ac70 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
2ac80 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
2ac90 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
2aca0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
2acb0 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
2acc0 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
2acd0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
2ace0 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  = 0;  /* List of
2acf0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
2ad00 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
2ad10 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
2ad20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
2ad30 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
2ad40 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
2ad50 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
2ad60 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2ad70 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2ad80 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2ad90 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
2ada0 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
2adb0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
2adc0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
2add0 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
2ade0 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
2adf0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2ae00 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2ae20 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
2ae30 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
2ae40 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
2ae50 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
2ae60 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
2ae70 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
2ae80 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53  T keyword */.  S
2ae90 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20  ortCtx sSort;   
2aea0 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e        /* Info on
2aeb0 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
2aec0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2aed0 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
2aee0 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
2aef0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
2af00 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
2af10 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
2af20 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
2af30 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2af40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
2af50 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
2af60 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2af70 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2af80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
2af90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2afa0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
2afb0 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  t iRestoreSelect
2afc0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
2afd0 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65  lectId;.  pParse
2afe0 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50  ->iSelectId = pP
2aff0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2b000 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  tId++;.#endif.. 
2b010 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2b020 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
2b030 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b040 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
2b050 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2b060 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2b070 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2b080 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
2b090 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
2b0a0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
2b0b0 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
2b0c0 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
2b0d0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2b0e0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61  CE_ENABLED.  pPa
2b0f0 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
2b100 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52  nt++;.  SELECTTR
2b110 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20  ACE(1,pParse,p, 
2b120 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69  ("begin processi
2b130 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20  ng:\n"));.  if( 
2b140 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2b150 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2b160 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2b170 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2b180 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2b190 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2b1a0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2b1b0 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
2b1c0 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
2b1d0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2b1e0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2b1f0 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  !=SRT_Fifo );.  
2b200 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2b210 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2b220 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
2b230 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72  Queue );.  asser
2b240 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
2b250 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
2b260 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a  t!=SRT_Queue );.
2b270 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
2b280 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
2b290 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
2b2a0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
2b2b0 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
2b2c0 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
2b2d0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
2b2e0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2b2f0 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
2b300 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2b310 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20  card ||.        
2b320 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
2b330 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70  =SRT_Queue  || p
2b340 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2b350 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20  _DistFifo ||.   
2b360 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2b370 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
2b380 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  eue || pDest->eD
2b390 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a  est==SRT_Fifo);.
2b3a0 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
2b3b0 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
2b3c0 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
2b3d0 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
2b3e0 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
2b3f0 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
2b400 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
2b410 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
2b420 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2b430 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
2b440 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
2b450 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
2b460 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
2b470 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
2b480 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
2b490 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d  arse, p, 0);.  m
2b4a0 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c  emset(&sSort, 0,
2b4b0 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b   sizeof(sSort));
2b4c0 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  .  sSort.pOrderB
2b4d0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2b4e0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2b4f0 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61  >pSrc;.  if( pPa
2b500 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
2b510 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
2b520 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
2b530 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _end;.  }.  asse
2b540 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
2b550 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70   );.  isAgg = (p
2b560 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2b570 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23  Aggregate)!=0;.#
2b580 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2b590 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2b5a0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2b5b0 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53  & 0x100 ){.    S
2b5c0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
2b5d0 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74  ,pParse,p, ("aft
2b5e0 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
2b5f0 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
2b600 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2b610 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2b620 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54  }.#endif..  /* T
2b630 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ry to flatten su
2b640 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
2b650 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69  FROM clause up i
2b660 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65  nto the main que
2b670 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  ry.  */.#if !def
2b680 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2b690 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
2b6a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2b6b0 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
2b6c0 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
2b6d0 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
2b6e0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2b6f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b700 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2b710 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2b720 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2b730 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2b740 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
2b750 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2b760 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
2b770 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2b780 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2b790 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74   /* Catch mismat
2b7a0 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72  ch in the declar
2b7b0 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20  ed columns of a 
2b7c0 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d  view and the num
2b7d0 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f  ber of.    ** co
2b7e0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  lumns in the SEL
2b7f0 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a  ECT on the RHS *
2b800 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  /.    if( pTab->
2b810 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69  nCol!=pSub->pELi
2b820 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
2b830 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b840 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65  sg(pParse, "expe
2b850 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
2b860 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74  for '%s' but got
2b870 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
2b880 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
2b890 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e  ->nCol, pTab->zN
2b8a0 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ame, pSub->pELis
2b8b0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
2b8c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2b8d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 41  ;.    }..    isA
2b8e0 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
2b8f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2b900 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
2b910 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
2b920 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
2b930 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
2b940 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
2b950 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
2b960 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
2b970 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
2b980 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
2b990 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
2b9a0 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
2b9b0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2b9c0 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
2b9d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
2b9e0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
2b9f0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2ba00 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  c;.    if( db->m
2ba10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2ba20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2ba30 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
2ba40 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2ba50 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  ){.      sSort.p
2ba60 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2ba70 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
2ba80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
2ba90 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20  t a pointer the 
2baa0 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
2bab0 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ruction, allocat
2bac0 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69  ing a new VDBE i
2bad0 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20  f one.  ** does 
2bae0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
2baf0 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  t */.  v = sqlit
2bb00 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2bb10 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
2bb20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2bb30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2bb40 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2bb50 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
2bb60 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
2bb70 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
2bb80 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
2bb90 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
2bba0 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
2bbb0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2bbc0 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2bbd0 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2bbe0 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2bbf0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2bc00 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2bc10 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2bc20 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2bc30 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2bc40 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2bc50 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2bc60 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2bc70 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2bc80 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
2bc90 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
2bca0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2bcb0 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2bcc0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
2bcd0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
2bce0 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
2bcf0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
2bd00 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2bd10 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2bd20 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2bd30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2bd40 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  W).  for(i=0; i<
2bd50 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2bd60 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2bd70 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2bd80 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2bd90 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2bda0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
2bdb0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
2bdc0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
2bdd0 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2bde0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2bdf0 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68   /* Sometimes th
2be00 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62  e code for a sub
2be10 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65  query will be ge
2be20 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61  nerated more tha
2be30 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69  n.    ** once, i
2be40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2be50 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48  s part of the WH
2be60 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ERE clause in a 
2be70 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a  LEFT JOIN,.    *
2be80 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  * for example.  
2be90 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f  In that case, do
2bea0 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20   not regenerate 
2beb0 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69  the code to mani
2bec0 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69  fest.    ** a vi
2bed0 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75  ew or the co-rou
2bee0 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tine to implemen
2bef0 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66  t a view.  The f
2bf00 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20  irst instance.  
2bf10 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65    ** is sufficie
2bf20 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73  nt, though the s
2bf30 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e  ubroutine to man
2bf40 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64  ifest the view d
2bf50 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  oes need.    ** 
2bf60 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67  to be invoked ag
2bf70 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2bf80 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2bf90 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ub ){.      if( 
2bfa0 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
2bfb0 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  outine==0 ){.   
2bfc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bfd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2bfe0 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ub, pItem->regRe
2bff0 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64  turn, pItem->add
2c000 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20  rFillSub);.     
2c010 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
2c020 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
2c030 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
2c040 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
2c050 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
2c060 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
2c070 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
2c080 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  erred to by this
2c090 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
2c0a0 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
2c0b0 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
2c0c0 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
2c0d0 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
2c0e0 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
2c0f0 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
2c100 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
2c110 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
2c120 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
2c130 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
2c140 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
2c150 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
2c160 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
2c170 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
2c180 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
2c190 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
2c1a0 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
2c1b0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
2c1c0 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f  ..    /* Make co
2c1d0 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74  pies of constant
2c1e0 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65   WHERE-clause te
2c1f0 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  rms in the outer
2c200 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20   query down.    
2c210 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75  ** inside the su
2c220 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61  bquery.  This ca
2c230 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75  n help the subqu
2c240 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20  ery to run more 
2c250 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20  efficiently..   
2c260 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
2c270 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
2c280 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20  & JT_OUTER)==0. 
2c290 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57      && pushDownW
2c2a0 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65  hereTerms(pParse
2c2b0 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72  , pSub, p->pWher
2c2c0 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
2c2d0 72 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45  r).    ){.#if SE
2c2e0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2c2f0 44 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  D.      if( sqli
2c300 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2c310 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
2c320 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2c330 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  100,pParse,p,("A
2c340 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73  fter WHERE-claus
2c350 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29  e push-down:\n")
2c360 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c370 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2c380 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
2c390 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2c3a0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
2c3b0 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
2c3c0 6e 74 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  nt the subquery.
2c3d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2c3e0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 69 6d  e subquery is im
2c3f0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63  plemented as a c
2c400 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 61 6c 6c  o-routine if all
2c410 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 74 72   of these are tr
2c420 75 65 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  ue:.    **   (1)
2c430 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
2c440 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2c450 62 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  be the outer loo
2c460 70 20 28 73 6f 20 74 68 61 74 20 69 74 0a 20 20  p (so that it.  
2c470 20 20 2a 2a 20 20 20 20 20 20 20 20 64 6f 65 73    **        does
2c480 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2c490 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20 74 68  computed more th
2c4a0 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 20  an once).    ** 
2c4b0 20 20 28 32 29 20 20 54 68 65 20 41 4c 4c 20 6b    (2)  The ALL k
2c4c0 65 79 77 6f 72 64 20 61 66 74 65 72 20 53 45 4c  eyword after SEL
2c4d0 45 43 54 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  ECT is omitted. 
2c4e0 20 28 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 61   (Applications a
2c4f0 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  re.    **       
2c500 20 61 6c 6c 6f 77 65 64 20 74 6f 20 73 61 79 20   allowed to say 
2c510 22 53 45 4c 45 43 54 20 41 4c 4c 22 20 69 6e 73  "SELECT ALL" ins
2c520 74 65 61 64 20 6f 66 20 6a 75 73 74 20 22 53 45  tead of just "SE
2c530 4c 45 43 54 22 20 74 6f 20 64 69 73 61 62 6c 65  LECT" to disable
2c540 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 74  .    **        t
2c550 68 65 20 75 73 65 20 6f 66 20 63 6f 2d 72 6f 75  he use of co-rou
2c560 74 69 6e 65 73 2e 29 0a 20 20 20 20 2a 2a 20 20  tines.).    **  
2c570 20 28 33 29 20 20 43 6f 2d 72 6f 75 74 69 6e 65   (3)  Co-routine
2c580 73 20 61 72 65 20 6e 6f 74 20 64 69 73 61 62 6c  s are not disabl
2c590 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2c5a0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a  _test_control().
2c5b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 77 69      **        wi
2c5c0 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
2c5d0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
2c5e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2c5f0 54 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20  TODO: Are there 
2c600 6f 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65  other reasons be
2c610 73 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20  side (1) to use 
2c620 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20  a co-routine.   
2c630 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
2c640 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on?.    */.    i
2c650 66 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20  f( i==0.     && 
2c660 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
2c670 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =1.            |
2c680 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  | (pTabList->a[1
2c690 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a  ].fg.jointype&(J
2c6a0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
2c6b0 29 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f  )!=0)  /* (1) */
2c6c0 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c  .     && (p->sel
2c6d0 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 29 3d  Flags & SF_All)=
2c6e0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
2c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c700 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
2c710 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
2c720 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
2c730 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74  QLITE_SubqCorout
2c740 69 6e 65 29 20 20 20 20 20 20 20 20 20 20 20 20  ine)            
2c750 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
2c760 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70   ){.      /* Imp
2c770 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74  lement a co-rout
2c780 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
2c790 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
2c7a0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
2c7b0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20        ** set on 
2c7c0 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  each invocation.
2c7d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c7e0 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71  int addrTop = sq
2c7f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2c800 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20  Addr(v)+1;.     
2c810 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2c820 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
2c830 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
2c840 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2c850 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
2c860 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2c870 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  n, 0, addrTop);.
2c880 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2c890 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65  t((v, "%s", pIte
2c8a0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2c8b0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
2c8c0 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64  ddrFillSub = add
2c8d0 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  rTop;.      sqli
2c8e0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
2c8f0 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72  t(&dest, SRT_Cor
2c900 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2c910 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2c920 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2c930 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63  er(pItem->iSelec
2c940 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d  tId, (u8)pParse-
2c950 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
2c960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
2c970 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
2c980 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
2c990 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
2c9a0 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d  owLogEst = pSub-
2c9b0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
2c9c0 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61     pItem->fg.via
2c9d0 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20  Coroutine = 1;. 
2c9e0 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2c9f0 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64  esult = dest.iSd
2ca00 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
2ca10 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
2ca20 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  e(v, pItem->regR
2ca30 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71  eturn);.      sq
2ca40 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2ca50 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b  e(v, addrTop-1);
2ca60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
2ca70 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
2ca80 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c  pParse);.    }el
2ca90 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  se{.      /* Gen
2caa0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
2cab0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c  ne that will fil
2cac0 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  l an ephemeral t
2cad0 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20  able with.      
2cae0 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
2caf0 66 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e  f this subquery.
2cb00 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
2cb10 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a  lSub will point.
2cb20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
2cb30 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67  address of the g
2cb40 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74  enerated subrout
2cb50 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67  ine.  pItem->reg
2cb60 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20  Return.      ** 
2cb70 69 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c  is a register al
2cb80 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20  located to hold 
2cb90 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
2cba0 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20  eturn address.  
2cbb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
2cbc0 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20   topAddr;.      
2cbd0 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30  int onceAddr = 0
2cbe0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41  ;.      int retA
2cbf0 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
2cc00 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  t( pItem->addrFi
2cc10 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20  llSub==0 );.    
2cc20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2cc30 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
2cc40 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64  Mem;.      topAd
2cc50 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2cc60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2cc70 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e  eger, 0, pItem->
2cc80 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2cc90 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
2cca0 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31  lSub = topAddr+1
2ccb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
2ccc0 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74  m->fg.isCorrelat
2ccd0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
2cce0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   /* If the subqu
2ccf0 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65  ery is not corre
2cd00 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
2cd10 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
2cd20 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
2cd30 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
2cd40 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
2cd50 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
2cd60 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
2cd70 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
2cd80 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
2cd90 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2cda0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
2cdb0 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
2cdc0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
2cdd0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  beComment((v, "m
2cde0 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
2cdf0 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
2ce00 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2ce10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56  }else{.        V
2ce20 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
2ce30 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2ce40 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2ce50 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2ce60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2ce70 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
2ce80 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
2ce90 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
2cea0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65  Cursor);.      e
2ceb0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2cec0 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
2ced0 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
2cee0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
2cef0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2cf00 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
2cf10 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
2cf20 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
2cf30 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
2cf40 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
2cf50 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
2cf60 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2cf70 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
2cf80 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
2cf90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2cfa0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2cfb0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2cfc0 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
2cfd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
2cfe0 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
2cff0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2d000 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2d010 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
2d020 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
2d030 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2d040 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
2d050 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d060 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2d070 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2d080 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  end;.    pParse-
2d090 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69  >nHeight -= sqli
2d0a0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2d0b0 67 68 74 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  ght(p);.  }.#end
2d0c0 69 66 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73  if..  /* Various
2d0d0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
2d0e0 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69   SELECT copied i
2d0f0 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  nto local variab
2d100 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e  les for.  ** con
2d110 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45  venience */.  pE
2d120 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
2d130 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
2d140 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
2d150 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
2d160 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
2d170 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
2d180 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
2d190 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2d1a0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
2d1b0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2d1c0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2d1d0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2d1e0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
2d1f0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
2d200 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
2d210 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  er all FROM-clau
2d220 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29  se analysis:\n")
2d230 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2d240 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2d250 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2d260 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71  f..  /* If the q
2d270 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54  uery is DISTINCT
2d280 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
2d290 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20  Y but is not an 
2d2a0 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a  aggregate, and .
2d2b0 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65    ** if the sele
2d2c0 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73  ct-list is the s
2d2d0 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52  ame as the ORDER
2d2e0 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74   BY list, then t
2d2f0 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63  his query.  ** c
2d300 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
2d310 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49  as a GROUP BY. I
2d320 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
2d330 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
2d340 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
2d350 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
2d360 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
2d370 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66  *.  ** is transf
2d380 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20  ormed to:.  **. 
2d390 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
2d3a0 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55  yz FROM ... GROU
2d3b0 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42  P BY xyz ORDER B
2d3c0 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
2d3d0 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
2d3e0 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20  is preferred as 
2d3f0 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28  a single index (
2d400 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d  or temp-table) m
2d410 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64  ay be .  ** used
2d420 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52   for both the OR
2d430 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49  DER BY and DISTI
2d440 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  NCT processing. 
2d450 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20  As originally . 
2d460 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20   ** written the 
2d470 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61  query must use a
2d480 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
2d490 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
2d4a0 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20  the ORDER .  ** 
2d4b0 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c  BY and DISTINCT,
2d4c0 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72   and an index or
2d4d0 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74   separate temp-t
2d4e0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68  able for the oth
2d4f0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
2d500 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
2d510 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
2d520 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
2d530 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71  stinct .   && sq
2d540 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2d550 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65  pare(sSort.pOrde
2d560 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29  rBy, pEList, -1)
2d570 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  ==0.  ){.    p->
2d580 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
2d590 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47  Distinct;.    pG
2d5a0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
2d5b0 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
2d5c0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45  prListDup(db, pE
2d5d0 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a  List, 0);.    /*
2d5e0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65   Notice that eve
2d5f0 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73  n thought SF_Dis
2d600 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63  tinct has been c
2d610 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73  leared from p->s
2d620 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20  elFlags,.    ** 
2d630 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73  the sDistinct.is
2d640 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65  Tnct is still se
2d650 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63  t.  Hence, isTnc
2d660 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2d670 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  .    ** original
2d680 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20   setting of the 
2d690 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67  SF_Distinct flag
2d6a0 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e  , not the curren
2d6b0 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20  t setting */.   
2d6c0 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e   assert( sDistin
2d6d0 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69  ct.isTnct );..#i
2d6e0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2d6f0 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
2d700 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2d710 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
2d720 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2d730 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54  400,pParse,p,("T
2d740 72 61 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43  ransform DISTINC
2d750 54 20 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a  T into GROUP BY:
2d760 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  \n"));.      sql
2d770 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2d780 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
2d790 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
2d7a0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2d7b0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2d7c0 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  se, then create 
2d7d0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
2d7e0 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68  ex to.  ** do th
2d7f0 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20  e sorting.  But 
2d800 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68  this sorting eph
2d810 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67  emeral index mig
2d820 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62  ht end up.  ** b
2d830 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
2d840 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 65  he data can be e
2d850 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
2d860 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20  sorted order..  
2d870 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20 74 68  ** If that is th
2d880 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
2d890 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2d8a0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
2d8b0 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67  ll be.  ** chang
2d8c0 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
2d8d0 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65 20   once we figure 
2d8e0 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
2d8f0 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20  ting index is.  
2d900 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  ** not needed.  
2d910 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  The sSort.addrSo
2d920 72 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65  rtIndex variable
2d930 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69   is used to faci
2d940 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74  litate.  ** that
2d950 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
2d960 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2d970 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
2d980 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
2d990 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
2d9a0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2d9b0 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f  pParse, sSort.pO
2d9c0 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73  rderBy, 0, pELis
2d9d0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
2d9e0 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20  Sort.iECursor = 
2d9f0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2da00 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
2da10 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
2da20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2da30 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2da40 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
2da50 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c   sSort.iECursor,
2da60 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d   sSort.pOrderBy-
2da70 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d  >nExpr+1+pEList-
2da80 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20  >nExpr, 0,.     
2da90 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
2daa0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2dab0 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  .      );.  }els
2dac0 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  e{.    sSort.add
2dad0 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b  rSortIndex = -1;
2dae0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2daf0 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
2db00 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
2db10 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
2db20 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
2db30 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
2db40 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
2db50 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
2db60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2db70 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2db80 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
2db90 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
2dba0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2dbb0 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f  he limiter..  */
2dbc0 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  .  iEnd = sqlite
2dbd0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2dbe0 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  );.  if( (p->sel
2dbf0 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65 64  Flags & SF_Fixed
2dc00 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20  Limit)==0 ){.   
2dc10 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2dc20 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c   320;  /* 4 bill
2dc30 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a  ion rows */.  }.
2dc40 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
2dc50 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
2dc60 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20  p, iEnd);.  if( 
2dc70 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20  p->iLimit==0 && 
2dc80 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2dc90 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex>=0 ){.    sq
2dca0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f  lite3VdbeChangeO
2dcb0 70 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61  pcode(v, sSort.a
2dcc0 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50  ddrSortIndex, OP
2dcd0 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20  _SorterOpen);.  
2dce0 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67    sSort.sortFlag
2dcf0 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73  s |= SORTFLAG_Us
2dd00 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20  eSorter;.  }..  
2dd10 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d  /* Open an ephem
2dd20 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  eral index to us
2dd30 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
2dd40 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
2dd50 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2dd60 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   SF_Distinct ){.
2dd70 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
2dd80 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  bTnct = pParse->
2dd90 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73  nTab++;.    sDis
2dda0 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d  tinct.addrTnct =
2ddb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ddc0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
2ddd0 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddf0 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74       sDistinct.t
2de00 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  abTnct, 0, 0,.  
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 20 28 63 68 61 72             (char
2de30 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  *)keyInfoFromExp
2de40 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
2de50 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20  >pEList,0,0),.  
2de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de70 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
2de80 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
2de90 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2dea0 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
2deb0 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
2dec0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2ded0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2dee0 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
2def0 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2df00 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2df10 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
2df20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
2df30 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
2df40 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
2df50 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2df60 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
2df70 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2df80 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
2df90 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
2dfa0 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
2dfb0 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
2dfc0 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45 52      assert( WHER
2dfd0 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f  E_USE_LIMIT==SF_
2dfe0 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20  FixedLimit );.  
2dff0 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20    wctrlFlags |= 
2e000 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2e010 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20  _FixedLimit;..  
2e020 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
2e030 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f  atabase scan. */
2e040 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
2e050 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2e060 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2e070 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e  , pWhere, sSort.
2e080 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
2e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0a0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
2e0b0 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  st, wctrlFlags, 
2e0c0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  p->nSelectRow);.
2e0d0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
2e0e0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2e0f0 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  end;.    if( sql
2e100 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
2e110 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20  owCount(pWInfo) 
2e120 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  < p->nSelectRow 
2e130 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  ){.      p->nSel
2e140 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
2e150 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
2e160 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  unt(pWInfo);.   
2e170 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74   }.    if( sDist
2e180 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73  inct.isTnct && s
2e190 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
2e1a0 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b  tinct(pWInfo) ){
2e1b0 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74  .      sDistinct
2e1c0 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c  .eTnctType = sql
2e1d0 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
2e1e0 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  nct(pWInfo);.   
2e1f0 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74   }.    if( sSort
2e200 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2e210 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20     sSort.nOBSat 
2e220 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2e230 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b  Ordered(pWInfo);
2e240 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f 72  .      sSort.bOr
2e250 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d  deredInnerLoop =
2e260 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64   sqlite3WhereOrd
2e270 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57  eredInnerLoop(pW
2e280 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
2e290 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
2e2a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2e2b0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2e2c0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2e2d0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2e2e0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
2e2f0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
2e300 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
2e310 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
2e320 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
2e330 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
2e340 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
2e350 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
2e360 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
2e370 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
2e380 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
2e390 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2e3a0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2e3b0 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
2e3c0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2e3d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2e3e0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
2e3f0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2e400 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
2e410 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
2e420 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
2e430 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  */.    selectInn
2e440 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2e450 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73  , pEList, -1, &s
2e460 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
2e470 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
2e480 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2e490 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
2e4a0 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
2e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4c0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2e4d0 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2e4e0 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  o));..    /* End
2e4f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2e500 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
2e510 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2e520 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
2e530 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
2e540 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
2e550 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
2e560 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
2e570 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2e580 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
2e590 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
2e5a0 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
2e5b0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
2e5c0 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
2e5d0 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
2e5e0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
2e5f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2e600 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2e610 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
2e620 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
2e630 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
2e640 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2e650 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2e660 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
2e670 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
2e680 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
2e690 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
2e6a0 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
2e6b0 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
2e6c0 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
2e6d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
2e6e0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
2e6f0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
2e700 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e720 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2e730 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
2e740 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
2e750 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
2e760 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
2e770 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
2e780 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
2e790 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
2e7a0 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
2e7b0 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
2e7c0 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
2e7d0 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
2e7e0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
2e7f0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
2e800 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
2e810 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
2e820 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
2e830 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
2e840 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
2e850 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
2e860 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
2e870 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
2e880 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
2e890 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
2e8a0 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
2e8b0 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
2e8c0 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
2e8d0 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
2e8e0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
2e8f0 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
2e900 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
2e910 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
2e920 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
2e930 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
2e940 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2e950 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
2e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e970 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2e980 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
2e990 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2e9a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
2e9b0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2e9c0 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
2e9d0 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
2e9e0 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
2e9f0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
2ea00 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
2ea10 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
2ea20 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
2ea30 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
2ea40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2ea50 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
2ea60 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
2ea70 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
2ea80 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2ea90 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2eaa0 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2eab0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2eac0 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 66==sqlite3Log
2ead0 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20  Est(100) );.    
2eae0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
2eaf0 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c  Row>66 ) p->nSel
2eb00 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20  ectRow = 66;.   
2eb10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2eb20 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
2eb30 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20  LogEst(1) );.   
2eb40 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
2eb50 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2eb60 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2eb70 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20  both a GROUP BY 
2eb80 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20  and an ORDER BY 
2eb90 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20  clause and they 
2eba0 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74  are.    ** ident
2ebb0 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61  ical, then it ma
2ebc0 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  y be possible to
2ebd0 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
2ebe0 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20  ER BY clause .  
2ebf0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75    ** on the grou
2ec00 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f  nds that the GRO
2ec10 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65  UP BY will cause
2ec20 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d   elements to com
2ec30 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e  e out .    ** in
2ec40 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
2ec50 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20  er. It also may 
2ec60 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20  not - the GROUP 
2ec70 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20  BY might use a. 
2ec80 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2ec90 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73  ndex that causes
2eca0 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75   rows to be grou
2ecb0 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20  ped together as 
2ecc0 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20  required.    ** 
2ecd0 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
2ece0 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20   sorted. Either 
2ecf0 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20  way, record the 
2ed00 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20  fact that the.  
2ed10 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e    ** ORDER BY an
2ed20 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  d GROUP BY claus
2ed30 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  es are the same 
2ed40 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f  by setting the o
2ed50 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a  rderByGrp.    **
2ed60 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20   variable.  */. 
2ed70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2ed80 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47  prListCompare(pG
2ed90 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f  roupBy, sSort.pO
2eda0 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29  rderBy, -1)==0 )
2edb0 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47  {.      orderByG
2edc0 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a  rp = 1;.    }. .
2edd0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
2ede0 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
2edf0 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
2ee00 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
2ee10 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
2ee20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2ee30 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
2ee40 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
2ee50 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
2ee60 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
2ee70 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
2ee80 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
2ee90 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
2eea0 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
2eeb0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
2eec0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
2eed0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
2eee0 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
2eef0 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
2ef00 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
2ef10 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2ef20 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
2ef30 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
2ef40 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
2ef50 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
2ef60 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d  sAggInfo.mnReg =
2ef70 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2ef80 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
2ef90 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
2efa0 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
2efb0 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  By->nExpr : 0;. 
2efc0 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
2efd0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
2efe0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2eff0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
2f000 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
2f010 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2f020 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
2f030 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2f040 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  );.    if( pHavi
2f050 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
2f060 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2f070 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
2f080 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20  Having);.    }. 
2f090 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
2f0a0 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
2f0b0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
2f0c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2f0d0 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
2f0e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2f0f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2f100 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b  (sAggInfo.aFunc[
2f110 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  i].pExpr, EP_xIs
2f120 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
2f130 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
2f140 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
2f150 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2f160 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2f170 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
2f180 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  nc[i].pExpr->x.p
2f190 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43  List);.      sNC
2f1a0 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
2f1b0 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d  InAggFunc;.    }
2f1c0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78  .    sAggInfo.mx
2f1d0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2f1e0 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  em;.    if( db->
2f1f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2f200 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2f210 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
2f220 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
2f230 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
2f240 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
2f250 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
2f260 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
2f270 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
2f280 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
2f290 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
2f2a0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
2f2b0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2f2c0 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
2f2d0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
2f2e0 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
2f2f0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
2f300 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
2f310 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
2f320 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
2f330 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
2f340 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
2f350 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
2f360 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
2f370 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
2f380 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
2f390 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
2f3a0 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
2f3b0 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
2f3c0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
2f3d0 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
2f3e0 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
2f3f0 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
2f400 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
2f410 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
2f420 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
2f430 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
2f440 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2f450 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
2f460 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2f470 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
2f480 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
2f490 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
2f4a0 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
2f4b0 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
2f4c0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
2f4d0 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
2f4e0 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
2f4f0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
2f500 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
2f510 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
2f520 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
2f530 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
2f540 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
2f550 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
2f560 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
2f570 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
2f580 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
2f590 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
2f5a0 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
2f5b0 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
2f5c0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
2f5d0 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
2f5e0 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
2f5f0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  n instruction.  
2f600 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
2f610 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
2f620 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
2f630 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
2f640 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
2f650 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2f660 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
2f670 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2f680 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
2f690 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e  By, 0, sAggInfo.
2f6a0 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
2f6b0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
2f6c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f6d0 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
2f6e0 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pen, .          
2f6f0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2f700 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53  Idx, sAggInfo.nS
2f710 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20  ortingColumn, . 
2f720 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61           0, (cha
2f730 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2f740 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20  KEYINFO);..     
2f750 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
2f760 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
2f770 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
2f780 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
2f790 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
2f7a0 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
2f7b0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2f7c0 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
2f7d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2f7e0 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70  m;.      regOutp
2f7f0 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  utRow = ++pParse
2f800 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
2f810 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
2f820 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2f830 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67  el(v);.      reg
2f840 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
2f850 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
2f860 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
2f870 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2f880 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  );.      iAMem =
2f890 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
2f8a0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
2f8b0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
2f8c0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2f8d0 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
2f8e0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
2f8f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2f900 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2f910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2f930 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72  nteger, 0, iAbor
2f940 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
2f950 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
2f960 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
2f970 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2f980 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f990 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55  P_Integer, 0, iU
2f9a0 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
2f9b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2f9c0 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c  indicate accumul
2f9d0 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20  ator empty"));. 
2f9e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f9f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
2fa00 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d  l, 0, iAMem, iAM
2fa10 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  em+pGroupBy->nEx
2fa20 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  pr-1);..      /*
2fa30 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68   Begin a loop th
2fa40 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
2fa50 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20  all source rows 
2fa60 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
2fa70 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  r..      ** This
2fa80 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74   might involve t
2fa90 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70  wo separate loop
2faa0 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72  s with an OP_Sor
2fab0 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72  t in between, or
2fac0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67  .      ** it mig
2fad0 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c  ht be a single l
2fae0 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e  oop that uses an
2faf0 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63   index to extrac
2fb00 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  t information.  
2fb10 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69      ** in the ri
2fb20 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67  ght order to beg
2fb30 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a  in with..      *
2fb40 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2fb50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2fb60 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
2fb70 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
2fb80 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
2fb90 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
2fba0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2fbb0 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79  pWhere, pGroupBy
2fbc0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57  , 0,.          W
2fbd0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28  HERE_GROUPBY | (
2fbe0 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45  orderByGrp ? WHE
2fbf0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a  RE_SORTBYGROUP :
2fc00 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a   0), 0.      );.
2fc10 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2fc20 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
2fc30 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
2fc40 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
2fc50 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d  rdered(pWInfo)==
2fc60 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
2fc70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2fc80 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
2fc90 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
2fca0 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
2fcb0 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
2fcc0 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
2fcd0 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
2fce0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2fcf0 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
2fd00 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
2fd10 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
2fd20 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
2fd30 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
2fd40 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
2fd50 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
2fd60 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
2fd70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2fd80 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
2fd90 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
2fda0 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
2fdb0 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
2fdc0 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
2fdd0 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
2fde0 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
2fdf0 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
2fe00 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2fe10 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
2fe20 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
2fe30 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
2fe40 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
2fe50 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
2fe60 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
2fe70 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73        int regBas
2fe80 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
2fe90 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20  egRecord;.      
2fea0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
2feb0 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79      int nGroupBy
2fec0 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  ;..        expla
2fed0 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
2fee0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
2fef0 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
2ff00 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ct && (p->selFla
2ff10 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d  gs&SF_Distinct)=
2ff20 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20  =0) ?.          
2ff30 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49            "DISTI
2ff40 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59  NCT" : "GROUP BY
2ff50 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f  ");..        gro
2ff60 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
2ff70 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d        nGroupBy =
2ff80 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2ff90 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
2ffa0 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
2ffb0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
2ffc0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2ffd0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
2ffe0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2fff0 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e        if( sAggIn
30000 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74  fo.aCol[i].iSort
30010 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
30020 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b             nCol+
30030 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  +;.            j
30040 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
30050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30060 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
30070 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
30080 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  pParse, nCol);. 
30090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
300a0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
300b0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
300c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
300d0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
300e0 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c  roupBy, regBase,
300f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
30100 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  j = nGroupBy;.  
30110 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
30120 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
30130 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
30140 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
30150 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73  o_col *pCol = &s
30160 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b  AggInfo.aCol[i];
30170 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
30180 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
30190 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
301a0 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20       int r1 = j 
301b0 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  + regBase;.     
301c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
301d0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54  prCodeGetColumnT
301e0 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20 20  oReg(pParse, .  
301f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30200 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
30210 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
30220 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
30230 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  able, r1);.     
30240 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
30250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30260 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
30270 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
30280 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
30290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
302a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
302b0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
302c0 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52  Base, nCol, regR
302d0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
302e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
302f0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e  2(v, OP_SorterIn
30300 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
30310 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65  ortingIdx, regRe
30320 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
30330 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
30340 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
30350 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
30360 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
30370 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
30380 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b   regBase, nCol);
30390 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
303a0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
303b0 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
303c0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  fo.sortingIdxPTa
303d0 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70  b = sortPTab = p
303e0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
303f0 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d         sortOut =
30400 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
30410 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
30420 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30430 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
30440 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62  Pseudo, sortPTab
30450 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29  , sortOut, nCol)
30460 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30470 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
30480 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41  P_SorterSort, sA
30490 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
304a0 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
304b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
304c0 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73  ((v, "GROUP BY s
304d0 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65  ort")); VdbeCove
304e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
304f0 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72   sAggInfo.useSor
30500 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20  tingIdx = 1;.   
30510 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
30520 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
30530 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e);..      }..  
30540 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
30550 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79  dex or temporary
30560 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 74   table used by t
30570 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74  he GROUP BY sort
30580 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e  .      ** will n
30590 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72  aturally deliver
305a0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64   rows in the ord
305b0 65 72 20 72 65 71 75 69 72 65 64 20 62 79 20 74  er required by t
305c0 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  he ORDER BY.    
305d0 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e    ** clause, can
305e0 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61  cel the ephemera
305f0 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64  l table open cod
30600 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20  ed earlier..    
30610 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
30620 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
30630 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72  ation - the corr
30640 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c  ect answer shoul
30650 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c  d result regardl
30660 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73  ess..      ** Us
30670 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f  e the SQLITE_Gro
30680 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77  upByOrder flag w
30690 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ith SQLITE_TESTC
306a0 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f  TRL_OPTIMIZER to
306b0 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62   .      ** disab
306c0 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  le this optimiza
306d0 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67  tion for testing
306e0 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20   purposes.  */. 
306f0 20 20 20 20 20 69 66 28 20 6f 72 64 65 72 42 79       if( orderBy
30700 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  Grp && Optimizat
30710 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
30720 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
30730 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 28  er) .       && (
30740 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73  groupBySort || s
30750 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72  qlite3WhereIsSor
30760 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20  ted(pWInfo)).   
30770 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53     ){.        sS
30780 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
30790 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
307a0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
307b0 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
307c0 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  ortIndex);.     
307d0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
307e0 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
307f0 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
30800 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
30810 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
30820 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
30830 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
30840 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
30850 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
30860 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
30870 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
30880 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
30890 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
308a0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
308b0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
308c0 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
308d0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
308e0 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
308f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
30900 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
30910 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
30920 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
30930 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
30940 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
30950 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
30960 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
30970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
30980 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
30990 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  a, sAggInfo.sort
309a0 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20  ingIdx,.        
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309c0 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50    sortOut, sortP
309d0 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
309e0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
309f0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
30a00 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
30a10 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
30a20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
30a30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
30a40 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50  OP_Column, sortP
30a50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Tab, j, iBMem+j)
30a60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
30a70 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
30a80 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
30a90 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
30aa0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
30ab0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
30ac0 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
30ad0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
30ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
30af0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
30b00 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
30b10 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
30b20 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
30b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b40 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
30b50 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
30b60 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
30b70 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61  EYINFO);.      a
30b80 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
30b90 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
30ba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30bb0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
30bc0 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20 30  Jump, addr1+1, 0
30bd0 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65  , addr1+1); Vdbe
30be0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
30bf0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
30c00 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
30c10 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
30c20 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
30c30 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69      ** Changes i
30c40 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
30c50 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
30c60 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
30c70 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
30c80 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
30c90 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
30ca0 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
30cb0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
30cc0 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
30cd0 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
30ce0 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
30cf0 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
30d00 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
30d10 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
30d20 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
30d30 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
30d40 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
30d50 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
30d60 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
30d70 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
30d80 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
30d90 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
30da0 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
30db0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
30dc0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
30dd0 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65  rse, iBMem, iAMe
30de0 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
30df0 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
30e00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30e10 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
30e20 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
30e30 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
30e40 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
30e50 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
30e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30e70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30e80 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  IfPos, iAbortFla
30e90 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62  g, addrEnd); Vdb
30ea0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
30eb0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
30ec0 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
30ed0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
30ee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30ef0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
30f00 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
30f10 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
30f20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
30f30 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
30f40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
30f50 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
30f60 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
30f70 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
30f80 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
30f90 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
30fa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
30fb0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30fc0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
30fd0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
30fe0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
30ff0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
31000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
31010 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
31020 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
31030 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
31040 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61  (v, "indicate da
31050 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
31060 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
31070 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
31080 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31090 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
310a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
310b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
310c0 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41  P_SorterNext, sA
310d0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
310e0 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  x, addrTopOfLoop
310f0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
31100 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
31110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31120 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
31130 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
31140 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
31150 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
31160 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20  rSortingIdx);.  
31170 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
31180 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
31190 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
311a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
311b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
311c0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
311d0 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
311e0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
311f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
31200 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72   "output final r
31210 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ow"));..      /*
31220 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73   Jump over the s
31230 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20  ubroutines.     
31240 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
31250 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
31260 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  rEnd);..      /*
31270 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
31280 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
31290 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
312a0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
312b0 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
312c0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
312d0 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
312e0 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
312f0 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
31300 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
31310 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
31320 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
31330 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
31340 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
31350 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
31360 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
31370 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
31380 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
31390 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
313a0 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
313b0 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
313c0 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
313d0 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
313e0 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
313f0 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
31400 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
31410 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
31420 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
31430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
31450 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
31460 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
31470 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
31480 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
31490 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
314a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
314b0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
314c0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
314d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
314e0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75  eLabel(v, addrOu
314f0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
31500 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
31510 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
31520 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
31530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31540 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
31550 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
31560 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20  tputRow+2);.    
31570 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
31580 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
31590 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62  ment((v, "Groupb
315a0 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
315b0 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
315c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
315d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
315e0 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
315f0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69  utRow);.      fi
31600 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
31610 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
31620 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
31630 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
31640 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
31650 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
31660 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
31670 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
31680 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
31690 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
316a0 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20  , -1, &sSort,.  
316b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316c0 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20      &sDistinct, 
316d0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
316e0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
316f0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
31700 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20  drSetAbort);.   
31710 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31720 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
31730 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
31740 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
31750 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
31760 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
31770 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
31780 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
31790 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
317a0 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
317b0 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
317c0 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
317d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
317e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
317f0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  rReset);.      r
31800 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
31810 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
31820 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
31830 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
31840 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73  P_Return, regRes
31850 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d  et);.     .    }
31860 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
31870 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65  By.  Begin aggre
31880 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74  gate queries wit
31890 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a  hout GROUP BY: *
318a0 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
318b0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
318c0 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
318d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
318e0 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c  COUNT.      Tabl
318f0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
31900 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d  f( (pTab = isSim
31910 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67  pleCount(p, &sAg
31920 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20  gInfo))!=0 ){.  
31930 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69        /* If isSi
31940 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75  mpleCount() retu
31950 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
31960 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
31970 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  re, then.       
31980 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74   ** the SQL stat
31990 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
319a0 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a  form:.        **
319b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
319c0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
319d0 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20  OM <tbl>.       
319e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
319f0 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73  here the Table s
31a00 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
31a10 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62  d represents tab
31a20 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20  le <tbl>..      
31a30 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
31a40 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
31a50 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74  s so common that
31a60 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64   it is optimized
31a70 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a   specially. The.
31a80 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f          ** OP_Co
31a90 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  unt instruction 
31aa0 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68  is executed eith
31ab0 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79  er on the intkey
31ac0 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
31ad0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
31ae0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62  the data for tab
31af0 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f  le <tbl> or on o
31b00 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65  ne of its indexe
31b10 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a  s. It.        **
31b20 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78   is better to ex
31b30 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20  ecute the op on 
31b40 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64  an index, as ind
31b50 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a  exes are almost.
31b60 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
31b70 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20  s spread across 
31b80 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20  less pages than 
31b90 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
31ba0 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ing tables..    
31bb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
31bc0 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73  onst int iDb = s
31bd0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
31be0 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
31bf0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
31c00 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
31c10 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d  t iCsr = pParse-
31c20 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
31c30 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62  Cursor to scan b
31c40 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20  -tree */.       
31c50 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c70 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
31c80 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
31c90 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
31ca0 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
31cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
31cc0 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65  yinfo for scanne
31cd0 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  d index */.     
31ce0 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
31cf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
31d00 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
31d10 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66  index found so f
31d20 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ar */.        in
31d30 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e  t iRoot = pTab->
31d40 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
31d50 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
31d60 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65  of scanned b-tre
31d70 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71  e */..        sq
31d80 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
31d90 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
31da0 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
31db0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
31dc0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
31dd0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
31de0 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  Name);..        
31df0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
31e00 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  e index that has
31e10 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e   the lowest scan
31e20 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   cost..        *
31e30 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
31e40 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
31e50 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
31e60 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
31e70 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
31e80 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
31e90 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74  13-10-03) Do not
31ea0 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69   count the entri
31eb0 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20  es in a partial 
31ec0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
31ed0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
31ee0 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
31ef0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
31f00 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
31f10 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
31f20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
31f30 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
31f40 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
31f50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
31f60 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
31f70 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74   ) pBest = sqlit
31f80 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
31f90 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
31fa0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
31fb0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
31fc0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
31fd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
31fe0 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  Idx->bUnordered=
31ff0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
32000 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
32010 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20  pTab->szTabRow. 
32020 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
32030 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
32040 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
32050 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
32060 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73  x->szIdxRow<pBes
32070 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20  t->szIdxRow).   
32080 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
32090 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
320a0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dx;.          }.
320b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
320c0 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20    if( pBest ){. 
320d0 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
320e0 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
320f0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
32100 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
32110 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
32120 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
32130 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
32140 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
32150 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
32160 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
32170 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
32180 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
32190 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
321a0 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
321b0 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
321c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
321d0 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
321e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
321f0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
32200 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
32210 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
32220 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32240 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
32250 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
32260 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
32270 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32280 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
32290 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
322a0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
322b0 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73  impleCount(pPars
322c0 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b  e, pTab, pBest);
322d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
322e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
322f0 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
32300 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
32310 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
32320 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
32330 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
32340 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20  g forms:.       
32350 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
32360 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
32370 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
32380 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
32390 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
323a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
323b0 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
323c0 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
323d0 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
323e0 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
323f0 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lts.        ** a
32400 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
32410 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f  n "ORDER ON x" o
32420 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45  r "ORDER ON x DE
32430 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20  SC" clause. .   
32440 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65       ** If where
32450 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72  .c is able to pr
32460 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f  oduce results so
32470 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64  rted in this ord
32480 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  er, then.       
32490 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
324a0 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
324b0 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
324c0 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
324d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73  .        ** firs
324e0 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
324f0 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
32500 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
32510 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  op is .        *
32520 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
32530 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
32540 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
32550 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
32560 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
32570 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
32580 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
32590 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
325a0 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
325b0 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
325c0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
325d0 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
325e0 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ghtly.        **
325f0 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72   modify behavior
32600 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
32610 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
32620 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
32630 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
32640 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
32650 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
32660 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
32670 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
32680 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
32690 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
326a0 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
326b0 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
326c0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
326d0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
326e0 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
326f0 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
32700 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
32710 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  es which.       
32720 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
32730 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
32740 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
32750 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
32760 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ty on .        *
32770 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
32780 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
32790 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
327a0 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
327b0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  es..        **  
327c0 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65     Refer to code
327d0 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   and comments in
327e0 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74   where.c for det
327f0 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ails..        */
32800 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
32810 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
32820 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20          u8 flag 
32830 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
32840 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20  NORMAL;.        
32850 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32860 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
32870 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
32880 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  t( flag==0 );.  
32890 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
328a0 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ving==0 ){.     
328b0 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d       flag = minM
328c0 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66  axQuery(&sAggInf
328d0 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20  o, &pMinMax);.  
328e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
328f0 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
32900 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26  || (pMinMax!=0 &
32910 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72  & pMinMax->nExpr
32920 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ==1) );..       
32930 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
32940 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
32950 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
32960 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c  Dup(db, pMinMax,
32970 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
32980 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20  Del = pMinMax;. 
32990 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
329a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
329b0 64 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d 30 20  d || pMinMax!=0 
329c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
329d0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
329e0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
329f0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
32a00 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
32a10 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
32a20 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
32a30 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
32a40 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
32a50 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
32a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32a70 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
32a80 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
32a90 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
32aa0 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
32ab0 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
32ac0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
32ad0 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
32ae0 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
32af0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
32b00 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
32b10 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
32b20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
32b30 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
32b40 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
32b50 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
32b60 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
32b70 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
32b80 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d  List, pWhere, pM
32b90 69 6e 4d 61 78 2c 20 30 2c 66 6c 61 67 2c 30 29  inMax, 0,flag,0)
32ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
32bb0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
32bc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
32bd0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
32be0 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
32bf0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
32c00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32c10 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
32c20 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
32c30 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
32c40 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
32c50 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e  ==0 || pMinMax->
32c60 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
32c70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
32c80 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
32c90 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20  Info)>0 ){.     
32ca0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
32cb0 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57  Goto(v, sqlite3W
32cc0 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
32cd0 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
32ce0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
32cf0 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
32d00 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
32d10 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45      (flag==WHERE
32d20 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69  _ORDERBY_MIN?"mi
32d30 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20  n":"max")));.   
32d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
32d50 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
32d60 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
32d70 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
32d80 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
32d90 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  ggInfo);.      }
32da0 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  ..      sSort.pO
32db0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
32dc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
32dd0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
32de0 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
32df0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
32e00 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
32e10 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
32e20 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
32e30 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20  1, 0, 0, .      
32e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e50 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
32e60 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
32e70 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
32e80 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
32e90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
32ea0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
32eb0 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
32ec0 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
32ed0 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
32ee0 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73  y */..  if( sDis
32ef0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d  tinct.eTnctType=
32f00 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
32f10 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20  UNORDERED ){.   
32f20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
32f30 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  e(pParse, "DISTI
32f40 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NCT");.  }..  /*
32f50 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
32f60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
32f70 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
32f80 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
32f90 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
32fa0 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
32fb0 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
32fc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
32fd0 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
32fe0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
32ff0 6c 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  le(pParse,.     
33000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33010 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f  sSort.nOBSat>0 ?
33020 20 22 52 49 47 48 54 20 50 41 52 54 20 4f 46 20   "RIGHT PART OF 
33030 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52  ORDER BY":"ORDER
33040 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72   BY");.    gener
33050 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
33060 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70  se, p, &sSort, p
33070 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44  EList->nExpr, pD
33080 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
33090 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
330a0 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
330b0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
330c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
330d0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
330e0 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
330f0 63 6f 64 65 64 2e 20 49 66 20 74 68 65 72 65 20  coded. If there 
33100 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  is an error in t
33110 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
33120 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  re,.  ** set the
33130 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
33140 31 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 20  1. Otherwise 0. 
33150 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50 61 72 73  */.  rc = (pPars
33160 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20 2f  e->nErr>0);..  /
33170 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
33180 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
33190 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
331a0 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
331b0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
331c0 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
331d0 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
331e0 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61  ect_end:.  expla
331f0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
33200 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
33210 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
33220 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  );..  /* Identif
33230 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
33240 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  f results of the
33250 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62   SELECT are to b
33260 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
33270 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33280 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65  OK && pDest->eDe
33290 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
332a0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
332b0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
332c0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
332d0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  st);.  }..  sqli
332e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
332f0 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
33300 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
33310 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
33320 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
33330 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
33340 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
33350 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73  e,p,("end proces
33360 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61  sing\n"));.  pPa
33370 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
33380 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72  nt--;.#endif.  r
33390 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.