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

Artifact c12d9b45c31182921c2aea5ab11bc0add480c6e3b47cb3400edecbbf97000fd0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  end(pParse, 0,. 
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50    sqlite3Expr(pP
1030: 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45  arse->db,TK_ASTE
1040: 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20  RISK,0));.  }.  
1050: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pNew->pEList = p
1060: 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f  EList;.  pNew->o
1070: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
1080: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
1090: 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e  = selFlags;.  pN
10a0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
10b0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
10c0: 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  = 0;.#if SELECTT
10d0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
10e0: 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d  New->zSelName[0]
10f0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
1100: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
1110: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
1120: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
1130: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
1140: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
1150: 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29  .  if( pSrc==0 )
1160: 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44   pSrc = sqlite3D
1170: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
1180: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
1190: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
11a0: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
11b0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
11c0: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
11d0: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
11e0: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
11f0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1200: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1210: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1220: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
1230: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
1240: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
1250: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
1260: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
1270: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  fset;.  pNew->pW
1280: 69 74 68 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ith = 0;.  asser
1290: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
12a0: 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50   pLimit!=0 || pP
12b0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 0a 20 20 20  arse->nErr>0.   
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
12e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
12f0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
1300: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1310: 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  ed ) {.    clear
1320: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64  Select(pParse->d
1330: 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26  b, pNew, pNew!=&
1340: 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e  standin);.    pN
1350: 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ew = 0;.  }else{
1360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
1370: 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50  w->pSrc!=0 || pP
1380: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a  arse->nErr>0 );.
1390: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
13a0: 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a  ew!=&standin );.
13b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
13c0: 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
13d0: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
13e0: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
13f0: 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a  a Select object.
1400: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1410: 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c  electSetName(Sel
1420: 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ect *p, const ch
1430: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
1440: 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a  ( p && zName ){.
1450: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1460: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a  intf(sizeof(p->z
1470: 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65  SelName), p->zSe
1480: 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61  lName, "%s", zNa
1490: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  me);.  }.}.#endi
14a0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  f.../*.** Delete
14b0: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
14c0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
14d0: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
14e0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
14f0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1500: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1510: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1520: 20 69 66 28 20 70 20 29 20 63 6c 65 61 72 53 65   if( p ) clearSe
1530: 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a  lect(db, p, 1);.
1540: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1550: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1560: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
1570: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1580: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
1590: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
15a0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
15b0: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
15c0: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
15d0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
15e0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
15f0: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1600: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1610: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1620: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1630: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1640: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
1650: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
1660: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
1670: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
1680: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
1690: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
16a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
16b0: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
16c0: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
16d0: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
16e0: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
16f0: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1700: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1710: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1720: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1730: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1740: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
1750: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
1760: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1770: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
1780: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
1790: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
17a0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
17b0: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
17c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
17d0: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
17e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
17f0: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1800: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1810: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1820: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1830: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1840: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
1870: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1880: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
1890: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
18a0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
18b0: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
18c0: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
18d0: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
18e0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
18f0: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1900: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1910: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1920: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1930: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1940: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1950: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1960: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1970: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1980: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
1990: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
19a0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
19b0: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
19c0: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
19e0: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
19f0: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1a00: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1a10: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1a20: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1a30: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1a50: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1a60: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1a70: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1a80: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
1a90: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
1aa0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1ab0: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1ac0: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1af0: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1b00: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1b10: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1b20: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1b30: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1b40: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1b50: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1b60: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1b70: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1b80: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1b90: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1ba0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1bb0: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1bc0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1bd0: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1be0: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1bf0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1c00: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1c10: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1c20: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1c30: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1c40: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1c50: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1c60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c80: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1c90: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1ca0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1cb0: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1cc0: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1cd0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1ce0: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1cf0: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1d00: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1d10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1d20: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1d30: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1d40: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
1d50: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
1d60: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
1d70: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
1d80: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d90: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
1da0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1db0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1dc0: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1dd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1de0: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1df0: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1e00: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1e10: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1e20: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1e30: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1e40: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1e50: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1e60: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1e70: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1e80: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1e90: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1ea0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1eb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ec0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1ed0: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1ee0: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1ef0: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1f00: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1f10: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1f20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1f30: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1f40: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1f50: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1f60: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1f70: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1f80: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1f90: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1fa0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1fb0: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1fc0: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1fd0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1fe0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1ff0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
2000: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
2010: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
2020: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
2030: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
2040: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
2050: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
2060: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
2070: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
2080: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
2090: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
20a0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
20b0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
20c0: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
20d0: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
20e0: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
20f0: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
2100: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
2110: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
2120: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
2130: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
2140: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
2150: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
2160: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
2170: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
2180: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
2190: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
21a0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
21b0: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
21c0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
21d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21e0: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
21f0: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
2200: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
2210: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
2220: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
2230: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
2240: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
2250: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
2260: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
2270: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
2280: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
2290: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
22a0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
22b0: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
22c0: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
22d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2300: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
2310: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2330: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
2340: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
2350: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
2360: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
2370: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
2380: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
2390: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
23a0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
23b0: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
23c0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
23d0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
23e0: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
23f0: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2400: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2410: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2420: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2430: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2450: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2460: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2470: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
2480: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
2490: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
24a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
24b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
24c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24d0: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
24e0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
24f0: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2500: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2510: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2520: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2530: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2540: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
2550: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
2560: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
2570: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
2580: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
2590: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
25a0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
25b0: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
25c0: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
25d0: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
25e0: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
25f0: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2600: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2610: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2630: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2640: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2660: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
2670: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
2680: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
2690: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
26a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26b0: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
26c0: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
26d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
26e0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
26f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2700: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2710: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2720: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2740: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
2750: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
2760: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
2770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2780: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
2790: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
27a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
27b0: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
27c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27d0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
27e0: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
27f0: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2820: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2830: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2840: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2850: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
2860: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
2870: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
2880: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
2890: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
28a0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
28b0: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
28c0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
28d0: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
28e0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
28f0: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2900: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2910: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2920: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2930: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2940: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2950: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2960: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2970: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2980: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2990: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
29a0: 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45  , pE2);.  if( pE
29b0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
29c0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
29d0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
29e0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
29f0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2a20: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
2a30: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2a40: 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  pEq, EP_NoReduce
2a50: 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67  );.    pEq->iRig
2a60: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
2a70: 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a  16)pE2->iTable;.
2a80: 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d    }.  *ppWhere =
2a90: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2aa0: 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45  db, *ppWhere, pE
2ab0: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  q);.}../*.** Set
2ac0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
2ad0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
2ae0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
2af0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
2b00: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
2b10: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
2b20: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
2b30: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
2b40: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2b50: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
2b60: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2b70: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
2b80: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
2b90: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
2ba0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
2bb0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
2bc0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
2bd0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2be0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2bf0: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2c00: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2c10: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2c20: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2c30: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2c40: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2c50: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2c60: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2c70: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2c80: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
2c90: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
2ca0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
2cb0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
2cc0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
2cd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2ce0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
2cf0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2d00: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
2d10: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2d20: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
2d30: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
2d40: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
2d50: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
2d60: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
2d70: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
2d80: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
2d90: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
2da0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
2db0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
2dc0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
2dd0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2de0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
2df0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
2e00: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
2e10: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
2e20: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
2e30: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
2e40: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
2e50: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
2e60: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
2e70: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
2e80: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
2e90: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
2ea0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2eb0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
2ec0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
2ed0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
2ee0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
2ef0: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
2f00: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
2f10: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
2f20: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
2f30: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
2f40: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
2f50: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
2f60: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
2f70: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
2f80: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
2f90: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
2fa0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
2fb0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
2fc0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
2fd0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2fe0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ff0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
3000: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
3010: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
3020: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c  etVVAProperty(p,
3030: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
3040: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
3050: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
3060: 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ble;.    if( p->
3070: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
3080: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
3090: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
30a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
30b0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
30c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30d0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
30e0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
30f0: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
3100: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
3110: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
3120: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
3130: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
3140: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
3150: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
3160: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
3170: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
3180: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3190: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
31a0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
31b0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
31c0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
31d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
31e0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
31f0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
3200: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
3210: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  erms..**.** The 
3220: 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20  terms of a FROM 
3230: 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61  clause are conta
3240: 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65  ined in the Sele
3250: 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72  ct.pSrc structur
3260: 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d  e..** The left m
3270: 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65  ost table is the
3280: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
3290: 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68  Select.pSrc.  Th
32a0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20  e right-most.** 
32b0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73  table is the las
32c0: 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f  t entry.  The jo
32d0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68  in operator is h
32e0: 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79  eld in the entry
32f0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e   to.** the left.
3300: 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63    Thus entry 0 c
3310: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e  ontains the join
3320: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   operator for th
3330: 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a  e join between.*
3340: 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20  * entries 0 and 
3350: 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53  1.  Any ON or US
3360: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f  ING clauses asso
3370: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3380: 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f  join are.** also
3390: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
33a0: 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   left entry..**.
33b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
33c0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
33d0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
33e0: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  ountered..*/.sta
33f0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72  tic int sqlitePr
3400: 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20  ocessJoin(Parse 
3410: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
3420: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
3430: 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  pSrc;           
3440: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61         /* All ta
3450: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
3460: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
3470: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3490: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
34a0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34b0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20  t_item *pLeft;  
34c0: 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65     /* Left table
34d0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
34e0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34f0: 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20  t_item *pRight; 
3500: 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c     /* Right tabl
3510: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
3520: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  /..  pSrc = p->p
3530: 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26  Src;.  pLeft = &
3540: 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52  pSrc->a[0];.  pR
3550: 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d  ight = &pLeft[1]
3560: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3570: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b  Src->nSrc-1; i++
3580: 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66  , pRight++, pLef
3590: 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  t++){.    Table 
35a0: 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66  *pLeftTab = pLef
35b0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62  t->pTab;.    Tab
35c0: 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20  le *pRightTab = 
35d0: 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20  pRight->pTab;.  
35e0: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a    int isOuter;..
35f0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c      if( NEVER(pL
3600: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
3610: 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e  ghtTab==0) ) con
3620: 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74  tinue;.    isOut
3630: 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67  er = (pRight->fg
3640: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
3650: 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f  UTER)!=0;..    /
3660: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
3670: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
3680: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
3690: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
36a0: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
36b0: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
36c0: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
36d0: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
36e0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
36f0: 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
3700: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
3710: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3720: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
3730: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
3740: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3750: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
3760: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
3770: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
3780: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
3790: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
37a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
37b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
37c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
37d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
37e0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
37f0: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
3800: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
3810: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
3820: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3830: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
3840: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
3850: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3860: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
3870: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
3880: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
3890: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
38a0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
38b0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
38c0: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
38d0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
38e0: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
38f0: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
3900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
3910: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
3920: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
3930: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
3940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3950: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
3960: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
3970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3980: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
3990: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
39a0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
39b0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
39c0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
39d0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
39e0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
39f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3a00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3a10: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
3a20: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
3a30: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
3a40: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
3a50: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
3a60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
3a70: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
3a80: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
3a90: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
3aa0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
3ab0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3ac0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3ad0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3ae0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3af0: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3b00: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3b10: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3b20: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3b30: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3b40: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3b50: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
3b60: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
3b70: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
3b80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
3b90: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
3ba0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
3bb0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3bc0: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3bd0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3be0: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3bf0: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3c00: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3c10: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3c20: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3c30: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3c40: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3c50: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
3c60: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
3c70: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
3c80: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
3c90: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
3ca0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
3cb0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3cc0: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3cd0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3ce0: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3cf0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3d00: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3d10: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3d20: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3d30: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3d40: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3d50: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
3d60: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
3d70: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
3d80: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3d90: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
3da0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
3db0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3dc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3dd0: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3de0: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3df0: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3e00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3e10: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3e20: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3e30: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3e40: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3e50: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
3e60: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
3e70: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
3e80: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3e90: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
3ea0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
3eb0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3ec0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3ed0: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3ee0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3ef0: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3f00: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3f10: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3f20: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3f30: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3f40: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3f50: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
3f60: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
3f70: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3f80: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
3f90: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
3fa0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
3fb0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3fc0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3fd0: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3fe0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3ff0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
4000: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
4010: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
4020: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
4030: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
4040: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
4050: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
4060: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
4070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4080: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4090: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
40a0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
40b0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
40c0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
40d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
40e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
40f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4100: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
4110: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
4120: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
4130: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
4140: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
4150: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
4160: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
4170: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
4180: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
4190: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
41a0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
41b0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
41c0: 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  d */.);../*.** G
41d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
41e0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
41f0: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4200: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4210: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4220: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4230: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4240: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4250: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4260: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4270: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4280: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4290: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
42a0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
42b0: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
42c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
42d0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
42e0: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
42f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4300: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4310: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4320: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4330: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4340: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4350: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4360: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4370: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4380: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4390: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
43a0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
43b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
43c0: 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
43d0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
43e0: 6e 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20  nPrefixReg      
43f0: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67     /* No. of reg
4400: 20 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74   prior to regDat
4410: 61 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  a available for 
4420: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  use */.){.  Vdbe
4430: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4440: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4460: 53 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  Stmt under const
4470: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
4480: 20 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d   bSeq = ((pSort-
4490: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
44a0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
44b0: 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ==0);.  int nExp
44c0: 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  r = pSort->pOrde
44d0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20  rBy->nExpr;     
44e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
44f0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
4500: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65  s */.  int nBase
4510: 20 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20   = nExpr + bSeq 
4520: 2b 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  + nData;        
4530: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
4540: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
4550: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  rd */.  int regB
4560: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73           /* Regs
4590: 20 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f   for sorter reco
45a0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  rd */.  int regR
45b0: 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65  ecord = ++pParse
45c0: 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
45d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65           /* Asse
45e0: 6d 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63  mbled sorter rec
45f0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42  ord */.  int nOB
4600: 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42  Sat = pSort->nOB
4610: 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44            /* ORD
4630: 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73  ER BY terms to s
4640: 6b 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  kip */.  int op;
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4670: 70 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72  pcode to add sor
4680: 74 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f  ter record to so
4690: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rter */.  int iL
46a0: 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46c0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f  LIMIT counter */
46d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71  ..  assert( bSeq
46e0: 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29  ==0 || bSeq==1 )
46f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74  ;.  assert( nDat
4700: 61 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d  a==1 || regData=
4710: 3d 72 65 67 4f 72 69 67 44 61 74 61 20 7c 7c 20  =regOrigData || 
4720: 72 65 67 4f 72 69 67 44 61 74 61 3d 3d 30 20 29  regOrigData==0 )
4730: 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  ;.  if( nPrefixR
4740: 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  eg ){.    assert
4750: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45  ( nPrefixReg==nE
4760: 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20  xpr+bSeq );.    
4770: 72 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74  regBase = regDat
4780: 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53 65 71  a - nExpr - bSeq
4790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
47a0: 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
47b0: 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70  >nMem + 1;.    p
47c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
47d0: 42 61 73 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Base;.  }.  asse
47e0: 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  rt( pSelect->iOf
47f0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65  fset==0 || pSele
4800: 63 74 2d 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b  ct->iLimit!=0 );
4810: 0a 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c  .  iLimit = pSel
4820: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  ect->iOffset ? p
4830: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
4840: 31 20 3a 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  1 : pSelect->iLi
4850: 6d 69 74 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61  mit;.  pSort->la
4860: 62 65 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  belDone = sqlite
4870: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4890: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
48a0: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64  rse, pSort->pOrd
48b0: 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 72  erBy, regBase, r
48c0: 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20 20  egOrigData,.    
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
48f0: 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69 67  L_DUP | (regOrig
4900: 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43 45  Data? SQLITE_ECE
4910: 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20 69  L_REF : 0));.  i
4920: 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73  f( bSeq ){.    s
4930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4940: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
4950: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4960: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4970: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65  ;.  }.  if( nPre
4980: 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44 61  fixReg==0 && nDa
4990: 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ta>0 ){.    sqli
49a0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
49b0: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
49c0: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 62   regBase+nExpr+b
49d0: 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d  Seq, nData);.  }
49e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
49f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4a00: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e  ecord, regBase+n
4a10: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
4a20: 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Sat, regRecord);
4a30: 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30 20  .  if( nOBSat>0 
4a40: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50 72  ){.    int regPr
4a50: 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20  evKey;   /* The 
4a60: 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c  first nOBSat col
4a70: 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65 76  umns of the prev
4a80: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
4a90: 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20  int addrFirst;  
4aa0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
4ab0: 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63  the OP_IfNot opc
4ac0: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ode */.    int a
4ad0: 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20  ddrJmp;      /* 
4ae0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
4af0: 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f  P_Jump opcode */
4b00: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
4b10: 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  ;      /* Opcode
4b20: 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20   that opens the 
4b30: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
4b40: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
4b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72  /* Number of sor
4b60: 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  ting key columns
4b70: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53  , including OP_S
4b80: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b  equence */.    K
4b90: 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20  eyInfo *pKI;    
4ba0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79   /* Original Key
4bb0: 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74  Info on the sort
4bc0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  er table */..   
4bd0: 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50   regPrevKey = pP
4be0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
4bf0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4c00: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
4c10: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70  .    nKey = nExp
4c20: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
4c30: 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66  t + bSeq;.    if
4c40: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ( bSeq ){.      
4c50: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
4c60: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c70: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61   OP_IfNot, regBa
4c80: 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20  se+nExpr); .    
4c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
4ca0: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4cb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4cc0: 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70  _SequenceTest, p
4cd0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43  .    }.    VdbeC
4cf0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d10: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
4d20: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67   regPrevKey, reg
4d30: 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  Base, pSort->nOB
4d40: 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20  Sat);.    pOp = 
4d50: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
4d60: 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53  (v, pSort->addrS
4d70: 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  ortIndex);.    i
4d80: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
4d90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
4da0: 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  turn;.    pOp->p
4db0: 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61  2 = nKey + nData
4dc0: 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d  ;.    pKI = pOp-
4dd0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
4de0: 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53    memset(pKI->aS
4df0: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49  ortOrder, 0, pKI
4e00: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a  ->nKeyField); /*
4e10: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74   Makes OP_Jump t
4e20: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4e30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4e40: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4e50: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4e60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4e70: 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20   pKI->nAllField 
4e80: 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  > pKI->nKeyField
4e90: 2b 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  +2 );.    pOp->p
4ea0: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79  4.pKeyInfo = key
4eb0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
4ec0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
4ed0: 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74  pOrderBy, nOBSat
4ee0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
4f10: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
4f20: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
4f30: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
4f40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4f50: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
4f60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4f70: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
4f80: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
4f90: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
4fa0: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
4fb0: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
4fc0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4fd0: 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  l(v);.    pSort-
4fe0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
4ff0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5010: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
5020: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
5030: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
5040: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
5050: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5060: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
5070: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
5080: 0a 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20  .    if( iLimit 
5090: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
50a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
50b0: 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
50c0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65  pSort->labelDone
50d0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
50e0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
50f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5100: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46  umpHere(v, addrF
5110: 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  irst);.    sqlit
5120: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
5130: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
5140: 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72  regPrevKey, pSor
5150: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5160: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5170: 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b  ere(v, addrJmp);
5180: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
5190: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
51a0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
51b0: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f   ){.    op = OP_
51c0: 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20  SorterInsert;.  
51d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
51e0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20  OP_IdxInsert;.  
51f0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
5200: 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
5210: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
5220: 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61     regBase+nOBSa
5250: 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29  t, nBase-nOBSat)
5260: 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29  ;.  if( iLimit )
5270: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
5280: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30 3b 0a      int r1 = 0;.
5290: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
52a0: 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69 74 20  sorter until it 
52b0: 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54 2b 4f  contains LIMIT+O
52c0: 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e 20 20  FFSET entries.  
52d0: 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20 20 20  (The iLimit.    
52e0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73 20 69  ** register is i
52f0: 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74 68 20  nitialized with 
5300: 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54 2b 4f  value of LIMIT+O
5310: 46 46 53 45 54 2e 29 20 20 41 66 74 65 72 20 74  FFSET.)  After t
5320: 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20 2a 2a  he sorter.    **
5330: 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c 65 74   fills up, delet
5340: 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e 74 72  e the least entr
5350: 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20  y in the sorter 
5360: 61 66 74 65 72 20 65 61 63 68 20 69 6e 73 65 72  after each inser
5370: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73 20 77  t..    ** Thus w
5380: 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d 6f 72  e never hold mor
5390: 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d 49 54  e than the LIMIT
53a0: 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69 6e 20  +OFFSET rows in 
53b0: 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65 20 2a  memory at once *
53c0: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  /.    addr = sql
53d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
53e0: 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  , OP_IfNotZero, 
53f0: 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
5400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5420: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72  v, OP_Last, pSor
5430: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
5440: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72    if( pSort->bOr
5450: 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29  deredInnerLoop )
5460: 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 2b 2b 70  {.      r1 = ++p
5470: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5490: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
54a0: 6e 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  n, pSort->iECurs
54b0: 6f 72 2c 20 6e 45 78 70 72 2c 20 72 31 29 3b 0a  or, nExpr, r1);.
54c0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
54d0: 74 28 28 76 2c 20 22 73 65 71 22 29 29 3b 0a 20  t((v, "seq"));. 
54e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
54f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5500: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
5510: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
5520: 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72  f( pSort->bOrder
5530: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
5540: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
5550: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 64 72 69  nner loop is dri
5560: 76 65 6e 20 62 79 20 61 6e 20 69 6e 64 65 78 20  ven by an index 
5570: 73 75 63 68 20 74 68 61 74 20 76 61 6c 75 65 73  such that values
5580: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74   from.      ** t
5590: 68 65 20 73 61 6d 65 20 69 74 65 72 61 74 69 6f  he same iteratio
55a0: 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  n of the inner l
55b0: 6f 6f 70 20 61 72 65 20 69 6e 20 73 6f 72 74 65  oop are in sorte
55c0: 64 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  d order, then.  
55d0: 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
55e0: 6c 79 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  ly jump to the n
55f0: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
5600: 20 61 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69   an inner loop i
5610: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  f the.      ** e
5620: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 63 75  ntry from the cu
5630: 72 72 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  rrent iteration 
5640: 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 69 6e 74  does not fit int
5650: 6f 20 74 68 65 20 74 6f 70 0a 20 20 20 20 20 20  o the top.      
5660: 2a 2a 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  ** LIMIT+OFFSET 
5670: 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
5680: 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  orter. */.      
5690: 69 6e 74 20 69 42 72 6b 20 3d 20 73 71 6c 69 74  int iBrk = sqlit
56a0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
56b0: 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20  r(v) + 2;.      
56c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56d0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 42  3(v, OP_Eq, regB
56e0: 61 73 65 2b 6e 45 78 70 72 2c 20 69 42 72 6b 2c  ase+nExpr, iBrk,
56f0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
5700: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5710: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
5720: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5730: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
5740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5750: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
5760: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
5770: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
5780: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
5790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
57a0: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
57b0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
57c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
57d0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
57e0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
57f0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5800: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
5810: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
5820: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
5830: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
5840: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
5850: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
5860: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
5870: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5880: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5890: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69  fPos, iOffset, i
58a0: 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64  Continue, 1); Vd
58b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
58c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
58d0: 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20  v, "OFFSET"));. 
58e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
58f0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
5900: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5910: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
5920: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
5930: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
5940: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
5950: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
5960: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
5970: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
5980: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
5990: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
59a0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
59b0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
59c0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
59d0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
59e0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
59f0: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
5a00: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
5a10: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
5a20: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
5a30: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
5a40: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
5a50: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
5a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
5a70: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
5a80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5a90: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5aa0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5ab0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
5ac0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
5ad0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
5ae0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
5af0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
5b00: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
5b10: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
5b20: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
5b30: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
5b40: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
5b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
5b60: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
5b70: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
5b80: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
5b90: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
5ba0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
5bb0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5bc0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
5bd0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5be0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5bf0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
5c00: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
5c10: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
5c20: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5c30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5c40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5c50: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
5c60: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
5c70: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5c80: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
5c90: 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e  Tab, r1, iMem, N
5ca0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5cb0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5cc0: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
5cd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
5ce0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5cf0: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
5d00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
5d10: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
5d20: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
5d30: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
5d40: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
5d50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
5d60: 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  b is negative, t
5d70: 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  hen the p->pELis
5d80: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
5d90: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
5da0: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
5db0: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5dc0: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5dd0: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5de0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5df0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5e00: 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c 69  cTab and p->pELi
5e10: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
5e20: 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 6e  .** to get the n
5e30: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5e40: 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74 69   and the collati
5e50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
5e60: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
5e70: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
5e80: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
5e90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
5eb0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5ec0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5ee0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
5ef0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5f00: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
5f10: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5f20: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5f30: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5f40: 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   if non-negative
5f50: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5f60: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5f70: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5f80: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5f90: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5fa0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5fb0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5fc0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5fd0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5fe0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5ff0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
6000: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
6010: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
6020: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6030: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
6040: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
6050: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
6060: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
6070: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
6080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6090: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
60a0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
60b0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
60c0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
60d0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
60e0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
60f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
6100: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
6110: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
6120: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6130: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6140: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6150: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6160: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6170: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6180: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6190: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
61a0: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
61b0: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
61c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61d0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
61e0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
61f0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
6200: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
6210: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
6220: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6230: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6240: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6250: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6260: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6270: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6280: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6290: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
62a0: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
62b0: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
62c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
62d0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
62e0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
62f0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
6300: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
6310: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
6320: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6330: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6340: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6350: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6360: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6370: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6380: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6390: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
63a0: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
63b0: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
63c0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
63d0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
63e0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
63f0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
6400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6410: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
6420: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6430: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6440: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6450: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
6460: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61  EList!=0 );.  ha
6470: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73  sDistinct = pDis
6480: 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63  tinct ? pDistinc
6490: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57  t->eTnctType : W
64a0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
64b0: 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20  OP;.  if( pSort 
64c0: 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  && pSort->pOrder
64d0: 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20  By==0 ) pSort = 
64e0: 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  0;.  if( pSort==
64f0: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
6500: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
6510: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b   iContinue!=0 );
6520: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
6530: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
6540: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a  Continue);.  }..
6550: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
6560: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
6570: 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43  .  */.  nResultC
6580: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
6590: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
65a0: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
65b0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
65c0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
65d0: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
65e0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
65f0: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6600: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6610: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6620: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6630: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6640: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6660: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
6670: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
6680: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6690: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
66a0: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
66b0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
66c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
66d0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
66e0: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
66f0: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6700: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6710: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6720: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6730: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6740: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6750: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6760: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
6770: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
6780: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
6790: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
67a0: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
67b0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
67c0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
67d0: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
67e0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
67f0: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6800: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6810: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6820: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6830: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6840: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6850: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6860: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
6870: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
6880: 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20  ol;.  regOrig = 
6890: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
68a0: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20  t->iSdst;.  if( 
68b0: 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20  srcTab>=0 ){.   
68c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
68d0: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
68e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
68f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
6900: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72  mn, srcTab, i, r
6910: 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20  egResult+i);.   
6920: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
6930: 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c 69  v, "%s", p->pELi
6940: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29  st->a[i].zName))
6950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
6960: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  if( eDest!=SRT_E
6970: 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20  xists ){.    /* 
6980: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
6990: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
69a0: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
69b0: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
69c0: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
69d0: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
69e0: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
69f0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38  d..    */.    u8
6a00: 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20   ecelFlags;.    
6a10: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
6a20: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
6a30: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
6a40: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6a50: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
6a60: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
6a70: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
6a80: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
6a90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
6aa0: 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61 73  if( pSort && has
6ab0: 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65  Distinct==0 && e
6ac0: 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54  Dest!=SRT_EphemT
6ad0: 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  ab && eDest!=SRT
6ae0: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
6af0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  /* For each expr
6b00: 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c  ession in p->pEL
6b10: 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ist that is a co
6b20: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
6b30: 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ion in.      ** 
6b40: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6b50: 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64  use (pSort->pOrd
6b60: 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20 61  erBy), set the a
6b70: 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20  ssociated .     
6b80: 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20   ** iOrderByCol 
6b90: 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72  value to one mor
6ba0: 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78  e than the index
6bb0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
6bc0: 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65   .      ** expre
6bd0: 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
6be0: 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70   sort-key that p
6bf0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
6c00: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
6c10: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c       ** This all
6c20: 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  ows the p->pELis
6c30: 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d  t field to be om
6c40: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
6c50: 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20  orted record,.  
6c60: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70      ** saving sp
6c70: 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c  ace and CPU cycl
6c80: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63  es.  */.      ec
6c90: 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  elFlags |= (SQLI
6ca0: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c  TE_ECEL_OMITREF|
6cb0: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
6cc0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
6cd0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70  ort->nOBSat; i<p
6ce0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
6cf0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6d00: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
6d10: 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53 6f      if( (j = pSo
6d20: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt->pOrderBy->a[
6d30: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
6d40: 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ol)>0 ){.       
6d50: 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b     p->pEList->a[
6d60: 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  j-1].u.x.iOrderB
6d70: 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74  yCol = i+1-pSort
6d80: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20  ->nOBSat;.      
6d90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6da0: 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20    regOrig = 0;. 
6db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
6dc0: 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65  st==SRT_Set || e
6dd0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20  Dest==SRT_Mem . 
6de0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65            || eDe
6df0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6e00: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
6e10: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a  Output );.    }.
6e20: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
6e30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6e40: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6e50: 70 2d 3e 70 45 4c 69 73 74 2c 72 65 67 52 65 73  p->pEList,regRes
6e60: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
6e90: 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  ecelFlags);.  }.
6ea0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
6eb0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
6ec0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
6ed0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6ee0: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
6ef0: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
6f00: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
6f10: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
6f20: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
6f30: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
6f40: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
6f50: 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63  nct ){.    switc
6f60: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
6f70: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
6f80: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
6f90: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
6fa0: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
6fb0: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
6fc0: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
6fd0: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
6fe0: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
6ff0: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7010: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
7020: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
7030: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
7040: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
7050: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
7060: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
7070: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
7080: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
7090: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
70a0: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
70b0: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
70c0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
70d0: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  sultCol;..      
70e0: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
70f0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7100: 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
7110: 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20  o an OP_Null.   
7120: 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65       ** sets the
7130: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74   MEM_Cleared bit
7140: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65   on the first re
7150: 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20  gister of the.  
7160: 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
7170: 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77  s value.  This w
7180: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50  ill cause the OP
7190: 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77  _Ne below to alw
71a0: 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ays.        ** f
71b0: 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ail on the first
71c0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
71d0: 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74  e loop even if t
71e0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
71f0: 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e   ** row is all N
7200: 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ULLs..        */
7210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7220: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
7230: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
7240: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
7250: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
7260: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73  dbeGetOp(v, pDis
7270: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
7280: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ;.        pOp->o
7290: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
72a0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
72b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
72c0: 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b  p->p2 = regPrev;
72d0: 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ..        iJump 
72e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
72f0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52  rentAddr(v) + nR
7300: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20  esultCol;.      
7310: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
7320: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
7330: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
7340: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
7350: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
7360: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
7370: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
7380: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
7390: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
73a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
73b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
73c0: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
73d0: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
73e0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
73f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7400: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7410: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
7420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7430: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
7440: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
7450: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
7460: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
7470: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
74a0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
74b0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
74c0: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
74d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
74e0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
74f0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
7500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7520: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
7530: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
7540: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
7550: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
7560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7570: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
7580: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
7590: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
75a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
75b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
75c0: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
75d0: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
75e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
75f0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
7600: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7610: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
7620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7630: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
7640: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7650: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
7660: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
7670: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
7680: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
7690: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
76a0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
76b0: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
76c0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
76f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7700: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7710: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
7720: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
7730: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
7740: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
7750: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
7760: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
7770: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
7780: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
7790: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
77a0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
77b0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
77c0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
77d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
77e0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
77f0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
7800: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
7810: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
7820: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7830: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7850: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
7860: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
7870: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
7880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7890: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
78a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
78b0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
78c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
78d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
78e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
78f0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
7900: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7910: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
7920: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
7930: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
7940: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
7950: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
7960: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
7970: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
7980: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
7990: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
79a0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
79b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
79c0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
79d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
79e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
79f0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
7a00: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7a10: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  tCol);.      bre
7a20: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
7a30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7a40: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
7a50: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  */..    /* Store
7a60: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
7a70: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
7a80: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
7a90: 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f     case SRT_Fifo
7aa0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
7ab0: 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  istFifo:.    cas
7ac0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
7ad0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
7ae0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
7af0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7b00: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7b10: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
7b20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7b30: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
7b40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7b50: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
7b60: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
7b70: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7b80: 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  ==SRT_Fifo );.  
7b90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ba0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
7bb0: 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  o );.      sqlit
7bc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
7be0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7bf0: 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78  tCol, r1+nPrefix
7c00: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
7c10: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7c20: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
7c30: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20  RT_DistFifo ){. 
7c40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7c50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
7c60: 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63  DistFifo, then c
7c70: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
7c80: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
7c90: 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72  ** on an ephemer
7ca0: 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  al index. If the
7cb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
7cc0: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a  already present.
7cd0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
7ce0: 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20  e index, do not 
7cf0: 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
7d00: 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20  output. If not, 
7d10: 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  add the.        
7d20: 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74  ** current row t
7d30: 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  o the index and 
7d40: 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69  proceed with wri
7d50: 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20  ting it to the. 
7d60: 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
7d70: 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20   table as well. 
7d80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7d90: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
7da0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
7db0: 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71   + 4;.        sq
7dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7dd0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
7de0: 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72  iParm+1, addr, r
7df0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 0);.        V
7e00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7e20: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
7e30: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7e40: 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73  arm+1, r1,regRes
7e50: 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  ult,nResultCol);
7e60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e70: 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20   pSort==0 );.   
7e80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7e90: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
7ea0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
7eb0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
7ec0: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
7ed0: 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c  ixReg,regResult,
7ee0: 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  1,nPrefixReg);. 
7ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7f00: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
7f10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
7f20: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
7f30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7f40: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7f50: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
7f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7f80: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
7f90: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
7fa0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7fb0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
7fc0: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
7fd0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7fe0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
7ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8000: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8010: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
8020: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
8030: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8040: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
8050: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
8060: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
8070: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
8080: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
8090: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
80a0: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
80b0: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
80c0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
80d0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
80e0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
80f0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
8100: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
8110: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
8120: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8130: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
8140: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
8150: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
8160: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
8170: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
8180: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
8190: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
81a0: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
81b0: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
81c0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
81d0: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
81e0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
81f0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
8200: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
8210: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
8220: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
8230: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
8240: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
8250: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
8260: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
8270: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
8280: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
8290: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
82a0: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
82b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
82c0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
82d0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
82e0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
82f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
8300: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
8310: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
8320: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
8330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8340: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8350: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8360: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
8370: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
8380: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
8390: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
83a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
83b0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
83c0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
83d0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
83e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
83f0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
8400: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8410: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
8420: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8430: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8440: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8450: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
8460: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8470: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
8480: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
8490: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
84a0: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
84b0: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
84c0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
84d0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
84e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
84f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8500: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
8510: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
8520: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
8530: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
8540: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
8550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8560: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
8570: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
8580: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
8590: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
85a0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
85b0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
85c0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
85d0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
85e0: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
85f0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8600: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
8610: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
8620: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8630: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
8640: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8650: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
8660: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
8670: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
8680: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
8690: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
86a0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
86b0: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
86c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
86d0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
86e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
86f0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
8700: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
8710: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8720: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
8730: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
8740: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
8750: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
8760: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
8770: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
8780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8790: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
87a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
87b0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
87c0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
87d0: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
87e0: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
87f0: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
8800: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
8810: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
8820: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
8830: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
8840: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
8850: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
8860: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8870: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
8880: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8890: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
88a0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
88b0: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
88c0: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
88d0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
8900: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8910: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8920: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
8930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8940: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
8950: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
8960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8980: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8990: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
89a0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
89b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
89c0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
89d0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
89e0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
89f0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
8a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a10: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8a20: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
8a30: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
8a40: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
8a50: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
8a60: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
8a70: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
8a80: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
8a90: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
8aa0: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
8ab0: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
8ac0: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
8ad0: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
8ae0: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
8af0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
8b00: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
8b10: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
8b20: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
8b30: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
8b40: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
8b50: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
8b60: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
8b70: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
8b80: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
8b90: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
8ba0: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
8bb0: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
8bc0: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
8bd0: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
8be0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
8bf0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
8c00: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
8c10: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
8c20: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
8c30: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
8c40: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
8c50: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
8c60: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
8c70: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
8c80: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
8c90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8ca0: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
8cb0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
8cc0: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
8cd0: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
8ce0: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
8cf0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8d00: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8d10: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
8d20: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
8d30: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
8d40: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
8d50: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
8d60: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
8d70: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
8d80: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
8d90: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
8da0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
8db0: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
8dc0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
8dd0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
8de0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8df0: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
8e00: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
8e30: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8e40: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
8e50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8e60: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8e70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8e80: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8e90: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8ea0: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
8eb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8ec0: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
8ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ee0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8ef0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
8f00: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
8f10: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8f20: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
8f30: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
8f40: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
8f50: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
8f60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8f70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8f80: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
8fb0: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
8fc0: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
8ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9010: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
9020: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
9030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9040: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
9050: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
9060: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
9070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9080: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
9090: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
90a0: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
90b0: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
90c0: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
90d0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
90e0: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
90f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
9100: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9110: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9120: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
9130: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
9140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9150: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
9160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
9170: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
9180: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
9190: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
91a0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
91b0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
91c0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
91d0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
91e0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
91f0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
9200: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
9210: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
9220: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
9230: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
9240: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
9250: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
9260: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
9270: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
9280: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
9290: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
92a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
92b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
92c0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
92d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
92e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
92f0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
9300: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
9310: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
9320: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
9330: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
9340: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
9350: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
9360: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
9370: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
9380: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
9390: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
93a0: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
93b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
93c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
93d0: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
93e0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
93f0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
9400: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
9410: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
9420: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
9430: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
9440: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
9450: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
9460: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
9470: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
9480: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
9490: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
94a0: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
94b0: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
94c0: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
94d0: 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43  *)+1) - sizeof(C
94e0: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49  ollSeq*);.  KeyI
94f0: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
9500: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9510: 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  , sizeof(KeyInfo
9520: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
9530: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
9540: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
9550: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
9560: 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c  .    p->nKeyFiel
9570: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
9580: 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28  p->nAllField = (
9590: 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70  u16)(N+X);.    p
95a0: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
95b0: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
95c0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
95d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
95e0: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
95f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
9600: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
9610: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
9630: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
9640: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
9650: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
9660: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
9670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
9680: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
9690: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
96a0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
96b0: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
96c0: 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70  bFreeNN(p->db, p
96d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
96e0: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
96f0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
9700: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
9710: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
9720: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
9730: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
9740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
9750: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
9760: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
9770: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
9780: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
9790: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
97a0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
97b0: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
97c0: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
97d0: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
97e0: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
97f0: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
9800: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
9810: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
9820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9830: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
9840: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
9850: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
9860: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
9870: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
9880: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
9890: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
98a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
98b0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
98c0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
98d0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
98e0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
98f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
9900: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
9910: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
9920: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
9930: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
9940: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
9950: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
9960: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
9970: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
9980: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
9990: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
99a0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
99b0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
99c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
99d0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
99e0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
99f0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
9a00: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
9a10: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
9a20: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
9a30: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
9a40: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
9a50: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
9a60: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
9a70: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
9a80: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
9a90: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
9aa0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
9ab0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
9ac0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
9ad0: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
9ae0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
9af0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
9b00: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
9b10: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
9b20: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
9b30: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
9b40: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
9b50: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
9b60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9b70: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
9b80: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9b90: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9ba0: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
9bb0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9bc0: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
9bd0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
9be0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
9bf0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
9c00: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
9c10: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
9c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9c30: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
9c40: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
9c50: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
9c60: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
9c70: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
9c80: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9c90: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
9ca0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9cb0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
9cc0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
9cd0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
9ce0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9cf0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
9d00: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
9d10: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
9d20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9d30: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
9d40: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
9d50: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
9d60: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
9d70: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
9d80: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9d90: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
9da0: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
9db0: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
9dc0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
9dd0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
9de0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
9df0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
9e00: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
9e10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9e20: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
9e30: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
9e40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
9e50: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
9e60: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
9e70: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
9e80: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
9e90: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
9ea0: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
9eb0: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
9ec0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
9ed0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
9ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9ef0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
9f00: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
9f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9f20: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
9f30: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
9f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
9f50: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
9f60: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
9f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
9f80: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
9f90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9fa0: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
9fb0: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
9fc0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
9fd0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
9fe0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
9ff0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
a000: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
a010: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
a020: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
a030: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
a040: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
a050: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
a060: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
a070: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
a080: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
a090: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
a0a0: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
a0b0: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
a0c0: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
a0d0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
a0e0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
a0f0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
a100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a110: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
a120: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
a140: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
a150: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
a160: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
a170: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a180: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
a190: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
a1a0: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
a1b0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
a1c0: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
a1d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a1e0: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
a1f0: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
a200: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
a210: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
a220: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
a230: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
a240: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
a250: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
a260: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
a270: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
a280: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
a290: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
a2a0: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
a2b0: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
a2c0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
a2d0: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
a2e0: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
a2f0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
a300: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
a310: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
a320: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
a330: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
a340: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
a350: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
a360: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
a370: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
a380: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
a390: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
a3a0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
a3b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
a3c0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
a3d0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
a3e0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
a3f0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
a400: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
a410: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
a420: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
a430: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a440: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
a450: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a460: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
a470: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
a480: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
a490: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
a4a0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
a4b0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
a4c0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
a4d0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
a4e0: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
a4f0: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
a500: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
a510: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
a520: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
a530: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
a540: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
a550: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
a560: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
a570: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
a580: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
a590: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
a5a0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
a5b0: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
a5c0: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
a5d0: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
a5e0: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
a5f0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
a600: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
a610: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
a620: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
a630: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
a640: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
a650: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
a660: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
a670: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
a680: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
a690: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
a6a0: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
a6b0: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
a6c0: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
a6d0: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
a6e0: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
a6f0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
a700: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
a710: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
a720: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
a730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
a760: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
a790: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
a7a0: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
a7b0: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7d0: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
a7e0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
a810: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
a820: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
a830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a840: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
a850: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
a860: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
a870: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
a880: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
a890: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
a8a0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
a8b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
a8c0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
a8d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a8e0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
a8f0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
a900: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
a910: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
a920: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
a930: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
a940: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
a950: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
a960: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
a970: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
a980: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
a990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a9a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a9b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a9c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a9d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a9e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
a9f0: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
aa00: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
aa10: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
aa20: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
aa30: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
aa40: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
aa50: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
aa60: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
aa70: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
aa80: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
aa90: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
aaa0: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
aab0: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
aac0: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
aad0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
aae0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
aaf0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
ab00: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
ab10: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
ab20: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
ab30: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
ab40: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
ab50: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
ab60: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
ab70: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
ab80: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
ab90: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
aba0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
abb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
abc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
abd0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
abe0: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
abf0: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
ac00: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
ac10: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
ac20: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
ac30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
ac40: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
ac50: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
ac60: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
ac70: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
ac80: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
ac90: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
aca0: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
acb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
acc0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
acd0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
ace0: 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d  drBreak = pSort-
acf0: 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20  >labelDone;     
ad00: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
ad10: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
ad20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
ad30: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
ad40: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ad50: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
ad60: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
ad70: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
ad80: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
ad90: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
ada0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
adb0: 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  By = pSort->pOrd
adc0: 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73  erBy;.  int eDes
add0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
ade0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
adf0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
ae00: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
ae10: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20  int regRowid;.  
ae20: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20  int iCol;.  int 
ae30: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
ae40: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
ae60: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
ae70: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
ae80: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
ae90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
aea0: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
aeb0: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
aec0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  r */.  int i;.  
aed0: 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20  int bSeq;       
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65  /* True if sorte
af00: 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65  r record include
af10: 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20  s seq. no. */.  
af20: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
af30: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
af40: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20  ->pEList->a;..  
af50: 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65 61  assert( addrBrea
af60: 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53 6f  k<0 );.  if( pSo
af70: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
af80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
af90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
afa0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
afb0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
afc0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
afd0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
afe0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
aff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b000: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
b010: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
b020: 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53  .  }.  iTab = pS
b030: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  ort->iECursor;. 
b040: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b050: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
b060: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
b070: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
b080: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64   ){.    regRowid
b090: 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77   = 0;.    regRow
b0a0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
b0b0: 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d  .    nSortData =
b0c0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
b0d0: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
b0e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b0f0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
b100: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
b110: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
b120: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
b130: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
b140: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20 20 6e  nColumn;.  }.  n
b150: 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Key = pOrderBy->
b160: 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e  nExpr - pSort->n
b170: 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f  OBSat;.  if( pSo
b180: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
b190: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
b1a0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  er ){.    int re
b1b0: 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61  gSortOut = ++pPa
b1c0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
b1d0: 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73 65  SortTab = pParse
b1e0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66  ->nTab++;.    if
b1f0: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
b200: 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Out ){.      add
b210: 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56  rOnce = sqlite3V
b220: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
b230: 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
b240: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
b250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b260: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
b270: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
b280: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
b290: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
b2a0: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
b2b0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
b2c0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
b2d0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
b2e0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
b2f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
b300: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
b310: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
b320: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b330: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b340: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b350: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
b360: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b370: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
b380: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
b390: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
b3a0: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
b3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
b3c0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
b3d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
b3e0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
b3f0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
b400: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
b410: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
b420: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
b430: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
b440: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
b450: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
b460: 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b  (i=0, iCol=nKey+
b470: 62 53 65 71 3b 20 69 3c 6e 53 6f 72 74 44 61 74  bSeq; i<nSortDat
b480: 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  a; i++){.    int
b490: 20 69 52 65 61 64 3b 0a 20 20 20 20 69 66 28 20   iRead;.    if( 
b4a0: 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f  aOutEx[i].u.x.iO
b4b0: 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20  rderByCol ){.   
b4c0: 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45     iRead = aOutE
b4d0: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
b4e0: 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  yCol-1;.    }els
b4f0: 65 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d  e{.      iRead =
b500: 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iCol++;.    }. 
b510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b520: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b530: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65  n, iSortTab, iRe
b540: 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  ad, regRow+i);. 
b550: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b560: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
b570: 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45  i].zName ? aOutE
b580: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
b590: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
b5a0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
b5b0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
b5c0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
b5d0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
b5e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b5f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b600: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
b610: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
b620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b630: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
b640: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
b650: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
b660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
b670: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
b680: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
b690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
b6a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
b6c0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
b6d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
b6e0: 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72  lumn==sqlite3Str
b6f0: 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66  len30(pDest->zAf
b700: 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20 20  fSdst) );.      
b710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b720: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
b730: 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  rd, regRow, nCol
b740: 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20  umn, regRowid,. 
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 41         pDest->zA
b770: 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  ffSdst, nColumn)
b780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b790: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
b7a0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
b7b0: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
b7c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b7d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
b7e0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
b7f0: 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65  rm, regRowid, re
b800: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  gRow, nColumn);.
b810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b820: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
b830: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  Mem: {.      /* 
b840: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
b850: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
b860: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
b870: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
b880: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b890: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b8a0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b8b0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
b8c0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b8d0: 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65  ine ); .      te
b8e0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
b8f0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
b900: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
b910: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
b920: 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  e );.      if( e
b930: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b940: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b950: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b960: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
b970: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
b980: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
b990: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
b9a0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
b9b0: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64  arse, pDest->iSd
b9c0: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
b9d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b9f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
ba00: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
ba10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ba20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ba30: 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64  }.  if( regRowid
ba40: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73   ){.    if( eDes
ba50: 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20  t==SRT_Set ){.  
ba60: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ba70: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
ba80: 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  se, regRow, nCol
ba90: 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  umn);.    }else{
baa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
bab0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
bac0: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
bad0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
bae0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
baf0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
bb00: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f  .  }.  /* The bo
bb10: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
bb20: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
bb30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
bb40: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
bb50: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  ;.  if( pSort->s
bb60: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
bb70: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
bb80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bb90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
bba0: 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  terNext, iTab, a
bbb0: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
bbc0: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
bbd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bbe0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
bbf0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
bc00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
bc10: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d    }.  if( pSort-
bc20: 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c  >regReturn ) sql
bc30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
bc40: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f  , OP_Return, pSo
bc50: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  rt->regReturn);.
bc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
bc70: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
bc80: 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rBreak);.}../*.*
bc90: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
bca0: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
bcb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
bcc0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
bcd0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
bce0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
bcf0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
bd00: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
bd10: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
bd20: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74  **.** Also try t
bd30: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73  o estimate the s
bd40: 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ize of the retur
bd50: 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65  ned value and re
bd60: 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73  turn that.** res
bd70: 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74  ult in *pEstWidt
bd80: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  h..**.** The dec
bd90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
bda0: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
bdb0: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
bdc0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
bdd0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
bde0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
bdf0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
be00: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
be10: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
be20: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
be30: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
be40: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
be50: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
be60: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
be70: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
be80: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
be90: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
bea0: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
beb0: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
bec0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
bed0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
bee0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
bef0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
bf00: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
bf10: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
bf20: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
bf30: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
bf40: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
bf50: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
bf60: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
bf70: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
bf80: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
bf90: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
bfa0: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
bfb0: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
bfc0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
bfd0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
bfe0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
bff0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
c000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c010: 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20  tine has either 
c020: 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72  3 or 6 parameter
c030: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  s depending on w
c040: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
c050: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
c060: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c070: 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TA compile-time 
c080: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
c090: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
c0a0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c0b0: 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65  ETADATA.# define
c0c0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
c0d0: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
c0e0: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
c0f0: 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66  E,F).#else /* if
c100: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c110: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c120: 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65  ETADATA) */.# de
c130: 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28  fine columnType(
c140: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c  A,B,C,D,E,F) col
c150: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
c160: 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  F).#endif.static
c170: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
c180: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
c190: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
c1a0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
c1b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c1c0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c1d0: 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68  ADATA.  const ch
c1e0: 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20  ar **pzOrigDb,. 
c1f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
c200: 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74  OrigTab,.  const
c210: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f   char **pzOrigCo
c220: 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a  l,.#endif.  u8 *
c230: 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63  pEstWidth.){.  c
c240: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
c250: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
c260: 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31   u8 estWidth = 1
c270: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c280: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c290: 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f  TADATA.  char co
c2a0: 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  nst *zOrigDb = 0
c2b0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
c2c0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
c2d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
c2e0: 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  gCol = 0;.#endif
c2f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
c300: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
c310: 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
c320: 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  =0 );.  switch( 
c330: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
c340: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
c350: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
c360: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
c370: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c380: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
c390: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
c3a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
c3b0: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
c3c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
c3d0: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
c3e0: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
c3f0: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
c400: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
c410: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
c420: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
c430: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
c440: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
c450: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
c460: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
c470: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
c480: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
c490: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c4a0: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
c4b0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
c4c0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
c4d0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
c4e0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
c4f0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
c500: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
c510: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
c520: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
c530: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
c540: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
c550: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
c560: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
c570: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
c580: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
c590: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
c5a0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
c5b0: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
c5c0: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
c5d0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
c5e0: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
c5f0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
c600: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
c610: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
c620: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
c630: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
c640: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
c650: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
c660: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
c670: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
c680: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
c690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c6a0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
c6b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
c6c0: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
c6d0: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
c6e0: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
c6f0: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
c700: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
c710: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
c720: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
c730: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
c740: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
c750: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
c760: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
c770: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
c780: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
c790: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
c7a0: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
c7b0: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
c7c0: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
c7d0: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
c7e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
c7f0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
c800: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
c810: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
c820: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
c830: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
c840: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
c850: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
c860: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
c870: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
c880: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
c890: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
c8a0: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
c8b0: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
c8c0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
c8d0: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
c8e0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
c8f0: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
c900: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
c910: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
c920: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
c930: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c940: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
c950: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
c960: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
c970: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
c980: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
c990: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
c9a0: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
c9b0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
c9c0: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
c9d0: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
c9e0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
c9f0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
ca00: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
ca10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
ca20: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
ca30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ca40: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
ca50: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
ca60: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
ca70: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
ca80: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
ca90: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
caa0: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
cab0: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
cac0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
cad0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
cae0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
caf0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
cb00: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
cb10: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
cb20: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
cb30: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
cb40: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
cb50: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
cb60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
cb70: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d  l>=0 && iCol<pS-
cb80: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
cb90: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
cba0: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
cbb0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
cbc0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
cbd0: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
cbe0: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
cbf0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
cc00: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
cc10: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
cc20: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
cc30: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
cc40: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
cc50: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
cc60: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
cc70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
cc80: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
cc90: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
cca0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
ccb0: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
ccc0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
ccd0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
cce0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
ccf0: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
cd00: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
cd10: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
cd20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
cd30: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
cd40: 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c  sNC, p,&zOrigDb,
cd50: 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67  &zOrigTab,&zOrig
cd60: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
cd70: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
cd80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
cd90: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
cda0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
cdb0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
cdc0: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
cdd0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cde0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
cdf0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
ce00: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
ce10: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
ce20: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
ce30: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
ce40: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
ce50: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
ce60: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
ce70: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
ce80: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
ce90: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
cea0: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
ceb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cec0: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
ced0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
cee0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
cef0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
cf00: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
cf10: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
cf20: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
cf30: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
cf40: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
cf50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
cf60: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
cf70: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
cf80: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
cf90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
cfa0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
cfb0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
cfc0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
cfd0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
cfe0: 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20        zOrigDb = 
cff0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
d000: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
d010: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
d020: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
d030: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d040: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
d050: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
d060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d070: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
d080: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
d090: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
d0a0: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
d0b0: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
d0c0: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
d0d0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
d0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d0f0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
d100: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
d110: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
d120: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
d130: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
d140: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
d150: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
d160: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d170: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
d180: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
d190: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
d1a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d1b0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
d1c0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
d1d0: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
d1e0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
d1f0: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
d200: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
d210: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
d220: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
d230: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
d240: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
d250: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
d260: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
d270: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
d280: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
d290: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
d2a0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
d2b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
d2c0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
d2d0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d2e0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
d2f0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
d300: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
d310: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
d320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d330: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
d340: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d350: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
d360: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
d370: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d380: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
d390: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
d3a0: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
d3b0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
d3c0: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
d3d0: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
d3e0: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
d3f0: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
d400: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
d410: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
d420: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
d430: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d440: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
d450: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
d460: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d470: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
d480: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d490: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
d4a0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
d4b0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
d4c0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
d4d0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
d4e0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
d4f0: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
d500: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
d510: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
d520: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d530: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
d540: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
d550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d560: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
d570: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
d580: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
d590: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
d5a0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
d5b0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
d5c0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
d5d0: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  arse;.  sNC.pNex
d5e0: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 0;.  for(i=0
d5f0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d600: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d610: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
d620: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
d630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
d640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d650: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
d660: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
d670: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
d680: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
d690: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
d6a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
d6b0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
d6c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d6d0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d6e0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
d6f0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
d700: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
d710: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
d720: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
d730: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
d740: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
d750: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
d760: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
d770: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
d780: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
d790: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
d7a0: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
d7b0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
d7c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d7d0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d7e0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
d7f0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
d800: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
d810: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d820: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d830: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
d840: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
d850: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
d860: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d870: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
d880: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
d890: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d8a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
d8b0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d8c0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
d8d0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
d8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d8f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d900: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
d910: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
d920: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
d930: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
d940: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
d950: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
d960: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
d970: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
d980: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
d990: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
d9a0: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
d9b0: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
d9c0: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
d9d0: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
d9e0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
d9f0: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
da00: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
da10: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
da20: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
da30: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
da40: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
da50: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
da60: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
da70: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
da80: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
da90: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
daa0: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
dab0: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
dac0: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
dad0: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
dae0: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
daf0: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
db00: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
db10: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
db20: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
db30: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
db40: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
db50: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
db60: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
db70: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
db80: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
db90: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
dba0: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
dbb0: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
dbc0: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
dbd0: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
dbe0: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
dbf0: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
dc00: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
dc10: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
dc20: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
dc30: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
dc40: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
dc50: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
dc60: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
dc70: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
dc80: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
dc90: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
dca0: 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
dcb0: 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
dcc0: 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
dcf0: 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
dd00: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
dd10: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
dd40: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
dd50: 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
dd60: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
dd70: 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
dd80: 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
dd90: 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
dda0: 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
ddb0: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
ddc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
dde0: 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
ddf0: 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
de00: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
de30: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
de40: 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
de50: 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
de80: 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
de90: 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
dea0: 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
deb0: 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
dec0: 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
ded0: 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
dee0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
def0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
df10: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
df20: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
df30: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
df40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
df60: 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
df70: 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
df80: 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
df90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
dfa0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
dfb0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
dfc0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
dfd0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
dfe0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
dff0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
e000: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
e010: 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
e020: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
e030: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
e040: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
e050: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
e060: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
e070: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
e080: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
e090: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e0a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
e0b0: 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
e0c0: 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
e0d0: 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
e0e0: 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
e0f0: 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
e100: 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
e110: 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
e120: 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
e130: 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
e140: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e150: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
e160: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
e170: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
e180: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
e190: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
e1a0: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
e1b0: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
e1c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
e1d0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e  NamesSet || db->
e1e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
e1f0: 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75  eturn;.  /* Colu
e200: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64 65 74  mn names are det
e210: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6c  ermined by the l
e220: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
e230: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
e240: 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  ct */.  while( p
e250: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
e260: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
e270: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 70 54  ct->pPrior;.  pT
e280: 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  abList = pSelect
e290: 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
e2a0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
e2b0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  st;.  assert( v!
e2c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e2d0: 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pTabList!=0 );. 
e2e0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
e2f0: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
e300: 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  Name = (db->flag
e310: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
e320: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
e330: 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c  rcName = (db->fl
e340: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
e350: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 7c  rtColNames)!=0 |
e360: 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73 71  | fullName;.  sq
e370: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
e380: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
e390: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
e3a0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
e3b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
e3c0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
e3d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20  [i].pExpr;..    
e3e0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
e3f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
e400: 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
e410: 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f 63   );  /* Agg proc
e420: 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74 20 72  essing has not r
e430: 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20 61 73  un yet */.    as
e440: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
e450: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54 61  COLUMN || p->pTa
e460: 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72  b!=0 ); /* Cover
e470: 69 6e 67 20 69 64 78 20 6e 6f 74 20 79 65 74 20  ing idx not yet 
e480: 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  coded */.    if(
e490: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
e4a0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
e4b0: 41 6e 20 41 53 20 63 6c 61 75 73 65 20 61 6c 77  An AS clause alw
e4c0: 61 79 73 20 74 61 6b 65 73 20 66 69 72 73 74 20  ays takes first 
e4d0: 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20  priority */.    
e4e0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
e4f0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
e500: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
e510: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
e520: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
e530: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
e540: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
e550: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 72 63 4e    }else if( srcN
e560: 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b  ame && p->op==TK
e570: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
e580: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
e590: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
e5a0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
e5b0: 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a  pTab = p->pTab;.
e5c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e5d0: 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab!=0 );.      i
e5e0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
e5f0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
e600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
e610: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
e620: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
e630: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
e640: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
e650: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
e660: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
e670: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
e680: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
e690: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
e6a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c  }.      if( full
e6b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
e6c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
e6d0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e6e0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e6f0: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
e700: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
e710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e720: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
e730: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
e740: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
e750: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
e760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e770: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e780: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
e790: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
e7a0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
e7b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e7c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
e7d0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69  t char *z = pELi
e7e0: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
e7f0: 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f        z = z==0 ?
e800: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e810: 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  db, "column%d", 
e820: 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62  i+1) : sqlite3Db
e830: 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20  StrDup(db, z);. 
e840: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e850: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e860: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
e870: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e880: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67  );.    }.  }.  g
e890: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
e8a0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
e8b0: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ist, pEList);.}.
e8c0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
e8d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e8e0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
e8f0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
e900: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
e910: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
e920: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
e930: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
e940: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
e950: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
e960: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
e970: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
e980: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
e990: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
e9a0: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
e9b0: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
e9c0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
e9d0: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
e9e0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
e9f0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
ea00: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
ea10: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
ea20: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
ea30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
ea40: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
ea50: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
ea60: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
ea70: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
ea80: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
ea90: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
eaa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
eab0: 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c  M..**.** The onl
eac0: 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  y guarantee that
ead0: 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62   SQLite makes ab
eae0: 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  out column names
eaf0: 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a   is that if the.
eb00: 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e  ** column has an
eb10: 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67   AS clause assig
eb20: 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20  ning it a name, 
eb30: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65  that will be the
eb40: 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54   name used..** T
eb50: 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  hat is the only 
eb60: 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61  documented guara
eb70: 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  ntee.  However, 
eb80: 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63  countless applic
eb90: 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f  ations.** develo
eba0: 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61  ped over the yea
ebb0: 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73  rs have made bas
ebc0: 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e  eless assumption
ebd0: 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
ebe0: 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c  ames.** and will
ebf0: 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20   break if those 
ec00: 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e  assumptions chan
ec10: 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65  ges.  Hence, use
ec20: 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e   extreme caution
ec30: 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69  .** when modifyi
ec40: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
ec50: 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e  to avoid breakin
ec60: 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20  g legacy..**.** 
ec70: 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61  See Also: genera
ec80: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a  teColumnNames().
ec90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
eca0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
ecb0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
ecc0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ecd0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
ece0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
ecf0: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
ed00: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
ed10: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
ed20: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
ed30: 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   i16 *pnCol,    
ed40: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
ed50: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
ed60: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
ed70: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
ed80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
ed90: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
eda0: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
edb0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
edc0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
edd0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
ede0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
edf0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
ee00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ee10: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33  counters */.  u3
ee20: 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  2 cnt;          
ee30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ee40: 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65  ex added to make
ee50: 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65   the name unique
ee60: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
ee70: 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  ol, *pCol;      
ee80: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
ee90: 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c   over result col
eea0: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  umns */.  int nC
eeb0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
eec0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
eed0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
eee0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
eef0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef10: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
ef20: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef40: 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e   Size of name in
ef50: 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61   zName[] */.  Ha
ef60: 73 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20  sh ht;          
ef70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
ef80: 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d  h table of colum
ef90: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71  n names */..  sq
efa0: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68  lite3HashInit(&h
efb0: 74 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  t);.  if( pEList
efc0: 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   ){.    nCol = p
efd0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
efe0: 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    aCol = sqlite3
eff0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f000: 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29   sizeof(aCol[0])
f010: 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74  *nCol);.    test
f020: 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b  case( aCol==0 );
f030: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
f040: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c  ol = 0;.    aCol
f050: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
f060: 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e  rt( nCol==(i16)n
f070: 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20  Col );.  *pnCol 
f080: 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c  = nCol;.  *paCol
f090: 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28   = aCol;..  for(
f0a0: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
f0b0: 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d  i<nCol && !db->m
f0c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b  allocFailed; i++
f0d0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
f0e0: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
f0f0: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
f100: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
f110: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
f120: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
f130: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
f140: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
f150: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
f160: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
f170: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
f180: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
f190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
f1a0: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71  r *pColExpr = sq
f1b0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
f1c0: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
f1d0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
f1e0: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
f1f0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
f200: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
f210: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
f220: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
f230: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
f240: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f250: 20 69 66 28 20 28 70 43 6f 6c 45 78 70 72 2d 3e   if( (pColExpr->
f260: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
f270: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
f280: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 0a 20 20  K_AGG_COLUMN).  
f290: 20 20 20 20 20 26 26 20 70 43 6f 6c 45 78 70 72       && pColExpr
f2a0: 2d 3e 70 54 61 62 21 3d 30 20 0a 20 20 20 20 20  ->pTab!=0 .     
f2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
f2c0: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
f2d0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
f2e0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
f2f0: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
f300: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
f310: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
f320: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
f330: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
f340: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
f350: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
f360: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c      zName = iCol
f370: 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  >=0 ? pTab->aCol
f380: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22  [iCol].zName : "
f390: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
f3a0: 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72  lse if( pColExpr
f3b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
f3c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
f3d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f3e0: 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74  pColExpr, EP_Int
f3f0: 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
f400: 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78    zName = pColEx
f410: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
f420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f430: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
f440: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
f450: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
f460: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
f470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   */.        zNam
f480: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
f490: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a  .zSpan;.      }.
f4a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e      }.    if( zN
f4b0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61  ame ){.      zNa
f4c0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
f4d0: 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  rDup(db, zName);
f4e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f4f0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
f500: 33 4d 50 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c  3MPrintf(db,"col
f510: 75 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20  umn%d",i+1);.   
f520: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
f530: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
f540: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
f550: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
f560: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
f570: 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74  ** append an int
f580: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
f590: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
f5a0: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
f5b0: 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  */.    cnt = 0;.
f5c0: 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
f5d0: 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46   && sqlite3HashF
f5e0: 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21  ind(&ht, zName)!
f5f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d  =0 ){.      nNam
f600: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
f610: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
f620: 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b    if( nName>0 ){
f630: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e  .        for(j=n
f640: 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73  Name-1; j>0 && s
f650: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
f660: 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a  ame[j]); j--){}.
f670: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
f680: 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[j]==':' ) nNam
f690: 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  e = j;.      }. 
f6a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
f6b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
f6c0: 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65  "%.*z:%u", nName
f6d0: 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b  , zName, ++cnt);
f6e0: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33  .      if( cnt>3
f6f0: 20 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f   ) sqlite3_rando
f700: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74  mness(sizeof(cnt
f710: 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a  ), &cnt);.    }.
f720: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
f730: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  = zName;.    sql
f740: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
f750: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20  tiesFromName(0, 
f760: 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  pCol);.    if( z
f770: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
f780: 61 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a  ashInsert(&ht, z
f790: 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f  Name, pCol)==pCo
f7a0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
f7b0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
f7c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
f7d0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74  te3HashClear(&ht
f7e0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
f7f0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f800: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
f810: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
f820: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
f830: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
f840: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
f850: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a  Free(db, aCol);.
f860: 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a      *paCol = 0;.
f870: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a      *pnCol = 0;.
f880: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f890: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
f8a0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
f8b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
f8c0: 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  dd type and coll
f8d0: 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
f8e0: 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69  n to a column li
f8f0: 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  st based on.** a
f900: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f910: 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  t..** .** The co
f920: 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d  lumn list presum
f930: 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73  ably came from s
f940: 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  electColumnNames
f950: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a  FromExprList()..
f960: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
f970: 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65  st has only name
f980: 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20  s, not types or 
f990: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69  collations.  Thi
f9a0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65  s.** routine goe
f9b0: 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64  s through and ad
f9c0: 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64  ds the types and
f9d0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   collations..**.
f9e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f9f0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c  requires that al
fa00: 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  l identifiers in
fa10: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73   the SELECT.** s
fa20: 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f  tatement be reso
fa30: 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lved..*/.void sq
fa40: 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
fa50: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
fa60: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
fa70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
fa80: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
fa90: 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  s */.  Table *pT
faa0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
fab0: 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  Add column type 
fac0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
fad0: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  his table */.  S
fae0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
faf0: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75       /* SELECT u
fb00: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
fb10: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
fb20: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  tions */.){.  sq
fb30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
fb40: 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f  se->db;.  NameCo
fb50: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c  ntext sNC;.  Col
fb60: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c  umn *pCol;.  Col
fb70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
fb80: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b  nt i;.  Expr *p;
fb90: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
fba0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36  st_item *a;.  u6
fbb0: 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20  4 szAll = 0;..  
fbc0: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21  assert( pSelect!
fbd0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fbe0: 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61  (pSelect->selFla
fbf0: 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
fc00: 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
fc10: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53  ( pTab->nCol==pS
fc20: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
fc30: 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
fc40: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
fc50: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
fc60: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  ed ) return;.  m
fc70: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
fc80: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
fc90: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
fca0: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61  elect->pSrc;.  a
fcb0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
fcc0: 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30  st->a;.  for(i=0
fcd0: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
fce0: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
fcf0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
fd00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fd10: 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c  Type;.    int n,
fd20: 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d   m;.    p = a[i]
fd30: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70  .pExpr;.    zTyp
fd40: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
fd50: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
fd60: 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a   &pCol->szEst);.
fd70: 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f      szAll += pCo
fd80: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43  l->szEst;.    pC
fd90: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
fda0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
fdb0: 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  ty(p);.    if( z
fdc0: 54 79 70 65 20 26 26 20 28 6d 20 3d 20 73 71 6c  Type && (m = sql
fdd0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
fde0: 70 65 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  pe))>0 ){.      
fdf0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
fe00: 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  n30(pCol->zName)
fe10: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
fe20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52  ame = sqlite3DbR
fe30: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c  eallocOrFree(db,
fe40: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b   pCol->zName, n+
fe50: 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+2);.      if( 
fe60: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pCol->zName ){. 
fe70: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
fe80: 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c  Col->zName[n+1],
fe90: 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20   zType, m+1);.  
fea0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
feb0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
fec0: 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d  HASTYPE;.      }
fed0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
fee0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
fef0: 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
ff00: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
ff10: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  LOB;.    pColl =
ff20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
ff30: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
ff40: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
ff50: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20   pCol->zColl==0 
ff60: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
ff70: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
ff80: 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
ff90: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
ffa0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61    }.  pTab->szTa
ffb0: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
ffc0: 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d  gEst(szAll*4);.}
ffd0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
ffe0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fff0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
10000 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
10010 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
10020 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
10030 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
10040 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
10050 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
10060 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10070 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
10080 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
10090 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
100a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
100b0 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a  nt savedFlags;..
100c0 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64    savedFlags = d
100d0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e  b->flags;.  db->
100e0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
100f0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
10100 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
10110 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
10120 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  es;.  sqlite3Sel
10130 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
10140 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10150 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
10160 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
10170 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
10180 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
10190 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
101a0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20  ;.  db->flags = 
101b0 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54  savedFlags;.  pT
101c0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
101d0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
101e0 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
101f0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
10200 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10210 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
10220 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
10230 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65  ct() is only use
10240 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65  d n contexts whe
10250 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a  re lookaside.  *
10260 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  * is disabled */
10270 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
10280 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
10290 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  e );.  pTab->nTa
102a0 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  bRef = 1;.  pTab
102b0 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
102c0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
102d0 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
102e0 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
102f0 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
10300 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
10310 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
10320 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
10330 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
10340 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
10350 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
10360 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
10370 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
10380 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
10390 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
103a0 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
103b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
103c0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
103d0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
103e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
103f0 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
10400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
10410 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
10420 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
10430 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
10440 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
10450 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
10460 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
10470 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
10480 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
10490 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
104a0 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
104b0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
104c0 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  f( pParse->pVdbe
104d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
104e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
104f0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
10500 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20  pToplevel==0.   
10510 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
10520 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
10530 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
10540 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20  utConst).  ){.  
10550 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
10560 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d  tFactor = 1;.  }
10570 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10580 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
10590 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  se);.}.../*.** C
105a0 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
105b0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
105c0 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
105d0 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
105e0 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
105f0 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
10600 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
10610 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
10620 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
10630 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
10640 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
10650 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
10660 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
10670 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
10680 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
10690 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
106a0 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
106b0 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
106c0 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
106d0 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
106e0 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
106f0 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
10700 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
10710 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
10720 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
10730 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
10740 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
10750 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
10760 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
10770 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10780 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
10790 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
107a0 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
107b0 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
107c0 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
107d0 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
107e0 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
107f0 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
10800 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
10810 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
10820 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
10830 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20  alues (zero).** 
10840 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
10850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
10860 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74  *.** The iOffset
10870 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74   register (if it
10880 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74   exists) is init
10890 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
108a0 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f  alue.** of the O
108b0 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d  FFSET.  The iLim
108c0 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69  it register is i
108d0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
108e0 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a  MIT.  Register.*
108f0 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69  * iOffset+1 is i
10900 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
10910 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  MIT+OFFSET..**.*
10920 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
10930 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
10940 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
10950 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
10960 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
10970 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
10980 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
10990 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
109a0 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
109b0 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
109c0 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
109d0 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
109e0 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
109f0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
10a00 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
10a10 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
10a20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
10a30 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
10a40 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
10a50 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
10a60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
10a70 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  set;.  int n;.  
10a80 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
10a90 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
10aa0 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
10ab0 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
10ac0 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
10ad0 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
10ae0 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
10af0 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
10b00 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
10b10 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
10b20 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
10b30 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
10b40 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
10b50 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
10b60 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
10b70 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
10b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
10b90 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
10ba0 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
10bb0 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
10bc0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
10bd0 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
10be0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
10bf0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
10c00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73  pParse);.    ass
10c10 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
10c20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
10c30 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
10c40 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
10c50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10c60 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
10c70 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
10c80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10c90 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
10ca0 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
10cb0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
10cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
10cd0 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  o(v, iBreak);.  
10ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
10cf0 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
10d00 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73  Row>sqlite3LogEs
10d10 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20  t((u64)n) ){.   
10d20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
10d30 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
10d40 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20  st((u64)n);.    
10d50 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
10d60 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  |= SF_FixedLimit
10d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10d80 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10d90 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10da0 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
10db0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
10dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10dd0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
10de0 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
10df0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10e00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10e10 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
10e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10e40 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
10e50 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
10e60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
10e70 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73      if( p->pOffs
10e80 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  et ){.      p->i
10e90 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
10ea0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10eb0 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
10ec0 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
10ed0 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
10ee0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
10ef0 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
10f00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10f10 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
10f20 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b  ffset, iOffset);
10f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10f40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
10f50 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65  ustBeInt, iOffse
10f60 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
10f70 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
10f80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
10f90 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
10fa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10fb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
10fc0 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  setLimit, iLimit
10fd0 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f 66  , iOffset+1, iOf
10fe0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  fset);.      Vdb
10ff0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
11000 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
11010 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
11020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11030 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
11040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11050 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
11060 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
11070 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
11080 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
11090 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
110a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
110b0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
110c0 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
110d0 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
110e0 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
110f0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
11100 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
11110 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11120 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
11130 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
11140 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
11150 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
11160 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
11170 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
11180 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
11190 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
111a0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
111b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
111c0 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
111d0 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
111e0 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
111f0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
11200 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
11210 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
11220 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
11230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
11240 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
11250 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
11260 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20  .  /* iCol must 
11270 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e  be less than p->
11280 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20  pEList->nExpr.  
11290 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  Otherwise an err
112a0 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61  or would.  ** ha
112b0 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20 64  ve been thrown d
112c0 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c  uring name resol
112d0 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75  ution and we wou
112e0 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74 74  ld not have gott
112f0 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 72  en.  ** this far
11300 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   */.  if( pRet==
11310 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c  0 && ALWAYS(iCol
11320 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
11330 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  r) ){.    pRet =
11340 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
11350 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
11360 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
11370 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
11380 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
11390 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
113a0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
113b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
113c0 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70  ameter is a comp
113d0 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77  ound SELECT.** w
113e0 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
113f0 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e  clause. This fun
11400 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
11410 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65  and returns a Ke
11420 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  yInfo.** structu
11430 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  re suitable for 
11440 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
11450 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a   ORDER BY..**.**
11460 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
11470 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
11480 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64  ture is obtained
11490 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68   from malloc. Th
114a0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
114b0 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
114c0 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
114d0 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
114e0 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
114f0 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f  lly.** freed..*/
11500 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
11510 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65  *multiSelectOrde
11520 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  rByKeyInfo(Parse
11530 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
11540 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29   *p, int nExtra)
11550 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
11560 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
11570 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  erBy;.  int nOrd
11580 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
11590 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c  By->nExpr;.  sql
115a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
115b0 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f  e->db;.  KeyInfo
115c0 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
115d0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
115e0 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61   nOrderBy+nExtra
115f0 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74  , 1);.  if( pRet
11600 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
11610 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
11620 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
11630 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
11640 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
11650 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  = &pOrderBy->a[i
11660 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ];.      Expr *p
11670 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Term = pItem->pE
11680 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  xpr;.      CollS
11690 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20  eq *pColl;..    
116a0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
116b0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
116c0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
116d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
116e0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54  llSeq(pParse, pT
116f0 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  erm);.      }els
11700 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e{.        pColl
11710 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
11720 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
11730 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
11740 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  erByCol-1);.    
11750 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
11760 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
11770 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
11780 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
11790 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  .pExpr =.       
117a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
117b0 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70  dCollateString(p
117c0 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43  Parse, pTerm, pC
117d0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
117e0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
117f0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
11800 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52 65  oIsWriteable(pRe
11810 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74  t) );.      pRet
11820 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
11830 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e  ll;.      pRet->
11840 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
11850 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
11860 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
11870 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
11880 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  et;.}..#ifndef S
11890 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
118a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
118b0 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45  e generates VDBE
118c0 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65   code to compute
118d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
118e0 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45  a WITH RECURSIVE
118f0 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65  .** query of the
11900 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c   form:.**.**   <
11910 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e  recursive-table>
11920 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72   AS (<setup-quer
11930 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c  y> UNION [ALL] <
11940 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e  recursive-query>
11950 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
11970 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
11980 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
11990 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20       p.**.**.** 
119e0 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79  There is exactly
119f0 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
11a00 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  o the recursive-
11a10 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
11a20 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72  M clause.** of r
11a30 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20  ecursive-query, 
11a40 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20  marked with the 
11a50 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e  SrcList->a[].fg.
11a60 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67  isRecursive flag
11a70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75  ..**.** The setu
11a80 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63  p-query runs onc
11a90 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
11aa0 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20   initial set of 
11ab0 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20  rows that go.** 
11ac0 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62  into a Queue tab
11ad0 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78  le.  Rows are ex
11ae0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
11af0 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65   Queue table one
11b00 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63   by.** one.  Eac
11b10 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20  h row extracted 
11b20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75  from Queue is ou
11b30 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20  tput to pDest.  
11b40 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a  Then the single.
11b50 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77  ** extracted row
11b60 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75   (now in the iCu
11b70 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63  rrent table) bec
11b80 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  omes the content
11b90 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72   of the.** recur
11ba0 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61  sive-table for a
11bb0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
11bc0 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75   run.  The outpu
11bd0 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  t of the recursi
11be0 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61  ve-query.** is a
11bf0 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  dded back into t
11c00 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
11c10 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f   Then another ro
11c20 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  w is extracted f
11c30 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64  rom Queue.** and
11c40 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63   the iteration c
11c50 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74  ontinues until t
11c60 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
11c70 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
11c80 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
11c90 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73  uery operator is
11ca0 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64   UNION then no d
11cb0 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72  uplicate rows ar
11cc0 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74  e ever.** insert
11cd0 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ed into the Queu
11ce0 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44  e table.  The iD
11cf0 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65  istinct table ke
11d00 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c  eps a copy of al
11d10 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68  l rows.** that h
11d20 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e  ave ever been in
11d30 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75  serted into Queu
11d40 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75 70  e and causes dup
11d50 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a  licates to be.**
11d60 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 20   discarded.  If 
11d70 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  the operator is 
11d80 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20  UNION ALL, then 
11d90 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20 61  duplicates are a
11da0 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49  llowed..** .** I
11db0 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20  f the query has 
11dc0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
11dd0 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  n entries in the
11de0 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72 65   Queue table are
11df0 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45   kept in.** ORDE
11e00 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74  R BY order and t
11e10 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
11e20 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72 20  s extracted for 
11e30 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74  each cycle.  Wit
11e40 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52  hout.** an ORDER
11e50 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20 74   BY, the Queue t
11e60 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46  able is just a F
11e70 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  IFO..**.** If a 
11e80 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20  LIMIT clause is 
11e90 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74  provided, then t
11ea0 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f  he iteration sto
11eb0 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72  ps after LIMIT r
11ec0 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ows.** have been
11ed0 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74   output to pDest
11ee0 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65  .  A LIMIT of ze
11ef0 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  ro means to outp
11f00 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61  ut no rows and a
11f10 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d  .** negative LIM
11f20 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  IT means to outp
11f30 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66  ut all rows.  If
11f40 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   there is also a
11f50 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
11f60 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74 69  ** with a positi
11f70 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  ve value, then t
11f80 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
11f90 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73 63  outputs are disc
11fa0 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20  arded rather.** 
11fb0 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20  than being sent 
11fc0 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c  to pDest.  The L
11fd0 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20  IMIT count does 
11fe0 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20  not begin until 
11ff0 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20  after OFFSET.** 
12000 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 73  rows have been s
12010 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
12020 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57  c void generateW
12030 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72  ithRecursiveQuer
12040 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
12050 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
12060 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12070 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
12080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12090 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
120a0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
120b0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
120c0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
120d0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
120e0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
120f0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
12100 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f   p->pSrc;      /
12110 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
12120 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  e of the recursi
12130 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ve query */.  in
12140 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  t nCol = p->pELi
12150 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e  st->nExpr;  /* N
12160 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
12170 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
12180 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62  e table */.  Vdb
12190 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
121a0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
121b0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
121c0 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
121d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ruction */.  Sel
121e0 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d  ect *pSetup = p-
121f0 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68  >pPrior;   /* Th
12200 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f  e setup query */
12210 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
12240 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
12250 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
12260 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e  ;      /* CONTIN
12270 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64  UE and BREAK add
12280 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20  resses */.  int 
12290 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  iCurrent = 0;   
122a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
122b0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
122c0 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72 65  /.  int regCurre
122d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
122e0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
122f0 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61  lding Current ta
12300 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75  ble */.  int iQu
12310 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  eue;            
12320 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75         /* The Qu
12330 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
12340 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30  nt iDistinct = 0
12350 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12360 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65  To ensure unique
12370 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f   results if UNIO
12380 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  N */.  int eDest
12390 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20   = SRT_Fifo;    
123a0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77       /* How to w
123b0 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f  rite to Queue */
123c0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
123d0 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20 20  stQueue;        
123e0 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74   /* SelectDest t
123f0 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51 75  argetting the Qu
12400 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
12410 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12430 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12440 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
12470 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
12480 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
12490 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
124a0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
124b0 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
124c0 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  fset;       /* S
124d0 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f  aved LIMIT and O
124e0 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72  FFSET */.  int r
124f0 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73  egLimit, regOffs
12500 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69  et;      /* Regi
12510 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c 49  sters used by LI
12520 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
12530 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
12540 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
12550 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20 71  do a recursive q
12560 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71  uery */.  if( sq
12570 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
12580 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
12590 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30  CURSIVE, 0, 0, 0
125a0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
125b0 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49  * Process the LI
125c0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
125d0 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79 20  lauses, if they 
125e0 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42  exist */.  addrB
125f0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
12600 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12610 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
12620 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c  = 320;  /* 4 bil
12630 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63  lion rows */.  c
12640 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
12650 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
12660 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c  addrBreak);.  pL
12670 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
12680 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d  ;.  pOffset = p-
12690 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c  >pOffset;.  regL
126a0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
126b0 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
126c0 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
126d0 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66  >pLimit = p->pOf
126e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  fset = 0;.  p->i
126f0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
12700 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
12710 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12720 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
12730 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
12740 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
12750 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
12760 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
12770 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
12780 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
12790 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
127a0 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
127b0 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
127c0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
127d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
127e0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
127f0 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
12800 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
12810 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
12820 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
12830 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
12840 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
12850 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
12860 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
12870 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
12880 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
12890 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
128a0 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
128b0 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
128c0 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
128d0 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
128e0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
128f0 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
12900 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
12910 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
12920 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
12930 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
12940 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
12950 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
12960 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
12970 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
12980 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
12990 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
129a0 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
129b0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
129c0 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
129d0 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
129e0 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
129f0 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
12a00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12a20 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
12a30 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
12a40 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
12a50 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
12a60 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
12a70 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
12a80 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
12a90 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
12aa0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
12ab0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12ac0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
12ad0 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
12ae0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
12b10 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
12b20 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
12b30 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
12b40 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
12b50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b60 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
12b70 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
12b80 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
12b90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
12ba0 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
12bb0 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
12bc0 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
12bd0 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
12be0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12bf0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
12c00 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
12c10 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
12c20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
12c30 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
12c40 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
12c50 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
12c60 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
12c70 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
12c80 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
12c90 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
12ca0 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
12cb0 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
12cc0 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
12cd0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
12ce0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
12cf0 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74  e, pSetup, &dest
12d00 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70  Queue);.  pSetup
12d10 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69  ->pNext = p;.  i
12d20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
12d30 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
12d40 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ery;..  /* Find 
12d50 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
12d60 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75  the Queue and ou
12d70 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f  tput that row */
12d80 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
12d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12da0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75  , OP_Rewind, iQu
12db0 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  eue, addrBreak);
12dc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12dd0 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  ;..  /* Transfer
12de0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
12df0 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43   Queue over to C
12e00 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  urrent */.  sqli
12e10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12e20 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75   OP_NullRow, iCu
12e30 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65  rrent); /* To re
12e40 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  set column cache
12e50 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
12e60 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
12e70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12e80 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65  P_Column, iQueue
12e90 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
12ea0 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29  r+1, regCurrent)
12eb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
12ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12ed0 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20  (v, OP_RowData, 
12ee0 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65  iQueue, regCurre
12ef0 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
12f00 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12f10 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75  OP_Delete, iQueu
12f20 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  e);..  /* Output
12f30 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
12f40 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  in Current */.  
12f50 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
12f60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
12f70 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  v);.  codeOffset
12f80 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61  (v, regOffset, a
12f90 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65  ddrCont);.  sele
12fa0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
12fb0 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c  se, p, iCurrent,
12fc0 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65  .      0, 0, pDe
12fd0 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
12fe0 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
12ff0 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
13000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13010 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
13020 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
13030 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
13040 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13050 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
13060 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13070 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
13080 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
13090 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
130a0 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
130b0 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
130c0 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
130d0 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
130e0 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
130f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
13100 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
13110 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
13120 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
13130 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
13140 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13150 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72   "recursive aggr
13160 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f  egate queries no
13170 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  t supported");. 
13180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70   }else{.    p->p
13190 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73  Prior = 0;.    s
131a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
131b0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
131c0 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ue);.    assert(
131d0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
131e0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
131f0 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20   pSetup;.  }..  
13200 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20  /* Keep running 
13210 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74  the loop until t
13220 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74  he Queue is empt
13230 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
13240 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f  beGoto(v, addrTo
13250 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  p);.  sqlite3Vdb
13260 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
13270 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e   addrBreak);..en
13280 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
13290 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45  uery:.  sqlite3E
132a0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
132b0 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72  arse->db, p->pOr
132c0 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72  derBy);.  p->pOr
132d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
132e0 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
132f0 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66  pLimit;.  p->pOf
13300 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
13310 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
13320 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
13330 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  T_CTE */../* For
13340 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
13350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
13360 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
13370 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13380 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
13390 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
133a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
133b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
133c0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
133d0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
133e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
133f0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
13400 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
13410 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
13420 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  );../*.** Handle
13430 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
13440 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  e of a compound-
13450 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
13460 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a  inates from a.**
13470 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20   VALUES clause. 
13480 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69   By handling thi
13490 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  s as a special c
134a0 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65  ase, we avoid de
134b0 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c  ep.** recursion,
134c0 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74   and thus do not
134d0 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65   need to enforce
134e0 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
134f0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
13500 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53  T.** on a VALUES
13510 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42   clause..**.** B
13520 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63  ecause the Selec
13530 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61  t object origina
13540 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45  tes from a VALUE
13550 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28  S clause:.**   (
13560 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d  1) It has no LIM
13570 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20  IT or OFFSET.** 
13580 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20    (2) All terms 
13590 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a  are UNION ALL.**
135a0 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20     (3) There is 
135b0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
135c0 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
135d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
135e0 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
135f0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
13600 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13610 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
13620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13630 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
13640 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
13650 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
13660 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
13670 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
13680 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
13690 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
136a0 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52 6f  Prior;.  int nRo
136b0 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20  w = 1;.  int rc 
136c0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
136d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
136e0 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20  MultiValue );.  
136f0 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
13700 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13710 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61  _Values );.    a
13720 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
13730 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d  _ALL || (p->op==
13740 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e  TK_SELECT && p->
13750 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20  pPrior==0) );.  
13760 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
13770 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  mit==0 );.    as
13780 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
13790 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
137a0 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c  t( p->pNext==0 |
137b0 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
137c0 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45  pr==p->pNext->pE
137d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
137e0 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72     if( p->pPrior
137f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
13800 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
13810 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a  or->pNext==p );.
13820 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f      p = p->pPrio
13830 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20  r;.    nRow++;. 
13840 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77 68   }while(1);.  wh
13850 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70 50  ile( p ){.    pP
13860 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
13870 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
13880 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
13890 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
138a0 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
138b0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
138c0 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 72  Prior;.    if( r
138d0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  c ) break;.    p
138e0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
138f0 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
13900 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
13910 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13930 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
13940 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
13950 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
13960 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
13970 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
13980 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
13990 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
139a0 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
139b0 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
139c0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
139d0 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
139e0 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
139f0 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
13a00 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
13a10 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
13a20 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
13a30 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
13a40 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
13a50 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
13a60 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
13a70 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
13a80 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
13a90 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
13aa0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
13ab0 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
13ac0 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
13ad0 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
13ae0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
13af0 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
13b00 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
13b10 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
13b20 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
13b30 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
13b40 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
13b50 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
13b60 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
13b70 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
13b80 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
13b90 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
13ba0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
13bb0 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
13bc0 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
13bd0 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
13be0 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
13bf0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
13c00 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
13c10 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
13c20 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
13c30 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
13c40 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
13c50 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
13c60 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
13c70 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
13c80 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
13c90 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
13ca0 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
13cb0 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
13cc0 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
13cd0 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
13ce0 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
13cf0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
13d00 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
13d10 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
13d20 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
13d30 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
13d40 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
13d50 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
13d60 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
13d70 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
13d80 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
13d90 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
13da0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
13db0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
13dc0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
13dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13de0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
13df0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
13e00 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
13e10 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
13e20 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
13e30 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
13e40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
13e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
13e60 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
13e70 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
13e80 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
13e90 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
13ea0 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
13eb0 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
13ec0 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
13ed0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
13ee0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13ef0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
13f00 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
13f10 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
13f20 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
13f30 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
13f40 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
13f50 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
13f60 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
13f70 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
13f80 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
13f90 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
13fa0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
13fb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13fc0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
13fd0 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
13fe0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
13ff0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
14000 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
14010 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
14020 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
14030 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
14040 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
14050 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
14060 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
14070 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
14080 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
14090 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
140a0 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
140b0 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
140c0 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
140d0 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
140e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
140f0 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
14100 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
14110 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
14120 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
14130 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
14140 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
14150 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
14160 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
14170 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
14180 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14190 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
141a0 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
141b0 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
141c0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c  ior->pOrderBy ||
141d0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
141e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
141f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
14200 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  s clause should 
14210 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
14220 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
14230 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
14240 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59  y!=0 ? "ORDER BY
14250 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c  " : "LIMIT", sel
14260 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
14270 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
14280 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14290 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
142a0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
142b0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
142c0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
142d0 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65  /* The VDBE alre
142e0 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63  ady created by c
142f0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
14300 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  */..  /* Create 
14310 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
14320 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
14330 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
14340 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65  /.  if( dest.eDe
14350 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
14360 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14370 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
14380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14390 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
143a0 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44  emeral, dest.iSD
143b0 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
143c0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73  >nExpr);.    des
143d0 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
143e0 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ble;.  }..  /* S
143f0 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
14400 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  for a compound-s
14410 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
14420 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45  nates as a VALUE
14430 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  S clause..  */. 
14440 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
14450 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
14460 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
14470 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70  tiSelectValues(p
14480 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
14490 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
144a0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
144b0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
144c0 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
144d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
144e0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
144f0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
14500 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
14510 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
14520 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14530 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
14540 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74  List );.  assert
14550 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
14560 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr==pPrior->pELi
14570 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69  st->nExpr );..#i
14580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14590 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73  T_CTE.  if( p->s
145a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
145b0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65  ursive ){.    ge
145c0 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
145d0 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c  iveQuery(pParse,
145e0 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65   p, &dest);.  }e
145f0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  lse.#endif..  /*
14600 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
14610 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
14620 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
14630 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
14640 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
14650 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
14660 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
14670 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
14680 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
14690 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
146a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
146b0 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
146c0 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
146d0 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
146e0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
146f0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
14700 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
14710 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
14720 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
14730 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
14740 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
14750 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
14760 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20   p->iLimit;.    
14770 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
14780 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
14790 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
147a0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
147b0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
147c0 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
147d0 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c  fset;.      expl
147e0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
147f0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
14800 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14810 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14820 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
14830 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
14840 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14850 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  0;.      p->pOff
14860 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
14870 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14880 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
14890 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
148a0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
148b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  = 0;.      p->iL
148c0 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
148d0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
148e0 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
148f0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
14900 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
14910 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  {.        addr =
14920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14930 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
14940 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
14950 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14960 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
14970 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
14980 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
14990 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d"));.        if
149a0 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ( p->iOffset ){.
149b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
149c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
149d0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20  P_OffsetLimit,. 
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4c             p->iL
14a00 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74  imit, p->iOffset
14a10 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  +1, p->iOffset);
14a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14a30 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
14a40 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
14a50 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
14a60 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
14a70 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
14a80 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
14a90 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
14aa0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14ab0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
14ac0 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
14ad0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
14ae0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
14af0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
14b00 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
14b10 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
14b20 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
14b30 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28  tRow);.      if(
14b40 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
14b50 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
14b60 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
14b70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
14b80 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
14b90 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
14ba0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
14bb0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
14bc0 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
14bd0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
14be0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14bf0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
14c00 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
14c10 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
14c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14c30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14c40 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
14c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14c60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
14c70 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
14c80 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
14c90 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
14ca0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
14cb0 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
14cc0 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
14cd0 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
14ce0 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
14cf0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
14d00 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
14d10 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
14d20 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
14d30 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
14d40 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
14d50 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
14d60 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
14d70 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
14d80 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
14d90 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
14da0 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
14db0 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
14dc0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
14dd0 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
14de0 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
14df0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
14e00 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
14e10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
14e20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
14e30 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
14e40 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
14e50 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
14e60 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
14e70 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
14e80 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
14e90 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
14ea0 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
14eb0 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
14ec0 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
14ed0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14ee0 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
14ef0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
14f00 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
14f10 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
14f20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14f30 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
14f40 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
14f50 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
14f60 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
14f70 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
14f80 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
14f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
14fa0 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
14fb0 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
14fc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
14fd0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
14fe0 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
14ff0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
15000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15010 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
15020 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
15030 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
15040 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
15050 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
15060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15070 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
15080 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
15090 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
150a0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
150b0 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
150c0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
150d0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
150e0 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
150f0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
15100 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
15110 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
15120 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15130 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
15140 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
15150 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15160 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
15170 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
15180 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
15190 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
151a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
151b0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
151c0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
151d0 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  Tab);.      expl
151e0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
151f0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
15200 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
15210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
15220 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
15230 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
15240 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
15250 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
15260 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15270 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15280 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
15290 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
152a0 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
152b0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
152c0 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
152d0 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
152e0 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
152f0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
15300 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
15310 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
15320 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
15330 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
15340 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
15350 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
15360 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
15370 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
15380 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
15390 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
153a0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
153b0 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
153c0 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78  t = op;.      ex
153d0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
153e0 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
153f0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
15400 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15410 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
15420 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
15430 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
15450 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
15460 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
15470 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
15480 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
15490 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
154a0 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
154b0 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
154c0 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
154d0 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
154e0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
154f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
15500 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
15510 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
15520 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
15530 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
15540 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
15550 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
15560 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
15570 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
15580 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
15590 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
155a0 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
155b0 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
155c0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
155d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
155e0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
155f0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
15600 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
15610 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
15620 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
15630 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
15640 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
15650 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
15660 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
15670 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
15680 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
15690 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
156a0 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
156b0 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
156c0 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
156d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
156e0 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
156f0 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
15700 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
15710 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
15720 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
15730 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
15740 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
15750 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
15760 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
15770 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
15780 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15790 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
157a0 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
157b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
157c0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
157d0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
157e0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
157f0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
15800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15810 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
15820 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20  onTab, iBreak); 
15830 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15840 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
15850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
15860 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
15870 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
15880 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15890 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20  unionTab,.      
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
158c0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
158d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
158e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
158f0 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
15900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15910 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15920 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
15930 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15940 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
15950 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15960 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
15970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15990 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
159a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
159b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
159c0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
159d0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
159e0 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
159f0 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
15a00 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
15a10 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
15a20 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
15a30 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
15a40 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
15a50 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
15a60 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
15a70 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
15a80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
15a90 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
15aa0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
15ab0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
15ac0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
15ad0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15ae0 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
15af0 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
15b00 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
15b10 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
15b20 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
15b30 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
15b40 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
15b50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
15b60 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
15b70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
15b80 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
15b90 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
15ba0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
15bb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
15bc0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
15bd0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
15be0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
15bf0 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
15c00 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
15c10 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
15c20 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
15c30 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
15c40 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
15c50 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
15c60 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
15c70 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
15c80 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
15c90 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
15ca0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
15cb0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
15cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15cd0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
15ce0 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
15cf0 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
15d00 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15d10 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
15d20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15d30 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15d40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15d50 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
15d60 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
15d70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
15d80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
15d90 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
15da0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15db0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
15dc0 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
15dd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
15de0 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
15df0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15e00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15e10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15e20 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
15e30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
15e40 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
15e50 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
15e60 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
15e70 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
15e80 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15e90 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
15ea0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
15eb0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
15ec0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
15ed0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
15ee0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
15ef0 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
15f00 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
15f10 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
15f20 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
15f30 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
15f40 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
15f50 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
15f60 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
15f70 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
15f80 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
15f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15fa0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
15fb0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
15fc0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
15fd0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
15fe0 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
15ff0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
16000 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
16010 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
16020 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
16030 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
16040 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
16050 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
16060 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
16070 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
16080 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
16090 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
160a0 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
160b0 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
160c0 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
160d0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
160e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
160f0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
16100 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
16110 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16120 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
16130 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16140 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
16150 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
16160 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
16170 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
16180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16190 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
161a0 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
161b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
161c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
161d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
161e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
161f0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
16200 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
16210 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72 31  owData, tab1, r1
16220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16230 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
16240 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
16250 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
16260 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16270 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16280 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16290 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
162a0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
162b0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61  op(pParse, p, ta
162c0 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b1,.            
162d0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
162e0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
162f0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
16300 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16310 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
16320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
16340 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
16350 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16360 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16370 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16380 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
16390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
163a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
163b0 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
163c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
163d0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
163e0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
163f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16400 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d   }..  explainCom
16410 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
16420 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
16430 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  b2, p->op!=TK_AL
16440 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  L);..  /* Comput
16450 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
16460 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
16470 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
16480 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
16490 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
164a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
164b0 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
164c0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
164d0 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
164e0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
164f0 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
16500 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
16510 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
16520 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
16530 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
16540 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
16550 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
16560 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
16570 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
16580 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
16590 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
165a0 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
165b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
165c0 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
165d0 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
165e0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
165f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
16600 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
16610 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
16640 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
16650 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
16660 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
16670 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
16680 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
16690 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
166a0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
166b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
166c0 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
166d0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
166e0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
166f0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
16700 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
16710 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
16720 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
16730 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
16760 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
16770 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
16780 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
16790 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
167a0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
167b0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
167c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
167d0 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
167e0 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
167f0 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
16800 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
16810 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
16820 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
16830 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
16840 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
16850 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
16860 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
16870 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
16880 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
16890 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
168a0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
168b0 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
168c0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
168d0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
168e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
168f0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
16900 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
16910 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
16920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
16930 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
16940 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
16950 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
16960 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
16970 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
16980 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
16990 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
169a0 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
169b0 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
169c0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
169d0 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
169e0 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
169f0 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
16a00 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
16a10 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
16a20 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
16a30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
16a40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
16a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16a60 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
16a70 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
16a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16a90 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
16aa0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
16ab0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
16ac0 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16af0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
16b00 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
16b10 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16b20 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
16b30 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
16b40 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
16b50 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
16b60 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
16b70 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
16b80 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
16b90 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
16ba0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
16bb0 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
16bc0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
16bd0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
16be0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
16bf0 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
16c00 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
16c10 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
16c20 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
16c30 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
16c40 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
16c50 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
16c60 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
16c70 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
16c80 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
16c90 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
16ca0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
16cb0 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
16cc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16cd0 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
16ce0 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
16cf0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
16d00 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
16d10 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
16d20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16d30 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
16d40 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
16d50 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
16d60 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
16d70 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
16d80 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
16d90 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
16da0 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
16db0 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
16dc0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
16dd0 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
16de0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
16df0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
16e00 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
16e10 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
16e20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
16e30 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
16e40 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
16e50 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
16e60 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
16e70 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
16e80 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
16e90 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
16ea0 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
16eb0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
16ec0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
16ed0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
16ee0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
16ef0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
16f00 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
16f10 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
16f20 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
16f30 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
16f40 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
16f50 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
16f60 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
16f70 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
16f80 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
16f90 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
16fa0 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
16fb0 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
16fc0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
16fd0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
16fe0 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
16ff0 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
17000 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
17010 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
17020 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
17030 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
17040 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
17050 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
17060 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
17070 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
17080 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
17090 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
170a0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
170b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170d0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
170e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
170f0 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
17100 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
17110 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
17120 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
17130 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
17140 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
17150 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
17160 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
17170 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
17180 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
17190 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
171a0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
171b0 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
171c0 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
171d0 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
171e0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
171f0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
17200 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
17210 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
17220 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
17230 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
17240 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
17250 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
17260 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
17270 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
17280 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
17290 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
172a0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
172b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
172c0 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
172d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
172e0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
172f0 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
17300 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
17310 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
17320 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
17330 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
17340 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
17350 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
17360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17370 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
17380 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
17390 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
173a0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
173b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
173c0 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
173d0 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
173e0 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
17410 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
17420 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
17430 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
17440 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17450 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
17460 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
17470 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
17480 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
17490 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
174a0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
174b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
174c0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
174d0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
174e0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
174f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17500 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17510 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
17520 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
17530 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
17540 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
17550 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
17560 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
17570 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
17580 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
17590 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
175a0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
175b0 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
175c0 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
175d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
175e0 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
175f0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
17600 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
17610 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
17620 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
17630 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
17640 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
17650 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
17660 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17670 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
17680 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
17690 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
176a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
176b0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
176c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
176d0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
176e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
176f0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
17700 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
17710 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
17720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17730 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
17740 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
17750 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
17760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17770 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
17780 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
17790 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
177a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
177b0 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
177c0 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
177d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
177e0 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
177f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17800 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17810 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
17820 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
17830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
17840 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
17850 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
17860 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
17870 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
17880 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
17890 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
178a0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
178b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
178c0 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
178d0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
178e0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
178f0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
17900 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17910 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
17920 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
17930 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
17940 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
17950 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
17960 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17970 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
17980 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
17990 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
179a0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
179b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
179c0 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
179d0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
179e0 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20  Parm, r1,.      
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c       pIn->iSdst,
17a10 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17a20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17a30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17a40 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
17a50 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
17a60 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
17a70 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
17a80 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
17a90 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
17aa0 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
17ab0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
17ac0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
17ad0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
17ae0 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
17af0 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
17b00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17b10 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
17b20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
17b30 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65  dst==1 || pParse
17b40 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73  ->nErr>0 );  tes
17b50 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
17b60 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  t!=1 );.      sq
17b70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
17b80 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17b90 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  Sdst, pDest->iSD
17ba0 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
17bb0 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
17bc0 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
17bd0 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
17be0 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
17bf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
17c00 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
17c10 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
17c20 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  Y */..    /* The
17c30 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
17c40 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
17c50 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  e of registers. 
17c60 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
17c70 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20  t pDest->iSdst. 
17c80 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75   Then the co-rou
17c90 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20  tine yields..   
17ca0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
17cb0 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  _Coroutine: {.  
17cc0 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69      if( pDest->i
17cd0 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sdst==0 ){.     
17ce0 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
17cf0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17d00 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  Range(pParse, pI
17d10 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17d20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
17d30 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20  = pIn->nSdst;.  
17d40 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
17d50 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
17d60 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17d70 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  st, pDest->iSdst
17d80 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17da0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
17db0 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
17dc0 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
17dd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17de0 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
17df0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
17e00 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
17e10 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
17e20 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
17e30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
17e40 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
17e50 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
17e60 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
17e70 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
17e80 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
17e90 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
17ea0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
17eb0 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
17ec0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
17ed0 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
17ee0 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
17ef0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
17f00 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
17f10 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
17f20 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
17f30 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
17f40 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
17f50 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
17f60 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
17f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
17f80 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
17f90 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
17fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17fb0 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
17fc0 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  w, pIn->iSdst, p
17fd0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17ff0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
18000 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
18010 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
18020 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18030 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
18040 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
18050 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
18060 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
18070 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
18080 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
18090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
180a0 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
180b0 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
180c0 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
180d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
180e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
180f0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
18100 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
18110 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18120 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
18130 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18140 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
18150 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
18160 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
18170 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
18180 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
18190 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
181a0 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
181b0 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
181c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
181d0 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
181e0 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
181f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
18200 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
18210 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
18220 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
18230 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
18240 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
18250 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
18260 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
18270 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
18280 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
18290 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
182a0 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
182b0 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
182c0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
182d0 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
182e0 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
182f0 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
18300 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
18310 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
18320 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
18330 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
18340 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
18350 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
18360 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
18370 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
18380 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
18390 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
183a0 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
183b0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
183c0 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
183d0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
183e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
183f0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
18400 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
18410 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
18420 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
18430 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
18440 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
18450 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
18460 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
18470 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
18480 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
18490 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
184a0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
184b0 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
184c0 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
184d0 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
184e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
184f0 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
18500 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
18510 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
18520 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
18530 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
18540 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
18550 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
18560 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
18570 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
18580 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
18590 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
185a0 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
185b0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
185c0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
185d0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
185e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
185f0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
18600 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
18610 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
18620 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
18630 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
18640 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
18650 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
18660 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
18670 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
18680 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
18690 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
186a0 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
186b0 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
186c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
186d0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
186e0 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
186f0 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
18700 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
18710 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
18720 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
18730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
18740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
18750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
18760 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
18770 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
18780 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
18790 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
187a0 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
187b0 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
187c0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
187d0 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
187e0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
187f0 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
18800 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
18810 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
18820 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
18830 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
18840 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
18850 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
18860 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
18870 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
18880 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
18890 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
188a0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
188b0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
188c0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
188d0 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
188e0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
188f0 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
18900 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
18910 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
18920 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
18930 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
18940 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
18950 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
18960 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
18970 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
18980 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
18990 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
189a0 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
189b0 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
189c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
189d0 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
189e0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
189f0 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
18a00 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
18a10 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
18a20 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
18a30 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
18a40 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
18a50 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
18a60 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
18a70 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
18a80 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
18a90 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
18aa0 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
18ab0 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
18ac0 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
18ad0 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
18ae0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
18af0 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
18b00 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
18b10 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
18b20 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
18b30 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
18b40 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
18b50 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
18b60 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
18b70 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
18b80 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
18b90 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
18ba0 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
18bb0 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
18bc0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
18bd0 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
18be0 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
18bf0 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
18c00 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
18c10 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
18c20 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
18c30 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
18c40 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
18c50 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
18c60 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
18c70 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
18c80 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
18c90 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
18ca0 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
18cb0 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
18cc0 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
18cd0 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
18ce0 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
18cf0 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
18d00 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
18d10 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
18d20 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
18d30 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
18d40 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
18d50 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
18d60 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
18d70 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
18d80 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
18d90 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
18da0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
18db0 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
18dc0 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
18dd0 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
18de0 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
18df0 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
18e00 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
18e10 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
18e20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
18e30 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
18e40 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
18e50 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
18e60 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
18e70 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
18e80 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
18e90 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
18ea0 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
18eb0 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
18ec0 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
18ed0 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66   or EofB..*/.#if
18ee0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18ef0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
18f00 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
18f10 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
18f20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18f30 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
18f40 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18f50 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
18f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
18f70 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
18f80 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
18f90 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
18fa0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
18fb0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
18fc0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
18fd0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
18fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
18ff0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53   counters */.  S
19000 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
19010 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
19020 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
19030 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
19040 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
19050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
19060 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
19070 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
19080 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20  ectDest destA;  
19090 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
190a0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
190b0 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  A */.  SelectDes
190c0 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20  t destB;     /* 
190d0 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
190e0 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20  coroutine B */. 
190f0 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20   int regAddrA;  
19100 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
19110 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
19120 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
19130 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  e */.  int regAd
19140 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drB;         /* 
19150 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
19160 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f   for select-B co
19170 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19180 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
19190 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
191a0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
191b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
191c0 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
191d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
191e0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
191f0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19200 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
19210 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
19220 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
19230 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
19240 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
19250 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
19260 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
19270 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
19280 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
19290 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
192a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
192b0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
192c0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
192d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
192e0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
192f0 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
19300 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
19310 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
19320 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
19330 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
19340 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
19350 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
19360 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  int addrEofA_noB
19370 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61  ;     /* Alterna
19380 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42  te addrEofA if B
19390 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   is uninitialize
193a0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  d */.  int addrE
193b0 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
193c0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
193d0 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
193e0 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
193f0 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
19400 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
19410 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
19420 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
19430 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
19440 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19450 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
19460 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19470 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
19480 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19490 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
194a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
194b0 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
194c0 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
194d0 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
194e0 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
194f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
19500 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
19510 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
19520 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
19530 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
19540 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
19550 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19560 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
19570 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
19580 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
19590 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
195a0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
195b0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
195c0 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
195d0 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
195e0 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
195f0 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
19600 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
19610 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
19620 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
19630 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
19640 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19650 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
19660 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  tmt */.  int add
19670 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  r1;            /
19680 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
19690 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
196a0 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
196b0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
196c0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
196d0 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
196e0 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
196f0 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
19700 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20  Info *pKeyDup = 
19710 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  0; /* Comparison
19720 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
19730 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
19740 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
19750 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
19760 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
19770 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
19780 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
19790 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
197a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
197b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
197c0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
197d0 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
197e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
197f0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
19800 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19810 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
19820 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19830 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
19840 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
19850 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
19860 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
19870 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
19880 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
19890 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
198a0 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20  .  int iSub1;   
198b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
198c0 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  id of left-hand 
198d0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
198e0 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20  Sub2;           
198f0 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69   /* EQP id of ri
19900 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  ght-hand query *
19910 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
19920 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  rt( p->pOrderBy!
19930 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19940 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a  pKeyDup==0 ); /*
19950 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20   "Managed" code 
19960 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63  needs this.  Tic
19970 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20  ket #3382. */.  
19980 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
19990 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
199a0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
199b0 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
199c0 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20   Already thrown 
199d0 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42  the error if VDB
199e0 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a  E alloc failed *
199f0 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  /.  labelEnd = s
19a00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19a10 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
19a20 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
19a30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
19a40 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
19a50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19a60 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
19a70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
19a80 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
19a90 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
19aa0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
19ab0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
19ac0 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
19ad0 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
19ae0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
19af0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
19b00 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
19b10 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
19b20 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
19b30 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
19b40 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
19b50 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
19b60 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
19b70 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
19b80 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
19b90 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19ba0 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
19bb0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
19bc0 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
19bd0 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
19be0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
19bf0 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
19c00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
19c10 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
19c20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19c30 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
19c40 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
19c50 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
19c60 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19c70 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
19c80 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19c90 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
19ca0 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
19cb0 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
19cc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19cd0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
19ce0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
19cf0 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
19d00 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
19d10 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
19d20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
19d30 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19d40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
19d50 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
19d60 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
19d70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19d80 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
19d90 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
19da0 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
19db0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
19dc0 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
19dd0 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
19de0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
19df0 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
19e00 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
19e10 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
19e20 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
19e30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
19e40 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
19e50 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
19e60 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
19e70 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
19e80 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
19e90 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
19ea0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
19eb0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
19ec0 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
19ed0 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
19ee0 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
19ef0 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
19f00 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
19f10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
19f20 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
19f30 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
19f40 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
19f50 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
19f60 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
19f70 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
19f80 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
19f90 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
19fa0 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
19fb0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
19fc0 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65  zeof(int)*(nOrde
19fd0 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28  rBy + 1));.  if(
19fe0 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
19ff0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a000 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1a010 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20    aPermute[0] = 
1a020 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f  nOrderBy;.    fo
1a030 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=1, pItem=pOr
1a040 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72  derBy->a; i<=nOr
1a050 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
1a060 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
1a070 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1a080 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1a090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a0a0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1a0b0 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
1a0c0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1a0d0 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
1a0e0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1a0f0 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
1a100 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1a110 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1a120 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
1a130 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
1a140 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
1a150 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
1a160 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
1a170 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
1a180 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1a190 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1a1a0 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
1a1b0 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
1a1c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1a1d0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
1a1e0 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
1a1f0 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
1a200 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
1a210 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1a220 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
1a230 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
1a240 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
1a250 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
1a260 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
1a270 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
1a280 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1a290 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
1a2a0 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
1a2b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1a2c0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1a2d0 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
1a2e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
1a2f0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
1a300 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1a310 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
1a320 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1a330 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
1a340 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
1a350 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
1a360 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
1a370 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
1a380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a390 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
1a3a0 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
1a3b0 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
1a3c0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
1a3d0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
1a3e0 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
1a3f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
1a400 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
1a410 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
1a420 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1a430 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a440 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
1a450 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
1a460 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
1a470 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
1a480 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
1a490 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
1a4a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a4b0 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
1a4c0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
1a4d0 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
1a4e0 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
1a4f0 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
1a500 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
1a510 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
1a520 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1a530 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
1a540 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
1a550 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
1a560 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
1a570 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
1a580 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1a590 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
1a5a0 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
1a5b0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1a5c0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1a5d0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
1a5e0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
1a5f0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
1a600 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
1a610 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
1a620 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
1a630 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
1a640 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
1a650 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
1a660 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
1a670 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1a680 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a690 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
1a6a0 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
1a6b0 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
1a6f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a700 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
1a710 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
1a720 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
1a730 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
1a740 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
1a750 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
1a760 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
1a770 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
1a780 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
1a790 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1a7a0 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
1a7b0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
1a7c0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
1a7d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1a7e0 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
1a7f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
1a800 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
1a810 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
1a820 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a830 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1a840 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
1a850 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
1a860 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1a870 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
1a880 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
1a890 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1a8a0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
1a8b0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1a8c0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1a8d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1a8e0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
1a8f0 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
1a900 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
1a910 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
1a920 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
1a930 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1a940 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
1a950 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
1a960 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1a970 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
1a980 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61  , regAddrA, 0, a
1a990 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56  ddrSelectA);.  V
1a9a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a9b0 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
1a9c0 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
1a9d0 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
1a9e0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
1a9f0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
1aa00 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
1aa10 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1aa20 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
1aa30 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
1aa40 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1aa50 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41 29  ine(v, regAddrA)
1aa60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
1aa70 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
1aa80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1aa90 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1aaa0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1aab0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
1aac0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
1aad0 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
1aae0 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
1aaf0 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
1ab00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1ab10 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1ab20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab30 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1ab40 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1ab50 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42  , 0, addrSelectB
1ab60 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1ab70 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45  ((v, "right SELE
1ab80 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
1ab90 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
1aba0 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
1abb0 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
1abc0 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
1abd0 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
1abe0 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c  et = 0;  .  expl
1abf0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
1ac00 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
1ac10 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
1ac20 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1ac30 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
1ac40 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
1ac50 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
1ac60 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
1ac70 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
1ac80 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1ac90 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  (v, regAddrB);..
1aca0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1acb0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1acc0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1acd0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
1ace0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1acf0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1ad00 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1ad10 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1ad20 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1ad30 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1ad40 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
1ad50 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
1ad60 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1ad70 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad90 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
1ada0 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1adc0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1add0 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a  belEnd);.  .  /*
1ade0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1adf0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1ae00 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1ae10 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a  row of the B.  *
1ae20 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1ae30 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1ae40 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1ae50 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  select..  */.  i
1ae60 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1ae70 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1ae80 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1ae90 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1aea0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29   routine for B")
1aeb0 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20  );.    addrOutB 
1aec0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1aed0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1aee0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1aef0 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70      p, &destB, p
1af00 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20  Dest, regOutB,. 
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1af30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
1af40 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  .  sqlite3KeyInf
1af50 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b  oUnref(pKeyDup);
1af60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1af70 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1af80 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1af90 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1afa0 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
1afb0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1afc0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
1afd0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1afe0 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
1aff0 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
1b000 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1b010 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72  rEofA_noB = addr
1b020 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b  EofA = labelEnd;
1b030 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
1b040 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1b050 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
1b060 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1b070 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
1b080 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b090 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1b0a0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
1b0b0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73  addrEofA_noB = s
1b0c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b0d0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1b0e0 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64  gAddrB, labelEnd
1b0f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b110 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1b120 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1b130 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b140 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
1b150 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
1b160 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1b170 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
1b180 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1b190 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  w);.  }..  /* Ge
1b1a0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1b1b0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1b1c0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1b1d0 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
1b1e0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1b1f0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1b200 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
1b210 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1b220 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1b230 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
1b240 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
1b250 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
1b260 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1b270 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
1b280 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
1b290 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
1b2a0 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
1b2b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
1b2c0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1b2d0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
1b2e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b2f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1b300 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1b310 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1b320 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b330 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1b340 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
1b350 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b360 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1b370 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  (v, addrEofB);. 
1b380 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1b390 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1b3a0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1b3b0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1b3c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1b3d0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1b3e0 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1b3f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b400 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1b410 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1b420 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b430 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b440 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1b450 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1b460 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1b470 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1b480 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1b490 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b4a0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1b4b0 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
1b4c0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1b4d0 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1b4e0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
1b4f0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
1b500 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1b510 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1b520 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
1b530 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
1b540 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1b550 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
1b560 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1b570 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
1b580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b590 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b5a0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1b5b0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1b5c0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1b5d0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1b5e0 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
1b5f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b600 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1b610 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
1b620 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1b630 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
1b640 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1b650 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
1b660 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1b670 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
1b680 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1b690 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
1b6a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b6b0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1b6c0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1b6d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1b6e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b6f0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1b700 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1b710 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1b720 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1b730 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1b740 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
1b750 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
1b760 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
1b770 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1b780 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1b790 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
1b7a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b7b0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b7c0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
1b7d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b7e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b7f0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b800 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1b810 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1b820 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
1b830 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
1b840 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
1b850 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b860 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1b870 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
1b880 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b890 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
1b8a0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
1b8b0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
1b8c0 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
1b8d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b8e0 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
1b8f0 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
1b900 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1b930 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
1b940 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
1b950 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1b960 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
1b970 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b980 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
1b990 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
1b9a0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
1b9b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b9c0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1b9d0 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1b9e0 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1b9f0 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1ba00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1ba10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1ba20 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1ba30 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1ba40 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1ba50 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1ba60 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1ba70 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1ba80 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1ba90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1baa0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1bab0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1bac0 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1bad0 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1bae0 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1baf0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1bb00 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1bb10 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1bb20 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1bb30 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1bb40 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1bb50 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
1bb60 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
1bb70 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
1bb80 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
1bb90 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
1bba0 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  Err!=0;.}.#endif
1bbb0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1bbc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1bbd0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1bbe0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1bbf0 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  W)../* An instan
1bc00 63 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43  ce of the SubstC
1bc10 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65  ontext object de
1bc20 73 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74  scribes an subst
1bc30 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20  itution edit.** 
1bc40 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
1bc50 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e  on a parse tree.
1bc60 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72  .**.** All refer
1bc70 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
1bc80 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65   in table iTable
1bc90 20 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61   are to be repla
1bca0 63 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e  ced by correspon
1bcb0 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ding.** expressi
1bcc0 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a  ons in pEList..*
1bcd0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1bce0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a   SubstContext {.
1bcf0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bd10 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1bd20 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
1bd30 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
1bd40 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66    /* Replace ref
1bd50 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
1bd60 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1bd70 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20  NewTable;       
1bd80 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c       /* New tabl
1bd90 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
1bda0 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20  t isLeftJoin;   
1bdb0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54          /* Add T
1bdc0 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70  K_IF_NULL_ROW op
1bdd0 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65  codes on each re
1bde0 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45  placement */.  E
1bdf0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1be00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c           /* Repl
1be10 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69  acement expressi
1be20 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f  ons */.} SubstCo
1be30 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61  ntext;../* Forwa
1be40 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
1be50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1be60 75 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62  ubstExprList(Sub
1be70 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72  stContext*, Expr
1be80 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1be90 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1bea0 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53  SubstContext*, S
1beb0 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  elect*, int);../
1bec0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1bed0 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1bee0 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1bef0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1bf00 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1bf10 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1bf20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1bf30 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1bf40 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1bf50 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1bf60 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1bf70 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1bf80 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1bf90 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1bfa0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1bfb0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1bfc0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1bfd0 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1bfe0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1bff0 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1c000 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1c010 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1c020 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1c030 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1c040 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1c050 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1c060 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1c070 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1c080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1c090 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
1c0a0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1c0b0 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1c0c0 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1c0d0 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1c0e0 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1c0f0 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1c100 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1c110 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1c120 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1c130 75 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73  ubstExpr(.  Subs
1c140 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1c150 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  ,  /* Descriptio
1c160 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1c170 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ution */.  Expr 
1c180 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
1c190 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
1c1a0 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
1c1b0 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1c1c0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1c1d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78  turn 0;.  if( Ex
1c1e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c1f0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1c200 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  ).   && pExpr->i
1c210 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
1c220 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20  pSubst->iTable. 
1c230 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   ){.    pExpr->i
1c240 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c250 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1c260 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  le;.  }.  if( pE
1c270 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1c280 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1c290 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1c2a0 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1c2b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1c2c0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1c2d0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1c2e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1c2f0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1c300 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70   Expr *pCopy = p
1c310 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  Subst->pEList->a
1c320 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1c330 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
1c340 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20  pr ifNullRow;.  
1c350 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1c360 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26  st->pEList!=0 &&
1c370 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1c380 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e  pSubst->pEList->
1c390 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
1c3a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1c3b0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
1c3c0 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
1c3d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c3e0 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70  xprIsVector(pCop
1c3f0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  y) ){.        sq
1c400 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
1c410 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72  Msg(pSubst->pPar
1c420 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20  se, pCopy);.    
1c430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c440 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c450 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Subst->pParse->d
1c460 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
1c470 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69  Subst->isLeftJoi
1c480 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d  n && pCopy->op!=
1c490 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
1c4a0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69         memset(&i
1c4b0 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a  fNullRow, 0, siz
1c4c0 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b  eof(ifNullRow));
1c4d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1c4e0 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f  lRow.op = TK_IF_
1c4f0 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20  NULL_ROW;.      
1c500 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c      ifNullRow.pL
1c510 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20  eft = pCopy;.   
1c520 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1c530 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  .iTable = pSubst
1c540 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->iNewTable;.   
1c550 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26         pCopy = &
1c560 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20  ifNullRow;.     
1c570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
1c580 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
1c590 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29  up(db, pCopy, 0)
1c5a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1c5b0 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73  ew && pSubst->is
1c5c0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
1c5d0 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
1c5e0 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43  perty(pNew, EP_C
1c5f0 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  anBeNull);.     
1c600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c610 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61 73   pNew && ExprHas
1c620 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
1c630 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
1c640 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
1c650 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c660 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
1c670 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  inTable;.       
1c680 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1c690 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d  ty(pNew, EP_From
1c6a0 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  Join);.        }
1c6b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c6c0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1c6d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
1c6e0 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
1c6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1c700 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70  se{.    if( pExp
1c710 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c  r->op==TK_IF_NUL
1c720 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e  L_ROW && pExpr->
1c730 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e  iTable==pSubst->
1c740 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
1c750 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
1c760 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1c770 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78  e;.    }.    pEx
1c780 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
1c790 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1c7a0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1c7b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
1c7c0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1c7d0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1c7e0 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
1c7f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c800 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1c810 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1c820 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45 78  lect(pSubst, pEx
1c830 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31  pr->x.pSelect, 1
1c840 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c850 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1c860 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  t(pSubst, pExpr-
1c870 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
1c880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
1c890 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
1c8a0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1c8b0 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1c8c0 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1c8d0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1c8e0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1c8f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1c900 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t       /* List 
1c910 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
1c920 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1c930 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20  stitutes */.){. 
1c940 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1c950 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1c960 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1c970 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1c980 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1c990 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1c9a0 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73  xpr(pSubst, pLis
1c9b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
1c9c0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1c9d0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
1c9e0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1c9f0 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69  Subst, /* Descri
1ca00 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1ca10 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53  stitution */.  S
1ca20 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1ca30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
1ca40 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
1ca50 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1ca60 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
1ca70 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20   doPrior        
1ca80 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74     /* Do substit
1ca90 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f  utes on p->pPrio
1caa0 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72  r too */.){.  Sr
1cab0 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
1cac0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1cad0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1cae0 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
1caf0 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20  eturn;.  do{.   
1cb00 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1cb10 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74  Subst, p->pEList
1cb20 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
1cb30 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e  List(pSubst, p->
1cb40 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
1cb50 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1cb60 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  bst, p->pOrderBy
1cb70 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1cb80 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  g = substExpr(pS
1cb90 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67  ubst, p->pHaving
1cba0 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  );.    p->pWhere
1cbb0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1cbc0 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  bst, p->pWhere);
1cbd0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  .    pSrc = p->p
1cbe0 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Src;.    assert(
1cbf0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20   pSrc!=0 );.    
1cc00 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1cc10 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1cc20 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1cc30 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1cc40 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1cc50 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31  Item->pSelect, 1
1cc60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1cc70 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1cc80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73   ){.        subs
1cc90 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1cca0 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1ccb0 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  cArg);.      }. 
1ccc0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64     }.  }while( d
1ccd0 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70  oPrior && (p = p
1cce0 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a  ->pPrior)!=0 );.
1ccf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1cd00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1cd10 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1cd20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1cd30 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1cd40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1cd50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1cd60 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1cd70 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1cd80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1cd90 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1cda0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1cdb0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1cdc0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1cdd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1cde0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1cdf0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1ce00 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1ce10 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1ce20 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1ce30 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1ce40 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1ce50 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1ce60 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1ce70 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1ce80 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1ce90 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1cea0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1ceb0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1cec0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1ced0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1cee0 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1cef0 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1cf00 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1cf10 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1cf20 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1cf30 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1cf40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cf50 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1cf60 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1cf70 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1cf80 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1cf90 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1cfa0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1cfb0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1cfc0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1cfd0 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1cfe0 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1cff0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1d000 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1d010 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d020 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1d030 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1d040 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1d050 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1d060 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1d070 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1d080 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1d090 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1d0a0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1d0b0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1d0c0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1d0d0 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1d0e0 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1d0f0 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1d100 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1d110 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1d120 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1d130 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1d140 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1d150 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1d160 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1d170 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1d180 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1d190 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20  ning is subject 
1d1a0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
1d1b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a   constraints:.**
1d1c0 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1d1d0 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1d1e0 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1d1f0 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1d200 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
1d210 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1d220 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d230 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
1d240 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1d250 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1d260 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1d270 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1d280 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1d290 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32  as:.**        (2
1d2a0 29 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  ) If the subquer
1d2b0 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  y is an aggregat
1d2c0 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  e then.**       
1d2d0 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20   (2a) the outer 
1d2e0 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62  query must not b
1d2f0 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20  e a join and.** 
1d300 20 20 20 20 20 20 20 28 32 62 29 20 74 68 65 20         (2b) the 
1d310 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73 74  outer query must
1d320 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72   not use subquer
1d330 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ies.**          
1d340 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68     other than th
1d350 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73  e one FROM-claus
1d360 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  e subquery that 
1d370 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a  is a candidate.*
1d380 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  *             fo
1d390 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28  r flattening.  (
1d3a0 54 68 69 73 20 69 73 20 64 75 65 20 74 6f 20 74  This is due to t
1d3b0 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33  icket [2f7170d73
1d3c0 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20  bf9abf80].**    
1d3d0 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30           from 20
1d3e0 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a  15-02-09.).**.**
1d3f0 20 20 20 28 33 29 20 20 49 66 20 74 68 65 20 73     (3)  If the s
1d400 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1d410 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1d420 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e  a LEFT JOIN then
1d430 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61 29 20  .**        (3a) 
1d440 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1d450 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61   not be a join a
1d460 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62  nd.**        (3b
1d470 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  ) the FROM claus
1d480 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1d490 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69  y may not contai
1d4a0 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20  n a virtual.**  
1d4b0 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
1d4c0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1d4d0 33 63 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  3c) the outer qu
1d4e0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
1d4f0 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a  n aggregate..**.
1d500 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
1d510 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62  bquery can not b
1d520 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  e DISTINCT..**.*
1d530 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
1d540 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
1d550 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
1d560 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
1d570 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
1d580 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
1d590 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
1d5a0 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
1d5b0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
1d5c0 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
1d5d0 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
1d5e0 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
1d5f0 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
1d600 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
1d610 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1d620 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74   We no longer at
1d630 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e  tempt to flatten
1d640 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
1d650 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20  eries.  Was:.** 
1d660 20 20 20 20 20 20 20 49 66 20 74 68 65 20 73 75         If the su
1d670 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67  bquery is aggreg
1d680 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71  ate, the outer q
1d690 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1d6a0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1d6b0 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
1d6c0 65 72 79 20 6d 75 73 74 20 68 61 76 65 20 61 20  ery must have a 
1d6d0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f  FROM clause.  TO
1d6e0 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72  DO:  For subquer
1d6f0 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20  ies without.**  
1d700 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61        A FROM cla
1d710 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64  use, consider ad
1d720 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75  ding a FROM clau
1d730 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63  se with the spec
1d740 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  ial.**        ta
1d750 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20  ble sqlite_once 
1d760 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
1d770 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f   a single row co
1d780 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20  ntaining a.**   
1d790 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c       single NULL
1d7a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49  ..**.**   (8)  I
1d7b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1d7c0 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74  ses LIMIT then t
1d7d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1d7e0 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1d7f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49  ..**.**   (9)  I
1d800 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1d810 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74  ses LIMIT then t
1d820 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1d830 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67  ay not be aggreg
1d840 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ate..**.**  (**)
1d850 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1d860 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1d870 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1d880 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1d890 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1d8a0 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1d8b0 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1d8c0 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1d8d0 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1d8e0 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61  *        constra
1d8f0 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73 75 62  int: "If the sub
1d900 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61  query is aggrega
1d910 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  te then the oute
1d920 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20  r query .**     
1d930 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c     may not use L
1d940 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31  IMIT.".**.**  (1
1d950 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1d960 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1d970 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74  uery may not bot
1d980 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1d990 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1d9a0 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1d9b0 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1d9c0 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1d9d0 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1d9e0 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1d9f0 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1da00 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1da10 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1da20 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1da30 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1da40 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1da50 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1da60 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1da70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1da80 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  ay not use OFFSE
1da90 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1daa0 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
1dab0 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  ry is part of a 
1dac0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1dad0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20   then the.**    
1dae0 20 20 20 20 73 75 62 71 75 65 72 79 20 6d 61 79      subquery may
1daf0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a   not use LIMIT..
1db00 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
1db10 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20  icket #2339 and 
1db20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64  ticket [02a8e81d
1db30 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36  44])..**.**  (16
1db40 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  )  If the outer 
1db50 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61  query is aggrega
1db60 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  te, then the sub
1db70 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
1db80 20 20 20 20 20 20 20 20 75 73 65 20 4f 52 44 45          use ORDE
1db90 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
1dba0 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
1dbb0 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
1dbc0 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
1dbd0 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
1dbe0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
1dbf0 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
1dc00 2a 20 20 28 31 37 29 20 20 49 66 20 74 68 65 20  *  (17)  If the 
1dc10 73 75 62 71 75 65 72 79 20 69 73 20 61 20 63 6f  subquery is a co
1dc20 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1dc30 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31  hen.**        (1
1dc40 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64  7a) all compound
1dc50 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20   operators must 
1dc60 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  be a UNION ALL, 
1dc70 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31  and.**        (1
1dc80 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74  7b) no terms wit
1dc90 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hin the subquery
1dca0 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65   compound may be
1dcb0 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20   aggregate.**   
1dcc0 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 44 49             or DI
1dcd0 53 54 49 4e 54 2c 20 61 6e 64 0a 2a 2a 20 20 20  STINT, and.**   
1dce0 20 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79       (17c) every
1dcf0 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65   term within the
1dd00 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75   subquery compou
1dd10 6e 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46  nd must have a F
1dd20 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ROM clause.**   
1dd30 20 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f       (17d) the o
1dd40 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1dd50 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  ot be.**        
1dd60 20 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67        (17d1) agg
1dd70 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20  regate, or.**   
1dd80 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32             (17d2
1dd90 29 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a  ) DISTINCT, or.*
1dda0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  *              (
1ddb0 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  17d3) a join..**
1ddc0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70  .**        The p
1ddd0 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75  arent and sub-qu
1dde0 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ery may contain 
1ddf0 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53  WHERE clauses. S
1de00 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20  ubject to.**    
1de10 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20      rules (11), 
1de20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74  (13) and (14), t
1de30 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  hey may also con
1de40 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a  tain ORDER BY,.*
1de50 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61  *        LIMIT a
1de60 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
1de70 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79  s.  The subquery
1de80 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20   cannot use any 
1de90 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1dea0 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65     operator othe
1deb0 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
1dec0 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65   because all the
1ded0 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a   other compound.
1dee0 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1def0 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c  ors have an impl
1df00 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69  ied DISTINCT whi
1df10 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  ch is disallowed
1df20 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65   by.**        re
1df30 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a  striction (4)..*
1df40 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f  *.**        Also
1df50 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74  , each component
1df60 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1df70 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68  y must return th
1df80 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
1df90 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c          of resul
1dfa0 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20  t columns. This 
1dfb0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65  is actually a re
1dfc0 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e  quirement for an
1dfd0 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1dfe0 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74       SELECT stat
1dff0 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74  ement, but all t
1e000 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65  he code here doe
1e010 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74  s is make sure t
1e020 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20  hat no.**       
1e030 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20   such (illegal) 
1e040 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61  sub-query is fla
1e050 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  ttened. The call
1e060 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74  er will detect t
1e070 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e  he.**        syn
1e080 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65  tax error and re
1e090 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20  turn a detailed 
1e0a0 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20  message..**.**  
1e0b0 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
1e0c0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1e0d0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1e0e0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1e0f0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
1e100 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  ER BY clause of 
1e110 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
1e120 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
1e130 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
1e140 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
1e150 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
1e160 2a 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65  **  (19)  If the
1e170 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1e180 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1e190 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1e1a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
1e1b0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
1e1c0 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
1e1d0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1e1e0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1e1f0 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
1e200 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
1e210 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
1e220 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
1e230 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
1e240 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
1e250 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
1e260 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
1e270 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
1e280 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1e290 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
1e2a0 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
1e2b0 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
1e2c0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
1e2d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1e2e0 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
1e2f0 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
1e300 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
1e310 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
1e320 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
1e330 2a 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20  *  (21)  If the 
1e340 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1e350 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1e360 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1e370 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49   be.**        DI
1e380 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
1e390 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
1e3a0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20  ])..**.**  (22) 
1e3b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   The subquery ma
1e3c0 79 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72  y not be a recur
1e3d0 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  sive CTE..**.** 
1e3e0 20 28 32 33 29 20 20 49 66 20 74 68 65 20 6f 75   (23)  If the ou
1e3f0 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20 72  ter query is a r
1e400 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74 68  ecursive CTE, th
1e410 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  en the sub-query
1e420 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20   may not be.**  
1e430 20 20 20 20 20 20 61 20 63 6f 6d 70 6f 75 6e 64        a compound
1e440 20 71 75 65 72 79 2e 20 54 68 69 73 20 72 65 73   query. This res
1e450 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61  triction is beca
1e460 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67  use transforming
1e470 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70   the.**        p
1e480 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f  arent to a compo
1e490 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73  und query confus
1e4a0 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  es the code that
1e4b0 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20   handles.**     
1e4c0 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65     recursive que
1e4d0 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c  ries in multiSel
1e4e0 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  ect()..**.**  (*
1e4f0 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1e500 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1e510 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1e520 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a  bqueries.  Was:.
1e530 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75  **        The su
1e540 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  bquery may not b
1e550 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74  e an aggregate t
1e560 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69  hat uses the bui
1e570 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a  lt-in min() or .
1e580 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78  **        or max
1e590 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28  () functions.  (
1e5a0 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73  Without this res
1e5b0 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72  triction, a quer
1e5c0 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20  y like:.**      
1e5d0 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d    "SELECT x FROM
1e5e0 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c   (SELECT max(y),
1e5f0 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75   x FROM t1)" wou
1e600 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  ld not necessari
1e610 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74  ly.**        ret
1e620 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20  urn the value X 
1e630 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20  for which Y was 
1e640 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a  maximal.).**.**.
1e650 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
1e660 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
1e670 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
1e680 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
1e690 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
1e6a0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
1e6b0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
1e6c0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1e6d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
1e6e0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
1e6f0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
1e700 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
1e710 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
1e720 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1e730 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
1e740 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1e750 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
1e760 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1e770 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
1e780 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1e790 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
1e7a0 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
1e7b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
1e7c0 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
1e7d0 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
1e7e0 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
1e7f0 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
1e800 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
1e810 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1e820 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1e830 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1e840 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
1e850 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
1e860 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
1e870 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
1e880 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
1e890 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
1e8a0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
1e8b0 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
1e8c0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20  */.  int isAgg  
1e8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e8e0 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
1e8f0 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
1e900 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
1e910 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e920 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1e930 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
1e940 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63  Context;.  Selec
1e950 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f  t *pParent;    /
1e960 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20  * Current UNION 
1e970 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ALL term of the 
1e980 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  other query */. 
1e990 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
1e9a0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
1e9b0 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
1e9c0 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
1e9d0 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
1e9e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
1e9f0 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
1ea00 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
1ea10 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
1ea20 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
1ea30 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1ea40 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1ea50 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
1ea60 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
1ea70 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1ea80 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
1ea90 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
1eaa0 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1eab0 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
1eac0 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
1ead0 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
1eae0 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d  int iNewParent =
1eaf0 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65   -1;/* Replaceme
1eb00 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61  nt table for iPa
1eb10 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rent */.  int is
1eb20 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a  LeftJoin = 0; /*
1eb30 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73   True if pSub is
1eb40 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
1eb50 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  of a LEFT JOIN *
1eb60 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20  /    .  int i;  
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1eb80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1eb90 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1ebc0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1ebd0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1ebe0 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
1ebf0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1ec00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1ec10 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
1ec20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1ec30 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1ec40 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
1ec50 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
1ec60 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
1ec70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1ec80 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69  pPrior==0 );.  i
1ec90 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
1eca0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1ecb0 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
1ecc0 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  r) ) return 0;. 
1ecd0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1ece0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
1ecf0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
1ed00 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
1ed10 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
1ed20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
1ed30 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
1ed40 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
1ed50 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
1ed60 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
1ed70 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
1ed80 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ..  pSubSrc = pS
1ed90 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
1eda0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
1edb0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
1edc0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
1edd0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1ede0 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
1edf0 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
1ee00 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
1ee10 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
1ee20 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
1ee30 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
1ee40 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
1ee50 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
1ee60 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1ee70 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
1ee80 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
1ee90 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
1eea0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
1eeb0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
1eec0 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
1eed0 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
1eee0 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
1eef0 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
1ef00 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1ef10 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
1ef20 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ef30 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ef40 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
1ef50 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  Sub->pOffset ) r
1ef60 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ef90 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28   (14) */.  if( (
1efa0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1efb0 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26  _Compound)!=0 &&
1efc0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
1efd0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1f010 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
1f020 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
1f030 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
1f040 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f060 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
1f070 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1f080 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1f090 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
1f0a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1f0b0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   Restriction (4)
1f0c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1f0d0 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
1f0e0 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
1f0f0 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
1f100 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
1f110 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
1f120 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
1f130 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
1f140 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1f150 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f190 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
1f1a0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
1f1b0 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
1f1c0 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f1e0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f1f0 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
1f200 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
1f210 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
1f220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1f230 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f240 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
1f250 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
1f260 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1f270 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
1f280 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1f290 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1f2a0 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
1f2b0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1f2c0 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
1f2d0 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74  sive) ){.    ret
1f2e0 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1f2f0 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20  ctions (22) */. 
1f300 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1f310 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1f320 73 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70  sive) && pSub->p
1f330 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
1f340 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1f350 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20  ction (23) */.  
1f360 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
1f370 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f380 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1f390 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
1f3a0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
1f3b0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1f3c0 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c   be a join itsel
1f3d0 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20  f (3a). Example 
1f3e0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1f3f0 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a  ot.  ** allowed:
1f400 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1f410 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
1f420 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
1f430 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
1f440 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
1f450 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
1f460 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
1f470 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
1f480 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
1f490 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
1f4a0 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
1f4b0 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
1f4c0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  g..  **.  ** If 
1f4d0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f4e0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1f4f0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
1f500 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  , then the outer
1f510 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e  .  ** query cann
1f520 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
1f530 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69  te. (3c)  This i
1f540 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66  s an artifact of
1f550 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67   the way.  ** ag
1f560 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f  gregates are pro
1f570 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69  cessed - there i
1f580 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74  s no mechanism t
1f590 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20  o determine if. 
1f5a0 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   ** the LEFT JOI
1f5b0 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  N table should b
1f5c0 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a  e all-NULL..  **
1f5d0 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  .  ** See also t
1f5e0 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35  ickets #306, #35
1f5f0 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20  0, and #3300..  
1f600 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74  */.  if( (pSubit
1f610 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
1f620 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
1f630 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e  {.    isLeftJoin
1f640 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53   = 1;.    if( pS
1f650 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  ubSrc->nSrc>1 ||
1f660 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74   isAgg || IsVirt
1f670 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30  ual(pSubSrc->a[0
1f680 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ].pTab) ){.     
1f690 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20   /*  (3a)       
1f6a0 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28        (3c)     (
1f6b0 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  3b) */.      ret
1f6c0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
1f6d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f6e0 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20  XTRA_IFNULLROW. 
1f6f0 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e   else if( iFrom>
1f700 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20  0 && !isAgg ){. 
1f710 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73     /* Setting is
1f720 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63  LeftJoin to -1 c
1f730 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52  auses OP_IfNullR
1f740 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  ow opcodes to be
1f750 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20   generated for. 
1f760 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65     ** every refe
1f770 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73  rence to any res
1f780 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  ult column from 
1f790 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f  subquery in a jo
1f7a0 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20  in, even.    ** 
1f7b0 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20  though they are 
1f7c0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
1f7d0 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73  This will stress
1f7e0 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e  -test the OP_IfN
1f7f0 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f  ullRow .    ** o
1f800 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73  pcode. */.    is
1f810 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20  LeftJoin = -1;. 
1f820 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1f830 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29  Restriction (17)
1f840 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1f850 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1f860 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1f870 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1f880 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1f890 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1f8a0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1f8b0 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1f8c0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1f8d0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1f8e0 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1f8f0 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1f900 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1f910 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1f920 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1f930 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1f940 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1f950 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f960 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1f970 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d  on (20) */.    }
1f980 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
1f990 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1f9a0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1f9b0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
1f9c0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
1f9d0 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20  n 0; /* (17d1), 
1f9e0 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33  (17d2), or (17d3
1f9f0 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) */.    }.    f
1fa00 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
1fa10 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
1fa20 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
1fa30 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1fa40 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1fa50 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1fa60 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
1fa70 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
1fa80 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1fa90 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1faa0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1fab0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
1fac0 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
1fad0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1fae0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
1faf0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
1fb00 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
1fb10 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
1fb20 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
1fb30 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1fb40 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1fb50 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
1fb60 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a      /* (17b) */.
1fb70 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
1fb80 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
1fb90 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20  1->op!=TK_ALL)  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fbb0 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20  * (17a) */.     
1fbc0 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
1fbd0 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20  ->nSrc<1        
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37            /* (17
1fc00 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20  c) */.      ){. 
1fc10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1fc20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1fc30 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1fc40 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1fc50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1fc60 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20  striction (18). 
1fc70 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
1fc80 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1fc90 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
1fca0 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
1fcb0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
1fcc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1fcd0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
1fce0 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
1fcf0 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
1fd00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1fd10 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  }.  }..  /***** 
1fd20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1fd30 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
1fd40 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1fd50 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54   *****/.  SELECT
1fd60 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
1fd70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70  ,("flatten %s.%p
1fd80 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22   from term %d\n"
1fd90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fda0 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e       pSub->zSelN
1fdb0 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  ame, pSub, iFrom
1fdc0 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
1fdd0 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
1fde0 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
1fdf0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
1fe00 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
1fe10 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
1fe20 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1fe30 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
1fe40 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
1fe50 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
1fe60 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
1fe70 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1fe80 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
1fe90 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
1fea0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1feb0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1fec0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1fed0 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
1fee0 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
1fef0 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
1ff00 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
1ff10 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
1ff20 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
1ff30 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
1ff40 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
1ff50 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
1ff60 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
1ff70 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
1ff80 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
1ff90 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
1ffa0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
1ffb0 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
1ffc0 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
1ffd0 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
1ffe0 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
1fff0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
20000 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
20010 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
20020 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
20030 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
20040 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
20050 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
20060 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
20070 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
20080 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
20090 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
200a0 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
200b0 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
200c0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
200d0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
200e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
200f0 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
20100 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
20110 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
20120 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
20130 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
20140 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
20150 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
20160 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
20170 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
20180 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
20190 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
201a0 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
201b0 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
201c0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
201d0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
201e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
201f0 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
20200 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
20210 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
20220 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
20230 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
20240 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
20250 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
20260 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
20270 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
20280 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
20290 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
202a0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
202b0 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
202c0 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
202d0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
202e0 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
202f0 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
20300 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
20310 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
20320 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
20330 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
20340 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
20350 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
20360 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
20370 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  mit;.    Expr *p
20380 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
20390 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  set;.    Select 
203a0 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
203b0 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
203c0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
203d0 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
203e0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
203f0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
20400 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
20410 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
20420 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
20430 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
20440 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
20450 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d  Name(pNew, pSub-
20460 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  >zSelName);.    
20470 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
20480 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  fset;.    p->pLi
20490 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
204a0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
204b0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
204c0 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
204d0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
204e0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
204f0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50  0 ){.      p->pP
20500 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
20510 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20520 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
20530 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
20540 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
20550 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
20560 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
20570 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e  t = p;.      p->
20580 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
20590 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
205a0 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20  (2,pParse,p,.   
205b0 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64        ("compound
205c0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
205d0 6e 65 72 20 63 72 65 61 74 65 73 20 25 73 2e 25  ner creates %s.%
205e0 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20  p as peer\n",.  
205f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65         pNew->zSe
20600 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20  lName, pNew));. 
20610 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
20620 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
20630 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
20640 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
20650 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
20660 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
20670 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
20680 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
20690 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
206a0 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
206b0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
206c0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
206d0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
206e0 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
206f0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
20700 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
20710 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20720 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
20730 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
20740 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
20750 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
20760 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20770 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
20780 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
20790 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
207a0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
207b0 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
207c0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
207d0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
207e0 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
207f0 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
20800 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
20810 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20820 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
20830 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
20840 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
20850 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
20860 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
20870 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
20880 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
20890 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
208a0 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
208b0 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
208c0 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
208d0 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d  **.  ** pSubitem
208e0 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73  ->pTab is always
208f0 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73   non-NULL by tes
20900 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61  t restrictions a
20910 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a  nd tests above..
20920 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59    */.  if( ALWAY
20930 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  S(pSubitem->pTab
20940 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c  !=0) ){.    Tabl
20950 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
20960 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
20970 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
20980 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a  ->nTabRef==1 ){.
20990 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f        Parse *pTo
209a0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
209b0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
209c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61  arse);.      pTa
209d0 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d  bToDel->pNextZom
209e0 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d  bie = pToplevel-
209f0 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20  >pZombieTab;.   
20a00 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a     pToplevel->pZ
20a10 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54  ombieTab = pTabT
20a20 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oDel;.    }else{
20a30 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
20a40 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20  ->nTabRef--;.   
20a50 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d   }.    pSubitem-
20a60 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >pTab = 0;.  }..
20a70 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
20a80 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  ng loop runs onc
20a90 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
20aa0 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  in a compound-su
20ab0 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74  bquery.  ** flat
20ac0 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72  tening (as descr
20ad0 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66  ibed above).  If
20ae0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
20af0 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20  different kind. 
20b00 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e   ** of flattenin
20b10 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67  g - a flattening
20b20 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
20b30 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
20b40 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a  flattening -.  *
20b50 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70  * then this loop
20b60 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e   only runs once.
20b70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
20b80 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f  loop moves all o
20b90 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
20ba0 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
20bb0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
20bc0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
20bd0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
20be0 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
20bf0 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
20c00 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
20c10 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
20c20 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
20c30 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
20c40 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
20c50 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
20c60 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
20c70 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
20c80 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
20c90 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
20ca0 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
20cb0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
20cc0 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
20cd0 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
20ce0 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
20cf0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
20d00 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
20d10 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
20d20 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
20d30 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
20d40 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  ..  */.  for(pPa
20d50 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b  rent=p; pParent;
20d60 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74   pParent=pParent
20d70 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70  ->pPrior, pSub=p
20d80 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
20d90 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20    int nSubSrc;. 
20da0 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d     u8 jointype =
20db0 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20   0;.    pSubSrc 
20dc0 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20  = pSub->pSrc;   
20dd0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
20de0 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a   of subquery */.
20df0 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53      nSubSrc = pS
20e00 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a  ubSrc->nSrc;  /*
20e10 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
20e20 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f   in subquery FRO
20e30 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
20e40 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
20e50 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
20e60 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
20e70 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a  outer query */..
20e80 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a      if( pSrc ){.
20e90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20ea0 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20  arent==p );  /* 
20eb0 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75  First time throu
20ec0 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
20ed0 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20       jointype = 
20ee0 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69  pSubitem->fg.joi
20ef0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
20f00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20f10 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
20f20 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
20f30 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
20f40 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
20f50 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
20f60 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
20f70 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
20f80 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
20f90 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
20fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
20fb0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
20fc0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
20fd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
20fe0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
20ff0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
21000 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
21010 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
21020 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
21030 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
21040 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
21050 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
21060 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
21070 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
21080 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
21090 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
210a0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
210b0 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
210c0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
210d0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
210e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
210f0 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
21100 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
21110 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
21120 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
21130 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
21140 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
21150 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
21160 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
21170 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
21180 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
21190 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
211a0 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
211b0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
211c0 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
211d0 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
211e0 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
211f0 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
21200 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
21210 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20   to 4 slots..   
21220 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73   ** The middle s
21230 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20  lot is expanded 
21240 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20  to two slots in 
21250 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70  order to make sp
21260 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ace.    ** for t
21270 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  he two elements 
21280 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
21290 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
212a0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
212b0 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
212c0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
212d0 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c  Src = pSrc = sql
212e0 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
212f0 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75  ge(db, pSrc, nSu
21300 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b  bSrc-1,iFrom+1);
21310 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
21320 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
21330 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21340 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21350 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
21360 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
21370 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71  ms from the subq
21380 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
21390 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
213a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
213b0 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
213c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
213d0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
213e0 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69  (db, pSrc->a[i+i
213f0 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  From].pUsing);. 
21400 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
21410 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67  c->a[i+iFrom].fg
21420 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
21430 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
21440 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
21450 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  c->a[i];.      i
21460 4e 65 77 50 61 72 65 6e 74 20 3d 20 70 53 75 62  NewParent = pSub
21470 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
21480 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  r;.      memset(
21490 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
214a0 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
214b0 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
214c0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
214d0 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om].fg.jointype 
214e0 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
214f0 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
21500 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
21510 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
21520 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
21530 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
21540 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
21550 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
21560 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
21570 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
21580 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
21590 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
215a0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
215b0 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
215c0 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
215d0 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
21600 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
21610 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
21620 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
21630 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21640 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
21650 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21660 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
21670 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
21680 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
21690 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
216a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
216b0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
216c0 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
216d0 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
216e0 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
216f0 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
21700 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
21710 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  0"..    */.    i
21720 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
21730 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74  y ){.      /* At
21740 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79   this point, any
21750 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72   non-zero iOrder
21760 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64  ByCol values ind
21770 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  icate that the. 
21780 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
21790 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
217a0 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20  on is identical 
217b0 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43  to the iOrderByC
217c0 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65  ol'th.      ** e
217d0 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e  xpression return
217e0 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61  ed by SELECT sta
217f0 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e  tement pSub. Sin
21800 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a  ce these values.
21810 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20        ** do not 
21820 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72  necessarily corr
21830 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e  espond to column
21840 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74  s in SELECT stat
21850 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20  ement pParent,. 
21860 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65       ** zero the
21870 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65  m before transfe
21880 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ring the ORDER B
21890 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
218a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20  **.      ** Not 
218b0 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63  doing this may c
218c0 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66  ause an error if
218d0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
218e0 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
218f0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74   ** function att
21900 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
21910 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d   a compound sub-
21920 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65  query into pPare
21930 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65  nt.      ** (the
21940 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63   only way this c
21950 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20  an happen is if 
21960 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
21970 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20  -query is.      
21980 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72  ** currently par
21990 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29  t of pSub->pSrc)
219a0 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31  . See ticket [d1
219b0 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20  1a6e908f].  */. 
219c0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
219d0 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
219e0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
219f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
21a00 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
21a10 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  {.        pOrder
21a20 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
21a30 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
21a40 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
21a50 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
21a60 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
21a70 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
21a80 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
21a90 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
21aa0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
21ab0 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
21ac0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
21ad0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
21ae0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
21af0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
21b00 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66  );.    if( isLef
21b10 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20 20 20  tJoin>0 ){.     
21b20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68   setJoinExpr(pWh
21b30 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e 74 29  ere, iNewParent)
21b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
21b50 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ent->pWhere = sq
21b60 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
21b70 20 70 57 68 65 72 65 2c 20 70 50 61 72 65 6e 74   pWhere, pParent
21b80 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69  ->pWhere);.    i
21b90 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
21ba0 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  led==0 ){.      
21bb0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a  SubstContext x;.
21bc0 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
21bd0 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
21be0 2e 69 54 61 62 6c 65 20 3d 20 69 50 61 72 65 6e  .iTable = iParen
21bf0 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54  t;.      x.iNewT
21c00 61 62 6c 65 20 3d 20 69 4e 65 77 50 61 72 65 6e  able = iNewParen
21c10 74 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66  t;.      x.isLef
21c20 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f  tJoin = isLeftJo
21c30 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69  in;.      x.pELi
21c40 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73  st = pSub->pELis
21c50 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  t;.      substSe
21c60 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65 6e 74  lect(&x, pParent
21c70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
21c80 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
21c90 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
21ca0 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
21cb0 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
21cc0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
21cd0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
21ce0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
21cf0 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
21d00 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
21d10 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
21d20 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
21d30 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
21d40 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
21d50 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
21d60 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
21d70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
21d80 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
21d90 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
21da0 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
21db0 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
21dc0 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
21dd0 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
21de0 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
21df0 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
21e00 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
21e10 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
21e20 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
21e30 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
21e40 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
21e50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
21e60 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
21e70 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
21e80 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
21e90 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
21ea0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
21eb0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
21ec0 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
21ed0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
21ee0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
21ef0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
21f00 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
21f10 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
21f20 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
21f30 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  After flattening
21f40 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
21f50 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
21f60 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
21f70 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
21f80 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
21f90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21fa0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
21fb0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
21fc0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
21fd0 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
21fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21ff0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
22000 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
22010 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63  EW)./*.** Make c
22020 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e  opies of relevan
22030 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  t WHERE clause t
22040 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65  erms of the oute
22050 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20  r query into.** 
22060 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
22070 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45   of subquery.  E
22080 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
22090 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
220a0 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
220b0 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29  -d AS y FROM t1)
220c0 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
220d0 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  =10;.**.** Trans
220e0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a  formed into:.**.
220f0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
22100 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
22110 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
22120 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41  M t1 WHERE a=5 A
22130 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20  ND c-d=10).**   
22140 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20    WHERE x=5 AND 
22150 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  y=10;.**.** The 
22160 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65  hope is that the
22170 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20   terms added to 
22180 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
22190 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72  will make it mor
221a0 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a  e.** efficient..
221b0 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  **.** Do not att
221c0 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69  empt this optimi
221d0 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  zation if:.**.**
221e0 20 20 20 28 31 29 20 28 2a 2a 20 54 68 69 73 20     (1) (** This 
221f0 72 65 73 74 72 69 63 74 69 6f 6e 20 77 61 73 20  restriction was 
22200 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30 31 37 2d  removed on 2017-
22210 30 39 2d 32 39 2e 20 20 57 65 20 75 73 65 64 20  09-29.  We used 
22220 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
22230 64 69 73 61 6c 6c 6f 77 20 74 68 69 73 20 6f 70  disallow this op
22240 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 61  timization for a
22250 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
22260 69 65 73 2c 20 62 75 74 20 6e 6f 77 0a 2a 2a 20  ies, but now.** 
22270 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
22280 61 6c 6c 6f 77 65 64 20 62 79 20 70 75 74 74 69  allowed by putti
22290 6e 67 20 74 68 65 20 65 78 74 72 61 20 74 65 72  ng the extra ter
222a0 6d 73 20 6f 6e 20 74 68 65 20 48 41 56 49 4e 47  ms on the HAVING
222b0 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
222c0 20 20 20 20 20 20 54 68 65 20 61 64 64 65 64 20        The added 
222d0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
222e0 20 70 6f 69 6e 74 6c 65 73 73 20 69 66 20 74 68   pointless if th
222f0 65 20 73 75 62 71 75 65 72 79 20 6c 61 63 6b 73  e subquery lacks
22300 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 20  .**           a 
22310 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
22320 20 20 42 75 74 20 73 75 63 68 20 61 20 48 41 56    But such a HAV
22330 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 61 6c  ING clause is al
22340 73 6f 20 68 61 72 6d 6c 65 73 73 0a 2a 2a 20 20  so harmless.**  
22350 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 65 72           so ther
22360 65 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  e does not appea
22370 72 20 74 6f 20 62 65 20 61 6e 79 20 72 65 61 73  r to be any reas
22380 6f 6e 20 74 6f 20 61 64 64 20 65 78 74 72 61 20  on to add extra 
22390 6c 6f 67 69 63 0a 2a 2a 20 20 20 20 20 20 20 20  logic.**        
223a0 20 20 20 74 6f 20 73 75 70 70 72 65 73 73 20 69     to suppress i
223b0 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28  t. **).**.**   (
223c0 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  2) The inner que
223d0 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73  ry is the recurs
223e0 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f  ive part of a co
223f0 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
22400 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  ssion..**.**   (
22410 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  3) The inner que
22420 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63  ry has a LIMIT c
22430 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65  lause (since the
22440 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
22450 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63  WHERE.**       c
22460 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67  lose would chang
22470 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66  e the meaning of
22480 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a   the LIMIT)..**.
22490 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e  **   (4) The inn
224a0 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
224b0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
224c0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28   a LEFT JOIN.  (
224d0 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  The caller.**   
224e0 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69      enforces thi
224f0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69  s restriction si
22500 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
22510 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65   does not have e
22520 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69  nough.**       i
22530 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e  nformation to kn
22540 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  ow.).**.**   (5)
22550 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
22560 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
22570 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f  ginates in the O
22580 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
22590 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20  e.**       of a 
225a0 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a  LEFT JOIN..**.**
225b0 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20   Return 0 if no 
225c0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
225d0 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   and non-zero if
225e0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
225f0 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72  RE clause.** ter
22600 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ms are duplicate
22610 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75  d into the subqu
22620 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
22630 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  nt pushDownWhere
22640 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
22650 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
22660 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
22670 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  (for malloc() an
22680 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  d error reportin
22690 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  g) */.  Select *
226a0 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a  pSubq,        /*
226b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77 68   The subquery wh
226c0 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ose WHERE clause
226d0 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e   is to be augmen
226e0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ted */.  Expr *p
226f0 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
22700 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
22710 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
22720 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
22730 43 75 72 73 6f 72 20 20 20 20 20 20 20 20 20 20  Cursor          
22740 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
22750 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  r of the subquer
22760 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  y */.){.  Expr *
22770 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  pNew;.  int nChn
22780 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68  g = 0;.  if( pWh
22790 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ere==0 ) return 
227a0 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  0;.  if( pSubq->
227b0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
227c0 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e  cursive ) return
227d0 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74   0;  /* restrict
227e0 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 64  ion (2) */..#ifd
227f0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
22800 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69    /* Only the fi
22810 72 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f  rst term of a co
22820 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20  mpound can have 
22830 61 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20  a WITH clause.  
22840 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  But make.  ** su
22850 72 65 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d  re no other term
22860 73 20 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f  s are marked SF_
22870 52 65 63 75 72 73 69 76 65 20 69 6e 20 63 61 73  Recursive in cas
22880 65 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e  e something chan
22890 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ges.  ** in the 
228a0 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b  future..  */.  {
228b0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  .    Select *pX;
228c0 20 20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53    .    for(pX=pS
228d0 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  ubq; pX; pX=pX->
228e0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61  pPrior){.      a
228f0 73 73 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46  ssert( (pX->selF
22900 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
22910 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20  sive))==0 );.   
22920 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
22930 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d   if( pSubq->pLim
22940 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  it!=0 ){.    ret
22950 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
22960 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d  ction (3) */.  }
22970 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65  .  while( pWhere
22980 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
22990 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73      nChng += pus
229a0 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
229b0 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70  pParse, pSubq, p
229c0 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20 69  Where->pRight, i
229d0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57 68  Cursor);.    pWh
229e0 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
229f0 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45  eft;.  }.  if( E
22a00 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22a10 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69  Where,EP_FromJoi
22a20 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  n) ) return 0; /
22a30 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * restriction (5
22a40 29 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  ) */.  if( sqlit
22a50 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
22a60 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
22a70 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
22a80 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
22a90 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
22aa0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b   SubstContext x;
22ab0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
22ac0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
22ad0 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c  rse->db, pWhere,
22ae0 20 30 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61   0);.      x.pPa
22af0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
22b00 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
22b10 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e  Cursor;.      x.
22b20 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72  iNewTable = iCur
22b30 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c  sor;.      x.isL
22b40 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20  eftJoin = 0;.   
22b50 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
22b60 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ubq->pEList;.   
22b70 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45     pNew = substE
22b80 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20  xpr(&x, pNew);. 
22b90 20 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e       if( pSubq->
22ba0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
22bb0 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20  gregate ){.     
22bc0 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e     pSubq->pHavin
22bd0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
22be0 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
22bf0 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70  Subq->pHaving, p
22c00 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  New);.      }els
22c10 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  e{.        pSubq
22c20 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
22c30 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
22c40 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68  ->db, pSubq->pWh
22c50 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
22c60 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71 20    }.      pSubq 
22c70 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b  = pSubq->pPrior;
22c80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22c90 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e  urn nChng;.}.#en
22ca0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
22cb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
22cc0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
22cd0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
22ce0 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61  EW) */../*.** Ba
22cf0 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
22d00 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e  nts of the AggIn
22d10 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  fo structure ind
22d20 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
22d30 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
22d40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
22d50 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c  hecks if the fol
22d60 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
22d70 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
22d80 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a  query contains j
22d90 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ust a single agg
22da0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
22db0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67  .**    * the agg
22dc0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
22dd0 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20  is either min() 
22de0 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a  or max(), and.**
22df0 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65      * the argume
22e00 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  nt to the aggreg
22e10 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
22e20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a  a column value..
22e30 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  **.** If all of 
22e40 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72  the above are tr
22e50 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f  ue, then WHERE_O
22e60 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
22e70 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a  ERE_ORDERBY_MAX.
22e80 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
22e90 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41  s appropriate. A
22ea0 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  lso, *ppMinMax i
22eb0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22ec0 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f  o the .** list o
22ed0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
22ee0 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ed to the aggreg
22ef0 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ate before retur
22f00 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ning..**.** Or, 
22f10 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  if the condition
22f20 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20  s above are not 
22f30 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  met, *ppMinMax i
22f40 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
22f50 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
22f60 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e  NORMAL is return
22f70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ed..*/.static u8
22f80 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67   minMaxQuery(Agg
22f90 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20  Info *pAggInfo, 
22fa0 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
22fb0 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
22fc0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
22fd0 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20  _NORMAL;        
22fe0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
22ff0 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61  e */..  *ppMinMa
23000 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67  x = 0;.  if( pAg
23010 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20  gInfo->nFunc==1 
23020 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
23030 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  pr = pAggInfo->a
23040 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f  Func[0].pExpr; /
23050 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63  * Aggregate func
23060 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
23070 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
23080 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
23090 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
230a0 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
230b0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
230c0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
230d0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
230e0 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
230f0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
23100 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
23110 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
23120 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
23130 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23140 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75  zFunc = pExpr->u
23150 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69  .zToken;.      i
23160 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
23170 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
23180 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
23190 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
231a0 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
231b0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
231c0 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  st;.      }else 
231d0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
231e0 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
231f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
23200 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
23210 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20  RBY_MAX;.       
23220 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
23230 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
23240 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
23250 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  ( *ppMinMax==0 |
23260 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e  | (*ppMinMax)->n
23270 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Expr==1 );.  ret
23280 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
23290 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
232a0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
232b0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
232c0 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
232d0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
232e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
232f0 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
23300 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
23310 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
23320 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
23330 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
23340 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
23350 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
23360 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
23370 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
23380 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
23390 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
233a0 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
233b0 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
233c0 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
233d0 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
233e0 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
233f0 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
23400 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
23410 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
23420 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
23430 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
23440 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
23450 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
23460 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
23470 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
23480 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
23490 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
234a0 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
234b0 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
234c0 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
234d0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
234e0 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
234f0 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
23500 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
23510 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
23520 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
23530 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
23540 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
23550 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
23560 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
23570 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
23580 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
23590 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
235a0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
235b0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
235c0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
235d0 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
235e0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
235f0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
23600 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
23610 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
23620 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
23630 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
23640 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
23650 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
23660 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
23670 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
23680 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
23690 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
236a0 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
236b0 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
236c0 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
236d0 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
236e0 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
236f0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
23700 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
23710 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
23720 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
23730 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
23740 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
23750 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
23760 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
23770 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
23780 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
23790 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
237a0 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
237b0 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
237c0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
237d0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
237e0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
237f0 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
23800 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
23810 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
23820 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
23830 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73   && pFrom->fg.is
23840 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20  IndexedBy ){.   
23850 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
23860 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
23870 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79  char *zIndexedBy
23880 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e   = pFrom->u1.zIn
23890 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
238a0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
238b0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
238c0 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
238d0 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
238e0 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
238f0 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
23900 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
23910 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
23920 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
23930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
23940 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23950 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
23960 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
23970 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
23980 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
23990 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
239a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
239b0 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
239c0 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  IBIndex = pIdx;.
239d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
239e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
239f0 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
23a00 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
23a10 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
23a20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
23a30 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
23a40 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
23a50 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
23a60 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
23a70 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
23a80 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
23a90 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
23aa0 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
23ab0 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
23ac0 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
23ad0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
23ae0 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
23af0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
23b00 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
23b10 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
23b20 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
23b30 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
23b40 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
23b50 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
23b60 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
23b70 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
23b80 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
23b90 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
23ba0 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
23bb0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
23bc0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
23bd0 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
23be0 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
23bf0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
23c00 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
23c10 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
23c20 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
23c30 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
23c40 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
23c50 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
23c60 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
23c70 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
23c80 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
23c90 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
23ca0 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
23cb0 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
23cc0 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
23cd0 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
23ce0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
23cf0 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
23d00 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
23d10 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
23d20 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
23d30 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
23d40 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
23d50 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
23d60 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
23d70 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
23d80 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
23d90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
23da0 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
23db0 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
23dc0 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
23dd0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
23de0 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
23df0 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
23e00 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
23e10 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
23e20 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
23e30 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23e40 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
23e50 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
23e60 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
23e70 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
23e80 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
23e90 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
23ea0 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
23eb0 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
23ec0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23ed0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
23ee0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
23ef0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
23f00 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
23f10 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
23f20 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
23f30 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
23f40 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
23f50 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
23f60 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23f70 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
23f80 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
23f90 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
23fa0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
23fb0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
23fc0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
23fd0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
23fe0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
23ff0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
24000 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
24010 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
24020 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
24030 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
24040 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
24050 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
24060 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
24070 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
24080 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
24090 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
240a0 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
240b0 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
240c0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
240d0 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
240e0 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
240f0 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
24100 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
24110 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
24120 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
24130 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  b, TK_ASTERISK, 
24140 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
24150 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
24160 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
24170 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
24180 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
24190 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
241a0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
241b0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
241c0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
241d0 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70  ->pWith = 0;.  p
241e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
241f0 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73  F_Compound;.  as
24200 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
24210 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65  gs & SF_Converte
24220 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65  d)==0 );.  p->se
24230 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e  lFlags |= SF_Con
24240 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74  verted;.  assert
24250 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d  ( pNew->pPrior!=
24260 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  0 );.  pNew->pPr
24270 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
24280 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  w;.  pNew->pLimi
24290 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  t = 0;.  pNew->p
242a0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65  Offset = 0;.  re
242b0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
242c0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e;.}../*.** Chec
242d0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
242e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
242f0 20 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65   pFrom has table
24300 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e  -valued function
24310 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  .** arguments.  
24320 49 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76  If it does, leav
24330 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
24340 67 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ge in pParse and
24350 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
24360 65 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d  ero, since pFrom
24370 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
24380 74 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61  to be a table-va
24390 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  lued function..*
243a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e  /.static int can
243b0 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61  notBeFunction(Pa
243c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
243d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
243e0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
243f0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pFrom->fg.isTabF
24400 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unc ){.    sqlit
24410 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
24420 65 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20  e, "'%s' is not 
24430 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72  a function", pFr
24440 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  om->zName);.    
24450 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
24460 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
24470 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24480 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  _CTE./*.** Argum
24490 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68  ent pWith (which
244a0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f   may be NULL) po
244b0 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64  ints to a linked
244c0 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20   list of nested 
244d0 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74  .** WITH context
244e0 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f  s, from inner to
244f0 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74   outermost. If t
24500 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
24510 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20  ied by .** FROM 
24520 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70  clause element p
24530 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61  Item is really a
24540 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78   common-table-ex
24550 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a  pression (CTE) .
24560 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  ** then return a
24570 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24580 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66  CTE definition f
24590 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f  or that table. O
245a0 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75  therwise.** retu
245b0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
245c0 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  f a non-NULL val
245d0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ue is returned, 
245e0 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74  set *ppContext t
245f0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57  o point to the W
24600 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ith.** object th
24610 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
24620 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  CTE belongs to..
24630 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
24640 20 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68   Cte *searchWith
24650 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  (.  With *pWith,
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24670 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69      /* Current i
24680 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c  nnermost WITH cl
24690 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
246a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
246b0 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f  Item,     /* FRO
246c0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
246d0 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20   to resolve */. 
246e0 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78   With **ppContex
246f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
24700 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c   /* OUT: WITH cl
24710 61 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75  ause return valu
24720 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
24730 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
24740 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49  *zName;.  if( pI
24750 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
24760 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49  0 && (zName = pI
24770 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  tem->zName)!=0 )
24780 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20  {.    With *p;. 
24790 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20     for(p=pWith; 
247a0 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b  p; p=p->pOuter){
247b0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
247c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
247d0 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
247e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
247f0 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
24800 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  p->a[i].zName)==
24810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
24820 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20  ppContext = p;. 
24830 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
24840 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  &p->a[i];.      
24850 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24860 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
24870 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65  ;.}../* The code
24880 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74   generator maint
24890 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20  ains a stack of 
248a0 61 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75  active WITH clau
248b0 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ses.** with the 
248c0 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20  inner-most WITH 
248d0 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20  clause being at 
248e0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
248f0 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
24900 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20   routine pushes 
24910 74 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20  the WITH clause 
24920 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
24930 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
24940 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66   onto the top of
24950 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61   the stack. If a
24960 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73  rgument bFree is
24970 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73   true, then this
24980 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20  .** WITH clause 
24990 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f  will never be po
249a0 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
249b0 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
249c0 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  e it.** should b
249d0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
249e0 74 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  th the Parse obj
249f0 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61  ect. In other ca
24a00 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72  ses, when.** bFr
24a10 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20  ee==0, the With 
24a20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66  object will be f
24a30 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
24a40 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73  the SELECT .** s
24a50 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68  tatement with wh
24a60 69 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69  ich it is associ
24a70 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
24a80 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61  lite3WithPush(Pa
24a90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74  rse *pParse, Wit
24aa0 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72  h *pWith, u8 bFr
24ab0 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62  ee){.  assert( b
24ac0 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72  Free==0 || (pPar
24ad0 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20  se->pWith==0 && 
24ae0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
24af0 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  ree==0) );.  if(
24b00 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73   pWith ){.    as
24b10 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
24b20 69 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith!=pWith );.  
24b30 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20    pWith->pOuter 
24b40 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
24b50 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
24b60 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
24b70 69 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72  if( bFree ) pPar
24b80 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20  se->pWithToFree 
24b90 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a  = pWith;.  }.}..
24ba0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24bb0 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72  ion checks if ar
24bc0 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66  gument pFrom ref
24bd0 65 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63  ers to a CTE dec
24be0 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57  lared by .** a W
24bf0 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ITH clause on th
24c00 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c  e stack currentl
24c10 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  y maintained by 
24c20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c  the parser. And,
24c30 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79  .** if currently
24c40 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54   processing a CT
24c50 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66  E expression, if
24c60 20 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69   it is a recursi
24c70 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ve.** reference 
24c80 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43  to the current C
24c90 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  TE..**.** If pFr
24ca0 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69  om falls into ei
24cb0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
24cc0 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65  categories above
24cd0 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a  , pFrom->pTab.**
24ce0 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
24cf0 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
24d00 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65  accordingly. The
24d10 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63   caller should c
24d20 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e  heck.** (pFrom->
24d30 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65  pTab!=0) to dete
24d40 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
24d50 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75   not a successfu
24d60 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66  l match.** was f
24d70 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ound..**.** Whet
24d80 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74  her or not a mat
24d90 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c  ch is found, SQL
24da0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
24db0 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a  ed if no error.*
24dc0 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  * occurs. If an 
24dd0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
24de0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
24df0 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
24e00 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e  the.** parser an
24e10 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64  d some error cod
24e20 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
24e30 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
24e40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
24e50 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c  ithExpand(.  Wal
24e60 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20  ker *pWalker, . 
24e70 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
24e80 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20  item *pFrom.){. 
24e90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
24ea0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
24eb0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
24ec0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24ed0 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
24ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24ef0 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28  /* Matched CTE (
24f00 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61  or NULL if no ma
24f10 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a  tch) */.  With *
24f20 70 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  pWith;          
24f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54            /* WIT
24f40 48 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43  H clause that pC
24f50 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  te belongs to */
24f60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f  ..  assert( pFro
24f70 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20  m->pTab==0 );.. 
24f80 20 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69   pCte = searchWi
24f90 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  th(pParse->pWith
24fa0 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29  , pFrom, &pWith)
24fb0 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a  ;.  if( pCte ){.
24fc0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
24fd0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
24fe0 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63  EList;.    Selec
24ff0 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c  t *pSel;.    Sel
25000 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  ect *pLeft;     
25010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
25020 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ft-most SELECT s
25030 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
25040 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76  int bMayRecursiv
25050 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
25060 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e   True if compoun
25070 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f  d joined by UNIO
25080 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57  N [ALL] */.    W
25090 69 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b  ith *pSavedWith;
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
250b0 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
250c0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a   pParse->pWith *
250d0 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74  /..    /* If pCt
250e0 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f  e->zCteErr is no
250f0 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70  n-NULL at this p
25100 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  oint, then this 
25110 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20  is an illegal.  
25120 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72    ** recursive r
25130 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20  eference to CTE 
25140 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65  pCte. Leave an e
25150 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61  rror in pParse a
25160 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
25170 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d   early. If pCte-
25180 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c  >zCteErr is NULL
25190 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e  , then this is n
251a0 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72  ot a recursive r
251b0 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a  eference..    **
251c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70   In this case, p
251d0 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20  roceed.  */.    
251e0 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72  if( pCte->zCteEr
251f0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
25200 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25210 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  e, pCte->zCteErr
25220 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
25230 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25240 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
25250 0a 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42  .    if( cannotB
25260 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  eFunction(pParse
25270 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
25280 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25290 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
252a0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
252b0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
252c0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
252d0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
252e0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
252f0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
25300 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
25310 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54  rt;.    pTab->nT
25320 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  abRef = 1;.    p
25330 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
25340 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
25350 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
25360 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
25370 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
25380 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
25390 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
253a0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
253b0 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62  576) );.    pTab
253c0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
253d0 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f  _Ephemeral | TF_
253e0 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
253f0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
25400 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
25410 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  ctDup(db, pCte->
25420 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
25430 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25440 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
25450 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
25460 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
25470 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  rom->pSelect );.
25480 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
25490 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72   this is a recur
254a0 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20  sive CTE. */.   
254b0 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70   pSel = pFrom->p
254c0 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79  Select;.    bMay
254d0 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53  Recursive = ( pS
254e0 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  el->op==TK_ALL |
254f0 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55  | pSel->op==TK_U
25500 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  NION );.    if( 
25510 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
25520 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
25530 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
25540 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  c = pFrom->pSele
25550 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  ct->pSrc;.      
25560 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
25570 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
25580 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
25590 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
255a0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  = &pSrc->a[i];. 
255b0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
255c0 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a  ->zDatabase==0 .
255d0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65           && pIte
255e0 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20  m->zName!=0 .   
255f0 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
25600 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d  te3StrICmp(pItem
25610 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a  ->zName, pCte->z
25620 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20  Name).          
25630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
25640 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  em->pTab = pTab;
25650 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
25660 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
25670 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
25680 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b  pTab->nTabRef++;
25690 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d  .          pSel-
256a0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
256b0 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20  Recursive;.     
256c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
256d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
256e0 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65  one recursive re
256f0 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69  ference is permi
25700 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66  tted. */ .    if
25710 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e  ( pTab->nTabRef>
25720 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
25730 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20  e3ErrorMsg(.    
25740 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d        pParse, "m
25750 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63  ultiple referenc
25760 65 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20  es to recursive 
25770 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65  table: %s", pCte
25780 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
25790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
257a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
257b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  }.    assert( pT
257c0 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c  ab->nTabRef==1 |
257d0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  | .            (
257e0 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26  (pSel->selFlags&
257f0 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26  SF_Recursive) &&
25800 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d   pTab->nTabRef==
25810 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d  2 ));..    pCte-
25820 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63  >zCteErr = "circ
25830 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20  ular reference: 
25840 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57  %s";.    pSavedW
25850 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ith = pParse->pW
25860 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
25870 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
25880 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
25890 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53  rsive ){.      S
258a0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
258b0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
258c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
258d0 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a  or->pWith==0 );.
258e0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57        pPrior->pW
258f0 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74  ith = pSel->pWit
25900 68 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  h;.      sqlite3
25910 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
25920 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20  er, pPrior);.   
25930 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68     pPrior->pWith
25940 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
25950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
25960 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
25970 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pSel);.    }. 
25980 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
25990 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66   = pWith;..    f
259a0 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70  or(pLeft=pSel; p
259b0 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c  Left->pPrior; pL
259c0 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f  eft=pLeft->pPrio
259d0 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  r);.    pEList =
259e0 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a   pLeft->pEList;.
259f0 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43      if( pCte->pC
25a00 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ols ){.      if(
25a10 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
25a20 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e  t->nExpr!=pCte->
25a30 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a  pCols->nExpr ){.
25a40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
25a50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
25a60 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64  "table %s has %d
25a70 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63   values for %d c
25a80 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20  olumns",.       
25a90 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65       pCte->zName
25aa0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
25ab0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45   pCte->pCols->nE
25ac0 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  xpr.        );. 
25ad0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
25ae0 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74  With = pSavedWit
25af0 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  h;.        retur
25b00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45        }.      pE
25b20 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f  List = pCte->pCo
25b30 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ls;.    }..    s
25b40 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
25b50 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
25b60 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  , pEList, &pTab-
25b70 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
25b80 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  ol);.    if( bMa
25b90 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
25ba0 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65      if( pSel->se
25bb0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
25bc0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20  rsive ){.       
25bd0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
25be0 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72   "multiple recur
25bf0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a  sive references:
25c00 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73   %s";.      }els
25c10 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  e{.        pCte-
25c20 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75  >zCteErr = "recu
25c30 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
25c40 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25  in a subquery: %
25c50 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s";.      }.    
25c60 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
25c70 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
25c80 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  l);.    }.    pC
25c90 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b  te->zCteErr = 0;
25ca0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
25cb0 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
25cc0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
25cd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
25ce0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
25cf0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
25d00 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
25d10 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
25d20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61  cond argument ha
25d30 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20  s an associated 
25d40 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c  WITH .** clause,
25d50 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65   pop it from the
25d60 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73   stack stored as
25d70 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72   part of the Par
25d80 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  se object..**.**
25d90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25da0 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53  s used as the xS
25db0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29  electCallback2()
25dc0 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20   callback by.** 
25dd0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
25de0 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69  and() when walki
25df0 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65  ng a SELECT tree
25e00 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c   to resolve tabl
25e10 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f  e.** names and o
25e20 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
25e30 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73   elements. .*/.s
25e40 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
25e50 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20  tPopWith(Walker 
25e60 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
25e70 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
25e80 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
25e90 3e 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f  >pParse;.  if( O
25ea0 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45  K_IF_ALWAYS_TRUE
25eb0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20  (pParse->pWith) 
25ec0 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  && p->pPrior==0 
25ed0 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69  ){.    With *pWi
25ee0 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f  th = findRightmo
25ef0 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20  st(p)->pWith;.  
25f00 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29    if( pWith!=0 )
25f10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25f20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70  pParse->pWith==p
25f30 57 69 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50  With );.      pP
25f40 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
25f50 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  ith->pOuter;.   
25f60 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
25f70 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70  define selectPop
25f80 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  With 0.#endif../
25f90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
25fa0 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61  e is a Walker ca
25fb0 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61  llback for "expa
25fc0 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20  nding" a SELECT 
25fd0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45  statement..** "E
25fe0 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20  xpanding" means 
25ff0 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  to do the follow
26000 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ing:.**.**    (1
26010 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
26020 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
26030 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
26040 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
26050 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
26060 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
26070 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
26080 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
26090 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
260a0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
260b0 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
260c0 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
260d0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
260e0 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
260f0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
26100 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
26110 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
26120 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
26130 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
26140 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
26150 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
26160 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
26170 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
26180 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
26190 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
261a0 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
261b0 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
261c0 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
261d0 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
261e0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
261f0 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
26200 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
26210 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 72  the persistent r
26220 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
26230 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
26240 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
26250 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
26260 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
26270 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65  e to accommodate
26280 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
26290 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
262a0 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
262b0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
262c0 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
262d0 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
262e0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
262f0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
26300 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
26310 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
26320 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
26330 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
26340 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
26350 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
26360 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
26370 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
26380 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
26390 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
263a0 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
263b0 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
263c0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
263d0 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a  in TABLE..**.*/.
263e0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
263f0 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72  tExpander(Walker
26400 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
26410 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
26420 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
26430 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
26440 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69  i, j, k;.  SrcLi
26450 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
26460 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
26470 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
26480 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
26490 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
264a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
264b0 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c  pr *pE, *pRight,
264c0 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73   *pExpr;.  u16 s
264d0 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
264e0 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c  Flags;..  p->sel
264f0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61  Flags |= SF_Expa
26500 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e  nded;.  if( db->
26510 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b  mallocFailed  ){
26520 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
26530 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Abort;.  }.  if(
26540 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d   NEVER(p->pSrc==
26550 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20  0) || (selFlags 
26560 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
26570 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
26580 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
26590 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
265a0 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
265b0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
265c0 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52   OK_IF_ALWAYS_TR
265d0 55 45 28 70 2d 3e 70 57 69 74 68 29 20 29 7b 0a  UE(p->pWith) ){.
265e0 20 20 20 20 73 71 6c 69 74 65 33 57 69 74 68 50      sqlite3WithP
265f0 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ush(pParse, p->p
26600 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  With, 0);.  }.. 
26610 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
26620 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
26630 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
26640 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
26650 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
26660 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
26670 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
26680 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
26690 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
266a0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
266b0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
266c0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
266d0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
266e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
266f0 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
26700 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
26710 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
26720 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
26730 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
26740 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
26750 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
26760 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
26770 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
26780 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
26790 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
267a0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
267b0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
267c0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
267d0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
267e0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
267f0 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
26800 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d  sive==0 || pFrom
26810 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ->pTab!=0 );.   
26820 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
26830 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e  sRecursive ) con
26840 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
26850 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
26860 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
26870 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
26880 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28   if( withExpand(
26890 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20  pWalker, pFrom) 
268a0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
268b0 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  rt;.    if( pFro
268c0 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73  m->pTab ) {} els
268d0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
268e0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
268f0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
26900 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
26910 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
26920 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
26930 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
26940 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
26950 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
26960 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
26970 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
26980 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
26990 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
269a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
269b0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
269c0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
269d0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
269e0 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  ort;.      pFrom
269f0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
26a00 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
26a10 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
26a20 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66  able));.      if
26a30 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
26a40 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26a50 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
26a60 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  f = 1;.      if(
26a70 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29   pFrom->zAlias )
26a80 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
26a90 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
26aa0 62 53 74 72 44 75 70 28 64 62 2c 20 70 46 72 6f  bStrDup(db, pFro
26ab0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
26ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26ad0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
26ae0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
26af0 2c 20 22 73 75 62 71 75 65 72 79 5f 25 70 22 2c  , "subquery_%p",
26b00 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
26b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
26b20 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
26b30 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
26b40 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
26b50 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
26b60 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
26b70 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
26b80 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54  ,&pTab->nCol,&pT
26b90 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->aCol);.     
26ba0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
26bb0 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  1;.      pTab->n
26bc0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
26bd0 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
26be0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
26bf0 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54  576) );.      pT
26c00 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
26c10 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65  TF_Ephemeral;.#e
26c20 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
26c30 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
26c40 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
26c50 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
26c60 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
26c70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
26c80 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
26c90 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
26ca0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
26cb0 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
26cc0 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d  pParse, 0, pFrom
26cd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
26ce0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
26cf0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69  C_Abort;.      i
26d00 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  f( pTab->nTabRef
26d10 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  >=0xffff ){.    
26d20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26d30 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
26d40 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73   many references
26d50 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20   to \"%s\": max 
26d60 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20  65535",.        
26d70 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b     pTab->zName);
26d80 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
26d90 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
26da0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
26db0 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
26dc0 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
26dd0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  +;.      if( !Is
26de0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
26df0 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
26e00 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  n(pParse, pFrom)
26e10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
26e20 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26e30 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e      }.#if !defin
26e40 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
26e50 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
26e60 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
26e70 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
26e80 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
26e90 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70  pTab) || pTab->p
26ea0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
26eb0 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20    i16 nCol;.    
26ec0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
26ed0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
26ee0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
26ef0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
26f00 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
26f10 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
26f20 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
26f30 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
26f40 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
26f50 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
26f60 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
26f70 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
26f80 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53  etName(pFrom->pS
26f90 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61  elect, pTab->zNa
26fa0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  me);.        nCo
26fb0 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  l = pTab->nCol;.
26fc0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43          pTab->nC
26fd0 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ol = -1;.       
26fe0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
26ff0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  ct(pWalker, pFro
27000 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
27010 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
27020 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  = nCol;.      }.
27030 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
27040 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
27050 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
27060 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
27070 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
27080 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
27090 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
270a0 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
270b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
270c0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
270d0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
270e0 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
270f0 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
27100 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
27110 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
27120 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
27130 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
27140 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
27150 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
27160 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
27170 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
27180 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
27190 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
271a0 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
271b0 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
271c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
271d0 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
271e0 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
271f0 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
27200 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
27210 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
27220 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
27230 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
27240 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
27250 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  h the TK_ASTERIS
27260 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  K operator for e
27270 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
27280 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
27290 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20  umn.  ** list.  
272a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
272b0 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
272c0 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54  ocate the TK_AST
272d0 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65  ERISK.  ** expre
272e0 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
272f0 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  d each one to th
27300 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
27310 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c  lumns in.  ** al
27320 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
27330 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
27340 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
27350 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
27360 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
27370 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
27380 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
27390 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
273a0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
273b0 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70  k++){.    pE = p
273c0 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
273d0 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
273e0 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29  p==TK_ASTERISK )
273f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
27400 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
27410 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
27420 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
27430 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
27440 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21  T || (pE->pLeft!
27450 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  =0 && pE->pLeft-
27460 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20  >op==TK_ID) );. 
27470 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
27480 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
27490 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45  ght->op==TK_ASTE
274a0 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  RISK ) break;.  
274b0 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
274c0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
274d0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
274e0 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
274f0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
27500 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
27510 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
27520 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
27530 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
27540 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
27550 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
27560 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
27570 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
27580 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
27590 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
275a0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
275b0 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
275c0 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
275d0 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
275e0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
275f0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
27600 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
27610 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
27620 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
27630 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
27650 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
27660 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
27670 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
27680 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
27690 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45  ; k++){.      pE
276a0 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
276b0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
276c0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
276d0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
276e0 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
276f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
27700 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45   pE->op!=TK_ASTE
27710 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28  RISK.       && (
27720 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
27730 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
27740 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20  _ASTERISK).     
27750 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
27760 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
27770 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
27780 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
27790 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
277a0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
277b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
277c0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
277d0 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
277e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
277f0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
27800 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
27810 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
27820 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
27830 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
27840 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
27850 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
27860 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
27870 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
27880 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
27890 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
278a0 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
278b0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
278c0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
278d0 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
278e0 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
278f0 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
27900 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
27910 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
27920 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
27930 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
27940 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
27950 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
27960 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
27970 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  TName = 0;      
27980 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
27990 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
279a0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
279b0 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
279c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
279d0 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
279e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
279f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27a00 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
27a10 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
27a20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
27a30 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
27a40 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
27a50 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
27a60 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
27a70 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
27a80 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
27a90 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
27aa0 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
27ab0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
27ac0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
27ad0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
27ae0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
27af0 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
27b00 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
27b10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27b20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b  zSchemaName = 0;
27b30 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
27b40 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  Db;.          if
27b50 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b  ( zTabName==0 ){
27b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
27b70 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
27b80 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
27b90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
27ba0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
27bb0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
27bc0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
27bd0 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  | (pSub->selFlag
27be0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
27bf0 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
27c00 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20       pSub = 0;. 
27c10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
27c20 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
27c30 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
27c40 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
27c60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
27c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27c80 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
27c90 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
27ca0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
27cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63  .            zSc
27cc0 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d  hemaName = iDb>=
27cd0 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 ? db->aDb[iDb]
27ce0 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b  .zDbSName : "*";
27cf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27d00 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
27d10 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
27d20 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
27d30 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
27d40 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
27d50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
27d60 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
27d70 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
27d80 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
27d90 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
27da0 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
27db0 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
27dc0 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
27dd0 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
27de0 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
27df0 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
27e00 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
27e10 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
27e20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27e30 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
27e40 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
27e50 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20   && pSub.       
27e60 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
27e70 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53  MatchSpanName(pS
27e80 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
27e90 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d  .zSpan, 0, zTNam
27ea0 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  e, 0)==0.       
27eb0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27ec0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
27ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
27ef0 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
27f00 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c  ked as 'hidden',
27f10 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68   omit it from th
27f20 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
27f30 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
27f40 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73  -set list unless
27f50 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
27f60 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  the SF_IncludeHi
27f70 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  dden.           
27f80 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20   ** bit set..   
27f90 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
27fa0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e          if( (p->
27fb0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e  selFlags & SF_In
27fc0 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a  cludeHidden)==0.
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
27fe0 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
27ff0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a  pTab->aCol[j]) .
28000 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
28010 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
28020 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
28030 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
28040 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
28050 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28060 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
28070 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
28080 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66     if( (pFrom->f
28090 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
280a0 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
280b0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
280c0 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
280d0 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
280e0 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
280f0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28110 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
28120 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
28130 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
28140 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
28150 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
28160 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
28170 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
28180 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
28190 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
281a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
281b0 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
281c0 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
281d0 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
281e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
281f0 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
28200 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
28210 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
28220 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
28230 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
28240 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
28250 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
28260 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
28270 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
28280 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
28290 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
282a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
282b0 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
282c0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
282d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
282e0 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
282f0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
28300 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
28310 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
28320 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
28330 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
28340 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
28350 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
28360 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
28370 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
28380 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
28390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
283a0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
283b0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
283c0 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
283d0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
283e0 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d    if( zSchemaNam
283f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
28400 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
28410 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
28420 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29  ID, zSchemaName)
28430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28440 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
28450 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
28460 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45  K_DOT, pLeft, pE
28470 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
28480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28490 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
284a0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
284b0 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
284c0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
284d0 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
284e0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
284f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
28500 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
28510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28520 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
28530 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28540 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
28550 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
28560 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
28570 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
28580 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
28590 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
285a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
285b0 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43  te3TokenInit(&sC
285c0 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  olname, zColname
285d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
285e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
285f0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
28600 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
28610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
28620 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73  f( pNew && (p->s
28630 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
28640 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20  tedFrom)!=0 ){. 
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
28660 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
28670 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61  m *pX = &pNew->a
28680 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b  [pNew->nExpr-1];
28690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
286a0 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20  f( pSub ){.     
286b0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
286c0 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
286d0 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  StrDup(db, pSub-
286e0 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
286f0 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
28700 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28710 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
28720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
28730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28740 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
28750 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
28760 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a  db, "%s.%s.%s",.
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
287a0 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  maName, zTabName
287b0 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
287d0 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
287e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
287f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28800 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73       pX->bSpanIs
28810 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Tab = 1;.       
28820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28830 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
28840 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
28850 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28860 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
28870 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
28880 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
28890 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
288a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
288b0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
288c0 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
288d0 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
288e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
288f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
28900 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
28910 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
28920 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
28930 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28940 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
28950 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
28960 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
28970 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
28980 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
28990 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
289a0 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
289b0 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
289c0 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
289d0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
289e0 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
289f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28a00 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
28a10 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
28a20 73 65 74 22 29 3b 0a 20 20 20 20 72 65 74 75 72  set");.    retur
28a30 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
28a40 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
28a50 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28a60 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
28a70 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
28a80 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
28a90 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
28aa0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
28ab0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
28ac0 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
28ad0 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
28ae0 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
28af0 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
28b00 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
28b10 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
28b20 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
28b30 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
28b40 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
28b50 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
28b60 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
28b70 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
28b80 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
28b90 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
28ba0 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
28bb0 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
28bc0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
28bd0 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61  3ExprWalkNoop(Wa
28be0 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
28bf0 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
28c00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28c10 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
28c20 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
28c30 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28c40 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
28c50 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
28c60 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20  rse-tree walker 
28c70 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
28c80 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65  ments..** subque
28c90 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
28ca0 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   tree..*/.int sq
28cb0 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e  lite3SelectWalkN
28cc0 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
28cd0 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  sed, Select *Not
28ce0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
28cf0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
28d00 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
28d10 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28d20 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51  tinue;.}..#if SQ
28d30 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
28d40 20 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20   Always assert. 
28d50 20 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c   This xSelectCal
28d60 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74  lback2 implement
28d70 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61  ation proves tha
28d80 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74  t the.** xSelect
28d90 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76  Callback2 is nev
28da0 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76  er invoked..*/.v
28db0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
28dc0 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c  tWalkAssert2(Wal
28dd0 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65  ker *NotUsed, Se
28de0 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b  lect *NotUsed2){
28df0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28e00 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
28e10 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72  tUsed2);.  asser
28e20 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  t( 0 );.}.#endif
28e30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
28e40 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
28e50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28e60 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
28e70 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
28e80 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
28e90 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
28ea0 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
28eb0 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
28ec0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
28ed0 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
28ee0 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
28ef0 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
28f00 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
28f10 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
28f20 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
28f30 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
28f40 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
28f50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28f60 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
28f70 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
28f80 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
28f90 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
28fa0 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
28fb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
28fc0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
28fd0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
28fe0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
28ff0 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
29000 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
29010 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
29020 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
29030 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
29040 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
29050 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
29060 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
29070 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
29080 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
29090 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
290a0 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
290b0 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
290c0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
290d0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
290e0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
290f0 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rse;.  if( pPars
29100 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29  e->hasCompound )
29110 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
29120 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72  allback = conver
29130 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
29140 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77  oSubquery;.    w
29150 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
29160 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  2 = 0;.    sqlit
29170 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
29180 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20   pSelect);.  }. 
29190 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
291a0 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
291b0 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  der;.  w.xSelect
291c0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
291d0 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c  ctPopWith;.  sql
291e0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
291f0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
29200 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29210 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
29220 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
29230 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
29240 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
29250 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
29260 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
29270 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
29280 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
29290 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
292a0 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
292b0 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
292c0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
292d0 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
292e0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
292f0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
29300 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
29310 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
29320 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
29330 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
29340 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
29350 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
29360 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
29370 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
29380 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
29390 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
293a0 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
293b0 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
293c0 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
293d0 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
293e0 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
293f0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
29400 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
29410 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
29420 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
29430 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
29440 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
29450 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
29460 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
29470 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
29480 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
29490 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
294a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
294b0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
294c0 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
294d0 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
294e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
294f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
29500 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
29510 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
29520 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
29530 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
29540 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
29550 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
29560 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Src;.  for(i=0, 
29570 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
29580 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
29590 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
295a0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
295b0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
295c0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
295d0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
295e0 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
295f0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
29600 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
29610 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
29620 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
29630 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
29640 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
29650 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
29660 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ct;.      if( pS
29670 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  el ){.        wh
29680 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
29690 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
296a0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
296b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
296c0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
296d0 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
296e0 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
296f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
29700 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
29710 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
29720 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
29730 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
29740 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
29750 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
29760 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
29770 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
29780 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
29790 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
297a0 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
297b0 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
297c0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
297d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
297e0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
297f0 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
29800 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
29810 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
29820 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
29830 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
29840 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
29850 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
29860 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  lectWalkNoop;.  
29870 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
29880 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
29890 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
298a0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
298b0 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
298c0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
298d0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
298e0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
298f0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
29900 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
29910 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
29920 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
29930 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
29940 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
29950 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
29960 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
29970 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
29980 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
29990 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
299a0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
299b0 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
299c0 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
299d0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
299e0 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
299f0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
29a00 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
29a10 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
29a20 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
29a30 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
29a40 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
29a50 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
29a60 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
29a70 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
29a80 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
29a90 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
29aa0 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
29ab0 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
29ac0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29ad0 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
29ae0 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
29af0 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
29b00 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
29b10 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
29b20 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
29b30 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
29b40 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
29b50 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
29b60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
29b70 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
29b80 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
29b90 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
29ba0 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
29bb0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
29bc0 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
29bd0 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
29be0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
29bf0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
29c00 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
29c10 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
29c20 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65  ectExpand(pParse
29c30 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , p);.  if( pPar
29c40 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
29c50 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
29c60 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
29c70 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
29c80 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73  electNames(pPars
29c90 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b  e, p, pOuterNC);
29ca0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
29cb0 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
29cc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29cd0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
29ce0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
29cf0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b  Info(pParse, p);
29d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
29d10 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
29d20 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
29d30 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
29d40 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
29d50 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
29d60 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
29d70 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
29d80 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
29d90 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
29da0 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
29db0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
29dc0 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65   code that store
29dd0 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
29de0 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a  f those memory.*
29df0 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * cells..*/.stat
29e00 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
29e10 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
29e20 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
29e30 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
29e40 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
29e50 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
29e60 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
29e70 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
29e80 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49  int nReg = pAggI
29e90 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67  nfo->nFunc + pAg
29ea0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  gInfo->nColumn;.
29eb0 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20    if( nReg==0 ) 
29ec0 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53  return;.#ifdef S
29ed0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
29ee0 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c   Verify that all
29ef0 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65   AggInfo registe
29f00 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68  rs are within th
29f10 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65  e range specifie
29f20 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66  d by.  ** AggInf
29f30 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f  o.mnReg..AggInfo
29f40 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65  .mxReg */.  asse
29f50 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e  rt( nReg==pAggIn
29f60 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e  fo->mxReg-pAggIn
29f70 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20  fo->mnReg+1 );. 
29f80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
29f90 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
29fa0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
29fb0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
29fc0 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
29fd0 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
29fe0 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
29ff0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  Col[i].iMem<=pAg
2a000 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
2a010 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2a020 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2a030 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2a040 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  rt( pAggInfo->aF
2a050 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  unc[i].iMem>=pAg
2a060 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
2a070 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
2a080 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
2a090 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
2a0a0 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  g );.  }.#endif.
2a0b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a0c0 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
2a0d0 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  0, pAggInfo->mnR
2a0e0 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg, pAggInfo->mx
2a0f0 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e  Reg);.  for(pFun
2a100 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
2a110 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
2a120 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2a130 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66  pFunc++){.    if
2a140 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
2a150 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
2a160 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
2a170 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
2a180 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2a190 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49  operty(pE, EP_xI
2a1a0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2a1b0 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73    if( pE->x.pLis
2a1c0 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c  t==0 || pE->x.pL
2a1d0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  ist->nExpr!=1 ){
2a1e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a1f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2a200 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65   "DISTINCT aggre
2a210 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20  gates must have 
2a220 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20  exactly one ".  
2a230 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65           "argume
2a240 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  nt");.        pF
2a250 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
2a260 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
2a270 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
2a280 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
2a290 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2a2a0 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
2a2b0 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pList, 0, 0);.  
2a2c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a2d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2a2e0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
2a2f0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
2a300 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a320 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
2a330 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2a340 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2a350 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
2a360 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
2a370 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
2a380 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
2a390 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
2a3a0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
2a3b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2a3c0 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
2a3d0 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
2a3e0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2a3f0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2a400 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2a410 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2a420 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2a430 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
2a440 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2a450 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2a460 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2a470 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
2a480 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
2a490 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
2a4a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
2a4b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
2a4c0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
2a4d0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71  elect) );.    sq
2a4e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2a4f0 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
2a500 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20  pF->iMem, pList 
2a510 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
2a520 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2a530 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
2a540 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
2a550 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NCDEF);.  }.}../
2a560 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
2a570 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
2a580 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
2a590 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
2a5a0 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
2a5b0 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2a5c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2a5d0 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
2a5e0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
2a5f0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
2a600 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2a610 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2a620 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
2a630 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69   regHit = 0;.  i
2a640 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d  nt addrHitTest =
2a650 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   0;.  struct Agg
2a660 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
2a670 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2a680 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
2a690 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
2a6a0 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
2a6b0 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
2a6c0 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
2a6d0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
2a6e0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
2a6f0 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
2a700 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
2a710 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
2a720 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
2a730 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
2a740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2a750 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a760 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
2a770 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
2a780 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2a790 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e    nArg = pList->
2a7a0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67  nExpr;.      reg
2a7b0 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Agg = sqlite3Get
2a7c0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2a7d0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73  , nArg);.      s
2a7e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2a7f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2a800 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c  List, regAgg, 0,
2a810 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
2a820 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2a830 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
2a840 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
2a850 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
2a860 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
2a870 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
2a880 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2a890 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2a8a0 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
2a8b0 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72  ==0 );  /* Error
2a8c0 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20   condition */.  
2a8d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
2a8e0 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73  rg>1 );   /* Als
2a8f0 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  o an error */.  
2a900 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
2a910 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69  (pParse, pF->iDi
2a920 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74  stinct, addrNext
2a930 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20  , 1, regAgg);.  
2a940 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
2a950 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
2a960 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
2a970 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
2a980 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
2a990 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
2a9a0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2a9b0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
2a9c0 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
2a9d0 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
2a9e0 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
2a9f0 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
2aa00 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
2aa10 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
2aa20 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
2aa30 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
2aa40 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2aa50 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2aa60 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2aa70 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
2aa80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2aa90 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
2aaa0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
2aab0 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
2aac0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
2aad0 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
2aae0 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
2aaf0 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
2ab00 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
2ab10 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2ab20 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2ab30 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
2ab40 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
2ab50 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
2ab60 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
2ab70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ab80 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op3(v, OP_AggSte
2ab90 70 30 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  p0, 0, regAgg, p
2aba0 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71  F->iMem);.    sq
2abb0 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
2abc0 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20  4(v, pF->pFunc, 
2abd0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
2abe0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2abf0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
2ac00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2ac10 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
2ac20 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
2ac30 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
2ac40 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2ac50 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2ac60 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
2ac70 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
2ac80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ac90 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2aca0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
2acb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2acc0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2acd0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
2ace0 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
2acf0 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
2ad00 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
2ad10 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
2ad20 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
2ad30 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
2ad40 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
2ad50 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
2ad60 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
2ad70 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
2ad80 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
2ad90 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
2ada0 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
2adb0 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
2adc0 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
2add0 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
2ade0 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
2adf0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
2ae00 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
2ae10 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
2ae20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
2ae30 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
2ae40 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
2ae50 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
2ae60 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
2ae70 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
2ae80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
2ae90 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
2aea0 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
2aeb0 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
2aec0 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
2aed0 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
2aee0 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
2aef0 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
2af00 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
2af10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2af20 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
2af30 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  gHit); VdbeCover
2af40 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
2af50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2af60 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
2af70 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
2af80 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
2af90 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2afa0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
2afb0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2afc0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
2afd0 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
2afe0 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
2aff0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
2b000 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
2b010 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2b020 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69  e);.  if( addrHi
2b030 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c  tTest ){.    sql
2b040 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2b050 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29  (v, addrHitTest)
2b060 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2b070 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45  dd a single OP_E
2b080 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
2b090 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74  on to the VDBE t
2b0a0 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70  o explain a simp
2b0b0 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71  le.** count(*) q
2b0c0 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f  uery ("SELECT co
2b0d0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62  unt(*) FROM pTab
2b0e0 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ")..*/.#ifndef S
2b0f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
2b100 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  IN.static void e
2b110 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2b120 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
2b130 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2b140 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
2b150 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
2b160 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
2b170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
2b180 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
2b190 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
2b1a0 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
2b1b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2b1c0 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
2b1d0 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a   scan, or NULL *
2b1e0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
2b1f0 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
2b200 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20  .    int bCover 
2b210 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48  = (pIdx!=0 && (H
2b220 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
2b230 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
2b240 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20  dex(pIdx)));.   
2b250 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71   char *zEqp = sq
2b260 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
2b270 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54  rse->db, "SCAN T
2b280 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20  ABLE %s%s%s",.  
2b290 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
2b2a0 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  e,.        bCove
2b2b0 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45  r ? " USING COVE
2b2c0 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22  RING INDEX " : "
2b2d0 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  ",.        bCove
2b2e0 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  r ? pIdx->zName 
2b2f0 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  : "".    );.    
2b300 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b310 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  4(.        pPars
2b320 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70  e->pVdbe, OP_Exp
2b330 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
2b340 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
2b350 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  Eqp, P4_DYNAMIC.
2b360 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
2b370 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
2b380 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
2b390 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
2b3a0 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
2b3b0 63 74 20 66 6f 72 20 68 61 76 69 6e 67 54 6f 57  ct for havingToW
2b3c0 68 65 72 65 45 78 70 72 43 62 28 29 2e 0a 2a 2f  hereExprCb()..*/
2b3d0 0a 73 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f  .struct HavingTo
2b3e0 57 68 65 72 65 43 74 78 20 7b 0a 20 20 45 78 70  WhereCtx {.  Exp
2b3f0 72 20 2a 2a 70 70 57 68 65 72 65 3b 0a 20 20 45  r **ppWhere;.  E
2b400 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
2b410 79 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  y;.};../*.** sql
2b420 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63  ite3WalkExpr() c
2b430 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
2b440 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e  havingToWhere().
2b450 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
2b460 64 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  de passed to the
2b470 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54   callback is a T
2b480 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75  K_AND node, retu
2b490 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69  rn .** WRC_Conti
2b4a0 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69  nue to tell sqli
2b4b0 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f  te3WalkExpr() to
2b4c0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2b4d0 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a   child nodes..**
2b4e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
2b4f0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e  eturn WRC_Prune.
2b500 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
2b510 6c 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65  lso check if the
2b520 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73   .** sub-express
2b530 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20  ion matches the 
2b540 63 72 69 74 65 72 69 61 20 66 6f 72 20 62 65 69  criteria for bei
2b550 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  ng moved to the 
2b560 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e  WHERE.** clause.
2b570 20 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74   If so, add it t
2b580 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2b590 73 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74  se and replace t
2b5a0 68 65 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f  he sub-expressio
2b5b0 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  n.** within the 
2b5c0 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f  HAVING expressio
2b5d0 6e 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e  n with a constan
2b5e0 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  t "1"..*/.static
2b5f0 20 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65   int havingToWhe
2b600 72 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20  reExprCb(Walker 
2b610 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2b620 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
2b630 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20  xpr->op!=TK_AND 
2b640 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 48 61  ){.    struct Ha
2b650 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20 2a  vingToWhereCtx *
2b660 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
2b670 48 61 76 69 6e 67 43 74 78 3b 0a 20 20 20 20 69  HavingCtx;.    i
2b680 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
2b690 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
2b6a0 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  y(pWalker->pPars
2b6b0 65 2c 20 70 45 78 70 72 2c 20 70 2d 3e 70 47 72  e, pExpr, p->pGr
2b6c0 6f 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20 20  oupBy) ){.      
2b6d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2b6e0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64  alker->pParse->d
2b6f0 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
2b700 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
2b710 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e  rAlloc(db, TK_IN
2b720 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49  TEGER, &sqlite3I
2b730 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
2b740 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
2b750 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
2b760 2a 70 57 68 65 72 65 20 3d 20 2a 28 70 2d 3e 70  *pWhere = *(p->p
2b770 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
2b780 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65   SWAP(Expr, *pNe
2b790 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20  w, *pExpr);.    
2b7a0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
2b7b0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57  e3ExprAnd(db, pW
2b7c0 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20  here, pNew);.   
2b7d0 20 20 20 20 20 2a 28 70 2d 3e 70 70 57 68 65 72       *(p->ppWher
2b7e0 65 29 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  e) = pNew;.     
2b7f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
2b800 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2b810 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2b820 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2b830 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c 69 67  ** Transfer elig
2b840 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ible terms from 
2b850 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
2b860 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20 77 68  e of a query, wh
2b870 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73  ich is.** proces
2b880 73 65 64 20 61 66 74 65 72 20 67 72 6f 75 70 69  sed after groupi
2b890 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45 52 45  ng, to the WHERE
2b8a0 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68 20 69   clause, which i
2b8b0 73 20 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f  s processed befo
2b8c0 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20  re.** grouping. 
2b8d0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
2b8e0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
2b8f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74  SELECT * FROM <t
2b900 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f  ables> WHERE a=?
2b910 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
2b920 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a  NG b=? AND c=?.*
2b930 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72  *.** can be rewr
2b940 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
2b950 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2b960 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61  <tables> WHERE a
2b970 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50  =? AND b=? GROUP
2b980 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 3d 3f   BY b HAVING c=?
2b990 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66  .**.** A term of
2b9a0 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72   the HAVING expr
2b9b0 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67 69 62  ession is eligib
2b9c0 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65 72 20  le for transfer 
2b9d0 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a  if it consists.*
2b9e0 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f  * entirely of co
2b9f0 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78 70 72  nstants and expr
2ba00 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
2ba10 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59 20 74   also GROUP BY t
2ba20 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73 65  erms that.** use
2ba30 20 74 68 65 20 22 42 49 4e 41 52 59 22 20 63 6f   the "BINARY" co
2ba40 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
2ba50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ba60 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 0a   havingToWhere(.
2ba70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2ba80 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
2ba90 6f 75 70 42 79 2c 0a 20 20 45 78 70 72 20 2a 70  oupBy,.  Expr *p
2baa0 48 61 76 69 6e 67 2c 20 0a 20 20 45 78 70 72 20  Having, .  Expr 
2bab0 2a 2a 70 70 57 68 65 72 65 0a 29 7b 0a 20 20 73  **ppWhere.){.  s
2bac0 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68  truct HavingToWh
2bad0 65 72 65 43 74 78 20 73 43 74 78 3b 0a 20 20 57  ereCtx sCtx;.  W
2bae0 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 0a  alker sWalker;..
2baf0 20 20 73 43 74 78 2e 70 70 57 68 65 72 65 20 3d    sCtx.ppWhere =
2bb00 20 70 70 57 68 65 72 65 3b 0a 20 20 73 43 74 78   ppWhere;.  sCtx
2bb10 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2bb20 75 70 42 79 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  upBy;..  memset(
2bb30 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
2bb40 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20  eof(sWalker));. 
2bb50 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
2bb60 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
2bb70 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2bb80 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72  k = havingToWher
2bb90 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
2bba0 65 72 2e 75 2e 70 48 61 76 69 6e 67 43 74 78 20  er.u.pHavingCtx 
2bbb0 3d 20 26 73 43 74 78 3b 0a 20 20 73 71 6c 69 74  = &sCtx;.  sqlit
2bbc0 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
2bbd0 6b 65 72 2c 20 70 48 61 76 69 6e 67 29 3b 0a 7d  ker, pHaving);.}
2bbe0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
2bbf0 20 73 65 65 20 69 66 20 74 68 65 20 70 54 68 69   see if the pThi
2bc00 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c  s entry of pTabL
2bc10 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f  ist is a self-jo
2bc20 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69  in of a prior vi
2bc30 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c  ew..** If it is,
2bc40 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
2bc50 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f   SrcList_item fo
2bc60 72 20 74 68 65 20 70 72 69 6f 72 20 76 69 65 77  r the prior view
2bc70 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
2bc80 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
2bc90 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  0..*/.static str
2bca0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2bcb0 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77   *isSelfJoinView
2bcc0 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
2bcd0 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  bList,          
2bce0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73   /* Search for s
2bcf0 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69  elf-joins in thi
2bd00 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  s FROM clause */
2bd10 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2bd20 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20  t_item *pThis   
2bd30 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 72  /* Search for pr
2bd40 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ior reference to
2bd50 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20 2a   this subquery *
2bd60 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
2bd70 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2bd80 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d  m;.  for(pItem =
2bd90 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49   pTabList->a; pI
2bda0 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d  tem<pThis; pItem
2bdb0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  ++){.    if( pIt
2bdc0 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  em->pSelect==0 )
2bdd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2bde0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
2bdf0 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74  Coroutine ) cont
2be00 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
2be10 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20  tem->zName==0 ) 
2be20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2be30 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2be40 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  p(pItem->zDataba
2be50 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74 61  se, pThis->zData
2be60 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  base)!=0 ) conti
2be70 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
2be80 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74  ite3_stricmp(pIt
2be90 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73  em->zName, pThis
2bea0 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f  ->zName)!=0 ) co
2beb0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2bec0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2bed0 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20  re(0, .         
2bee0 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d   pThis->pSelect-
2bef0 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
2bf00 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c  pSelect->pWhere,
2bf10 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20   -1) .    ){.   
2bf20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20 77     /* The view w
2bf30 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 73  as modified by s
2bf40 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ome other optimi
2bf50 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a 20  zation such as. 
2bf60 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e       ** pushDown
2bf70 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a  WhereTerms() */.
2bf80 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2bf90 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2bfa0 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65   pItem;.  }.  re
2bfb0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
2bfc0 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  f SQLITE_COUNTOF
2bfd0 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
2bfe0 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  N./*.** Attempt 
2bff0 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71  to transform a q
2c000 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
2c010 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2c020 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28   count(*) FROM (
2c030 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
2c040 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
2c050 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a  T y FROM t2).**.
2c060 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a  ** Into this:.**
2c070 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53  .**    SELECT (S
2c080 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2c090 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20  ROM t1)+(SELECT 
2c0a0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
2c0b0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ).**.** The tran
2c0c0 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20  sformation only 
2c0d0 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20  works if all of 
2c0e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
2c0f0 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
2c100 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  *  The subquery 
2c110 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  is a UNION ALL o
2c120 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65  f two or more te
2c130 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72  rms.**   *  Ther
2c140 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72  e is no WHERE or
2c150 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
2c160 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e 20 74  ING clauses on t
2c170 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  he subqueries.**
2c180 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65 72 20     *  The outer 
2c190 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
2c1a0 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a  e count(*).**.**
2c1b0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2c1c0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2c1d0 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a   is undertaken..
2c1e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2c1f0 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a  untOfViewOptimiz
2c200 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
2c210 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
2c220 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c  .  Select *pSub,
2c230 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72   *pPrior;.  Expr
2c240 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20   *pExpr;.  Expr 
2c250 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74  *pCount;.  sqlit
2c260 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70  e3 *db;.  if( (p
2c270 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c280 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20  Aggregate)==0 ) 
2c290 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54  return 0;   /* T
2c2a0 68 69 73 20 69 73 20 61 6e 20 61 67 67 72 65 67  his is an aggreg
2c2b0 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ate */.  if( p->
2c2c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
2c2d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2c2f0 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
2c300 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20  mn */.  pExpr = 
2c310 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
2c320 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
2c330 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
2c340 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
2c350 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65   0;        /* Re
2c360 73 75 6c 74 20 69 73 20 61 6e 20 61 67 67 72 65  sult is an aggre
2c370 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 73 71  gate */.  if( sq
2c380 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 45  lite3_stricmp(pE
2c390 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63  xpr->u.zToken,"c
2c3a0 6f 75 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20  ount") ) return 
2c3b0 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74 28  0;  /* Is count(
2c3c0 29 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  ) */.  if( pExpr
2c3d0 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72  ->x.pList!=0 ) r
2c3e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2c3f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
2c400 20 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a   be count(*) */.
2c410 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e    if( p->pSrc->n
2c420 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
2c430 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c440 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65      /* One table
2c450 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70   in FROM  */.  p
2c460 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
2c470 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  [0].pSelect;.  i
2c480 66 28 20 70 53 75 62 3d 3d 30 20 29 20 72 65 74  f( pSub==0 ) ret
2c490 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4b0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69 73 20   /* The FROM is 
2c4c0 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
2c4d0 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
2c4e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c500 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 63    /* Must be a c
2c510 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20 20  ompound ry */.  
2c520 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62  do{.    if( pSub
2c530 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20  ->op!=TK_ALL && 
2c540 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72  pSub->pPrior ) r
2c550 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73  eturn 0;  /* Mus
2c560 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a  t be UNION ALL *
2c570 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
2c580 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
2c590 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c5a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48          /* No WH
2c5b0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2c5c0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
2c5d0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2c5e0 61 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ate ) return 0; 
2c5f0 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67      /* Not an ag
2c600 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70  gregate */.    p
2c610 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  Sub = pSub->pPri
2c620 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c640 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20   /* Repeat over 
2c650 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77  compound */.  }w
2c660 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20  hile( pSub );.. 
2c670 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
2c680 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20  this point then 
2c690 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66  it is OK to perf
2c6a0 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72  orm the transfor
2c6b0 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20  mation */..  db 
2c6c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2c6d0 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a  pCount = pExpr;.
2c6e0 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70    pExpr = 0;.  p
2c6f0 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
2c700 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70  [0].pSelect;.  p
2c710 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2c720 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  lect = 0;.  sqli
2c730 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
2c740 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
2c750 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74   p->pSrc = sqlit
2c760 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
2c770 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
2c780 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20  f(*p->pSrc));.  
2c790 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20  while( pSub ){. 
2c7a0 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a     Expr *pTerm;.
2c7b0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75      pPrior = pSu
2c7c0 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  b->pPrior;.    p
2c7d0 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b  Sub->pPrior = 0;
2c7e0 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74  .    pSub->pNext
2c7f0 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e   = 0;.    pSub->
2c800 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
2c810 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53  ggregate;.    pS
2c820 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20  ub->selFlags &= 
2c830 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
2c840 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52    pSub->nSelectR
2c850 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ow = 0;.    sqli
2c860 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2c870 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  e(db, pSub->pELi
2c880 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  st);.    pTerm =
2c890 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65   pPrior ? sqlite
2c8a0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f  3ExprDup(db, pCo
2c8b0 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74  unt, 0) : pCount
2c8c0 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69  ;.    pSub->pELi
2c8d0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
2c8e0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
2c8f0 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20  e, 0, pTerm);.  
2c900 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
2c910 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2c920 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b  K_SELECT, 0, 0);
2c930 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70  .    sqlite3PExp
2c940 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73  rAddSelect(pPars
2c950 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b  e, pTerm, pSub);
2c960 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d  .    if( pExpr==
2c970 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
2c980 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65   = pTerm;.    }e
2c990 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72  lse{.      pExpr
2c9a0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2c9b0 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c  pParse, TK_PLUS,
2c9c0 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a   pTerm, pExpr);.
2c9d0 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d      }.    pSub =
2c9e0 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70   pPrior;.  }.  p
2c9f0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
2ca00 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2ca10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
2ca20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23  SF_Aggregate;..#
2ca30 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2ca40 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2ca50 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2ca60 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
2ca70 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
2ca80 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
2ca90 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20  r count-of-view 
2caa0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22  optimization:\n"
2cab0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2cac0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2cad0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2cae0 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  if.  return 1;.}
2caf0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2cb00 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
2cb10 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  TIMIZATION */../
2cb20 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2cb30 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
2cb40 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
2cb50 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
2cb60 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
2cb70 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74   results are ret
2cb80 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20  urned according 
2cb90 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  to the SelectDes
2cba0 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  t structure..** 
2cbb0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  See comments in 
2cbc0 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20  sqliteInt.h for 
2cbd0 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74  further informat
2cbe0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
2cbf0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2cc00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2cc10 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
2cc20 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
2cc30 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
2cc40 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
2cc50 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
2cc60 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
2cc70 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
2cc80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2cc90 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
2cca0 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
2ccb0 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
2ccc0 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
2ccd0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
2cce0 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
2ccf0 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
2cd00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2cd10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2cd20 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2cd30 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
2cd40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
2cd50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
2cd60 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
2cd70 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
2cd80 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
2cd90 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
2cda0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
2cdb0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2cdd0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2cde0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2cdf0 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
2ce00 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
2ce10 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
2ce20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
2ce30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
2ce40 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
2ce50 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2ce60 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
2ce70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2ce80 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
2ce90 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
2cea0 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
2ceb0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30  List *pEList = 0
2cec0 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f  ;  /* List of co
2ced0 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
2cee0 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
2cef0 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
2cf00 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2cf10 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
2cf20 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
2cf30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
2cf40 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
2cf50 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
2cf60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
2cf70 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
2cf80 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
2cf90 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
2cfa0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
2cfb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2cfc0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
2cfd0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
2cfe0 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
2cff0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
2d000 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
2d010 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
2d020 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
2d030 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e  sDistinct; /* In
2d040 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
2d050 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  e the DISTINCT k
2d060 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74  eyword */.  Sort
2d070 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20  Ctx sSort;      
2d080 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f     /* Info on ho
2d090 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52  w to code the OR
2d0a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2d0b0 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
2d0c0 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
2d0d0 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
2d0e0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
2d0f0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
2d100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d110 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
2d120 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
2d130 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
2d140 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
2d150 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
2d160 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  nnection */..#if
2d170 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d180 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
2d190 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20  RestoreSelectId 
2d1a0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
2d1b0 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  tId;.  pParse->i
2d1c0 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
2d1d0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
2d1e0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  ++;.#endif..  db
2d1f0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2d200 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
2d210 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2d220 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
2d230 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2d240 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2d250 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
2d260 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
2d270 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
2d280 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
2d290 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
2d2a0 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
2d2b0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2d2c0 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65  ENABLED.  pParse
2d2d0 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b  ->nSelectIndent+
2d2e0 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  +;.  SELECTTRACE
2d2f0 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62  (1,pParse,p, ("b
2d300 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a  egin processing:
2d310 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73 71 6c  \n"));.  if( sql
2d320 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2d330 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73  & 0x100 ){.    s
2d340 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2d350 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2d360 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
2d370 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2d380 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2d390 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66  est!=SRT_DistFif
2d3a0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
2d3b0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2d3c0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2d3d0 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  RT_Fifo );.  ass
2d3e0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2d3f0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2d400 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65  est!=SRT_DistQue
2d410 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ue );.  assert( 
2d420 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
2d430 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
2d440 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69  SRT_Queue );.  i
2d450 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
2d460 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
2d470 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
2d480 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
2d490 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
2d4a0 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
2d4b0 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
2d4c0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
2d4d0 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
2d4e0 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
2d4f0 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  d ||.           
2d500 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2d510 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73  T_Queue  || pDes
2d520 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
2d530 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20  stFifo ||.      
2d540 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2d550 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
2d560 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d570 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20  ==SRT_Fifo);.   
2d580 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20   /* If ORDER BY 
2d590 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
2d5a0 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75  nce in the outpu
2d5b0 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64  t then neither d
2d5c0 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49  oes.    ** DISTI
2d5d0 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65  NCT so it can be
2d5e0 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f   removed too. */
2d5f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2d600 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2d610 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
2d620 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
2d630 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
2d640 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
2d650 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
2d660 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
2d670 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73  e, p, 0);.  mems
2d680 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69  et(&sSort, 0, si
2d690 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20  zeof(sSort));.  
2d6a0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2d6b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
2d6c0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2d6d0 72 63 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rc;.  if( pParse
2d6e0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
2d6f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2d700 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
2d710 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
2d720 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
2d730 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73  .  isAgg = (p->s
2d740 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2d750 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69 66 20  regate)!=0;.#if 
2d760 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2d770 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
2d780 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2d790 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x100 ){.    SELE
2d7a0 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
2d7b0 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20  arse,p, ("after 
2d7c0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a  name resolution:
2d7d0 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
2d7e0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2d7f0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2d800 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20  endif..  /* Get 
2d810 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20 56 44  a pointer the VD
2d820 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
2d830 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e  ction, allocatin
2d840 67 20 61 20 6e 65 77 20 56 44 42 45 20 69 66 20  g a new VDBE if 
2d850 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  one.  ** does no
2d860 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20  t already exist 
2d870 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
2d880 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
2d890 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
2d8a0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2d8b0 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
2d8c0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
2d8d0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
2d8e0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
2d8f0 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   p);.  }..  /* T
2d900 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ry to flatten su
2d910 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
2d920 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69  FROM clause up i
2d930 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65  nto the main que
2d940 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  ry.  */.#if !def
2d950 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2d960 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
2d970 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2d980 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
2d990 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
2d9a0 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
2d9b0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2d9c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2d9d0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2d9e0 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2d9f0 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2da00 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2da10 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
2da20 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
2da30 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
2da40 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
2da50 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68  * Catch mismatch
2da60 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64   in the declared
2da70 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69   columns of a vi
2da80 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ew and the numbe
2da90 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  r of.    ** colu
2daa0 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  mns in the SELEC
2dab0 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a  T on the RHS */.
2dac0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43      if( pTab->nC
2dad0 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74  ol!=pSub->pEList
2dae0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2daf0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2db00 28 70 50 61 72 73 65 2c 20 22 65 78 70 65 63 74  (pParse, "expect
2db10 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f  ed %d columns fo
2db20 72 20 27 25 73 27 20 62 75 74 20 67 6f 74 20 25  r '%s' but got %
2db30 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
2db40 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
2db50 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  nCol, pTab->zNam
2db60 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  e, pSub->pEList-
2db70 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67  >nExpr);.      g
2db80 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2db90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
2dba0 20 6e 6f 74 20 74 72 79 20 74 6f 20 66 6c 61 74   not try to flat
2dbb0 74 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65  ten an aggregate
2dbc0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
2dbd0 2a 0a 20 20 20 20 2a 2a 20 46 6c 61 74 74 65 6e  *.    ** Flatten
2dbe0 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
2dbf0 20 73 75 62 71 75 65 72 79 20 69 73 20 6f 6e 6c   subquery is onl
2dc00 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68  y possible if th
2dc10 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 20 20  e outer query.  
2dc20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f    ** is not a jo
2dc30 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  in.  But if the 
2dc40 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
2dc50 6f 74 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ot a join, then 
2dc60 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
2dc70 20 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c   ** will be impl
2dc80 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
2dc90 72 6f 75 74 69 6e 65 20 61 6e 64 20 74 68 65 72  routine and ther
2dca0 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61 67  e is no advantag
2dcb0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 66 6c 61 74  e to.    ** flat
2dcc0 74 65 6e 69 6e 67 20 69 6e 20 74 68 61 74 20 63  tening in that c
2dcd0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
2dce0 69 66 28 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  if( (pSub->selFl
2dcf0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2dd00 74 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  te)!=0 ) continu
2dd10 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2dd20 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  Sub->pGroupBy==0
2dd30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   );..    /* If t
2dd40 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74  he subquery cont
2dd50 61 69 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59  ains an ORDER BY
2dd60 20 63 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20   clause and if. 
2dd70 20 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65     ** it will be
2dd80 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
2dd90 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68  a co-routine, th
2dda0 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65  en do not flatte
2ddb0 6e 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  n.  This.    ** 
2ddc0 72 65 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f  restriction allo
2ddd0 77 73 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74  ws SQL construct
2dde0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  s like this:.   
2ddf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45   **.    **  SELE
2de00 43 54 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e  CT expensive_fun
2de10 63 74 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20  ction(x).    ** 
2de20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20     FROM (SELECT 
2de30 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52  x FROM tab ORDER
2de40 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b   BY y LIMIT 10);
2de50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2de60 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e  he expensive_fun
2de70 63 74 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20  ction() is only 
2de80 63 6f 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20  computed on the 
2de90 31 30 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20  10 rows that.   
2dea0 20 2a 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20   ** are output, 
2deb0 72 61 74 68 65 72 20 74 68 61 6e 20 65 76 65 72  rather than ever
2dec0 79 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  y row of the tab
2ded0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
2dee0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
2def0 79 21 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d  y!=0.     && i==
2df00 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c  0.     && (pTabL
2df10 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20  ist->nSrc==1.   
2df20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69        || (pTabLi
2df30 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e  st->a[1].fg.join
2df40 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54  type&(JT_LEFT|JT
2df50 5f 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20  _CROSS))!=0).   
2df60 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
2df70 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ue;.    }..    i
2df80 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
2df90 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
2dfa0 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
2dfb0 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
2dfc0 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
2dfd0 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
2dfe0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20  t. */.      i = 
2dff0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  -1;.    }.    pT
2e000 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2e010 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
2e020 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2e030 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2e040 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
2e050 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
2e060 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  {.      sSort.pO
2e070 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2e080 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erBy;.    }.  }.
2e090 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
2e0a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
2e0b0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
2e0c0 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64   Handle compound
2e0d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2e0e0 74 73 20 75 73 69 6e 67 20 74 68 65 20 73 65 70  ts using the sep
2e0f0 61 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63  arate multiSelec
2e100 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75  t().  ** procedu
2e110 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  re..  */.  if( p
2e120 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
2e130 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
2e140 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
2e150 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53  t);.    explainS
2e160 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
2e170 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
2e180 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
2e190 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2e1a0 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45  ENABLED.    SELE
2e1b0 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
2e1c0 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e  ,p,("end compoun
2e1d0 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  d-select process
2e1e0 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50  ing\n"));.    pP
2e1f0 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
2e200 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20  ent--;.#endif.  
2e210 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2e220 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f  .#endif..  /* Fo
2e230 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74  r each term in t
2e240 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20  he FROM clause, 
2e250 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20  do two things:. 
2e260 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a   ** (1) Authoriz
2e270 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ed unreferenced 
2e280 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20  tables.  ** (2) 
2e290 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2e2a0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
2e2b0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  s.  */.  for(i=0
2e2c0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
2e2d0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2e2e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2e2f0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2e300 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2e310 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
2e320 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
2e330 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  b;.#if !defined(
2e340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2e350 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
2e360 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2e370 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  EW).    const ch
2e380 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
2e390 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20  ntext;.#endif.. 
2e3a0 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49     /* Issue SQLI
2e3b0 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
2e3c0 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61  ations with a fa
2e3d0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66  ke column name f
2e3e0 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61  or any.    ** ta
2e3f0 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65  bles that are re
2e400 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f  ferenced but fro
2e410 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65  m which no value
2e420 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e  s are extracted.
2e430 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73  .    ** Examples
2e440 20 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20   of where these 
2e450 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51  kinds of null SQ
2e460 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
2e470 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  izations.    ** 
2e480 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20  would occur:.   
2e490 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
2e4a0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2e4b0 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c  ROM t1;   -- SQL
2e4c0 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20  ITE_READ t1."". 
2e4d0 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
2e4e0 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74   t1.* FROM t1, t
2e4f0 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  2;   -- SQLITE_R
2e500 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a  EAD t2."".    **
2e510 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65  .    ** The fake
2e520 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
2e530 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
2e540 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
2e550 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a   for a table to.
2e560 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f      ** have a co
2e570 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68  lumn named by th
2e580 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  e empty string, 
2e590 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
2e5a0 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
2e5b0 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75  .    ** distingu
2e5c0 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75  ish between an u
2e5d0 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
2e5e0 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20  e and an actual 
2e5f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2e600 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d  .    ** "" colum
2e610 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  n. The original 
2e620 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74  design was for t
2e630 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
2e640 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c  ame to be a NULL
2e650 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
2e660 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75  ould be unambigu
2e670 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79  ous.  But legacy
2e680 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
2e690 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20  allbacks might. 
2e6a0 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65     ** assume the
2e6b0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
2e6c0 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67  non-NULL and seg
2e6d0 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20  fault.  The use 
2e6e0 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20  of an empty.    
2e6f0 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ** string for th
2e700 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
2e710 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a  me seems safer..
2e720 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2e730 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30  Item->colUsed==0
2e740 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e750 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2e760 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20  e, SQLITE_READ, 
2e770 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22  pItem->zName, ""
2e780 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
2e790 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
2e7a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2e7b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2e7c0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2e7d0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
2e7e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2e7f0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
2e800 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
2e810 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a  M clause.    */.
2e820 20 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d      pSub = pItem
2e830 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
2e840 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
2e850 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
2e860 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
2e870 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
2e880 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
2e890 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
2e8a0 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
2e8b0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
2e8c0 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
2e8d0 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
2e8e0 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
2e8f0 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
2e900 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
2e910 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
2e920 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
2e930 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
2e940 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
2e950 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
2e960 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
2e970 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
2e980 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
2e990 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
2e9a0 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
2e9b0 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
2e9c0 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
2e9d0 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
2e9e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
2e9f0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
2ea00 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2ea10 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
2ea20 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2ea30 2f 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e  /* The subroutin
2ea40 65 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73  e that manifests
2ea50 20 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20   the view might 
2ea60 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f  be a one-time ro
2ea70 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a  utine,.        *
2ea80 2a 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65  * or it might ne
2ea90 65 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f  ed to be rerun o
2eaa0 6e 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e  n each iteration
2eab0 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20   because it.    
2eac0 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61      ** encodes a
2ead0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
2eae0 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uery. */.       
2eaf0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
2eb00 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
2eb10 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2eb20 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  b)->opcode==OP_O
2eb30 6e 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  nce );.        s
2eb40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2eb50 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
2eb60 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2eb70 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2eb80 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
2eb90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2eba0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
2ebb0 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
2ebc0 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
2ebd0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
2ebe0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
2ebf0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
2ec00 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
2ec10 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
2ec20 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
2ec30 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
2ec40 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
2ec50 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
2ec60 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
2ec70 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
2ec80 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
2ec90 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
2eca0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
2ecb0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
2ecc0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
2ecd0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
2ece0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
2ecf0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
2ed00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
2ed10 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
2ed20 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2ed30 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
2ed40 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
2ed50 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
2ed60 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
2ed70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2ed80 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
2ed90 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
2eda0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
2edb0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
2edc0 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
2edd0 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
2ede0 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67    if( (pItem->fg
2edf0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
2ee00 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26  UTER)==0.     &&
2ee10 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2ee20 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
2ee30 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  , p->pWhere, pIt
2ee40 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20  em->iCursor).   
2ee50 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   ){.#if SELECTTR
2ee60 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2ee70 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2ee80 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2ee90 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45   ){.        SELE
2eea0 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
2eeb0 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57  arse,p,("After W
2eec0 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68  HERE-clause push
2eed0 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  -down:\n"));.   
2eee0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
2eef0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2ef00 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
2ef10 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a  dif.    }..    z
2ef20 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
2ef30 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
2ef40 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61  Context;.    pPa
2ef50 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
2ef60 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
2ef70 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
2ef80 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  te code to imple
2ef90 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72  ment the subquer
2efa0 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  y.    **.    ** 
2efb0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
2efc0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
2efd0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74   co-routine if t
2efe0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 20  he subquery is. 
2eff0 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
2f000 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72   to be the outer
2f010 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69   loop (so that i
2f020 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
2f030 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  to be.    ** com
2f040 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  puted more than 
2f050 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20  once).    **.   
2f060 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68   ** TODO: Are th
2f070 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ere other reason
2f080 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20  s beside (1) to 
2f090 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  use a co-routine
2f0a0 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  .    ** implemen
2f0b0 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20  tation?.    */. 
2f0c0 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20     if( i==0.    
2f0d0 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
2f0e0 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
2f0f0 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
2f100 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
2f110 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
2f120 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31  OSS))!=0)  /* (1
2f130 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
2f140 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
2f150 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
2f160 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
2f170 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
2f180 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
2f190 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
2f1a0 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
2f1b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2f1c0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
2f1d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
2f1e0 31 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70  1;.     .      p
2f1f0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
2f200 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2f210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f220 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2f230 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70  InitCoroutine, p
2f240 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
2f250 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
2f260 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2f270 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  (v, "%s", pItem-
2f280 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2f290 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
2f2a0 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
2f2b0 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
2f2c0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
2f2d0 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
2f2e0 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2f2f0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65  Return);.      e
2f300 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2f310 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
2f320 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
2f330 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
2f340 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2f350 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
2f360 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
2f370 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
2f380 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
2f390 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
2f3a0 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
2f3b0 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20  routine = 1;.   
2f3c0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73     pItem->regRes
2f3d0 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  ult = dest.iSdst
2f3e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f3f0 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
2f400 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  v, pItem->regRet
2f410 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
2f420 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2f430 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
2f440 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2f450 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2f460 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
2f470 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
2f480 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2f490 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
2f4a0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
2f4b0 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
2f4c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2f4d0 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
2f4e0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2f4f0 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
2f500 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
2f510 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
2f520 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
2f530 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
2f540 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
2f550 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
2f560 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
2f570 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
2f580 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
2f590 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
2f5a0 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
2f5b0 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
2f5c0 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
2f5d0 72 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  r;.      struct 
2f5e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50  SrcList_item *pP
2f5f0 72 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73  rior;..      ass
2f600 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
2f610 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
2f620 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2f630 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
2f640 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
2f650 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
2f660 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2f670 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
2f680 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2f690 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
2f6a0 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
2f6b0 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +1;.      if( pI
2f6c0 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  tem->fg.isCorrel
2f6d0 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ated==0 ){.     
2f6e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2f6f0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72  query is not cor
2f700 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77  related and if w
2f710 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65  e are not inside
2f720 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
2f730 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77   trigger, then w
2f740 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63  e only need to c
2f750 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65  ompute the value
2f760 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
2f770 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  .        ** once
2f780 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63  . */.        onc
2f790 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  eAddr = sqlite3V
2f7a0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
2f7b0 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
2f7c0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2f7d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f7e0 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
2f7f0 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
2f800 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2f810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f820 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
2f830 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
2f840 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
2f850 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2f860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2f870 50 72 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f  Prior = isSelfJo
2f880 69 6e 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c  inView(pTabList,
2f890 20 70 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69   pItem);.      i
2f8a0 66 28 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  f( pPrior ){.   
2f8b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f8c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
2f8d0 6e 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75  nDup, pItem->iCu
2f8e0 72 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43  rsor, pPrior->iC
2f8f0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
2f900 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2f910 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
2f920 49 64 2c 20 70 50 72 69 6f 72 2d 3e 69 53 65 6c  Id, pPrior->iSel
2f930 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20  ectId);.        
2f940 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
2f950 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
2f960 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c        pSub->nSel
2f970 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
2f980 3e 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63  >pSelect->nSelec
2f990 74 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tRow;.      }els
2f9a0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2f9b0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
2f9c0 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65  (&dest, SRT_Ephe
2f9d0 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75  mTab, pItem->iCu
2f9e0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 65  rsor);.        e
2f9f0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2fa00 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
2fa10 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
2fa20 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
2fa30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
2fa40 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
2fa50 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
2fa60 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e   }.      pItem->
2fa70 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2fa80 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74   = pSub->nSelect
2fa90 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  Row;.      if( o
2faa0 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  nceAddr ) sqlite
2fab0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2fac0 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20   onceAddr);.    
2fad0 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69    retAddr = sqli
2fae0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2faf0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65   OP_Return, pIte
2fb00 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2fb10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2fb20 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70  ((v, "end %s", p
2fb30 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2fb40 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
2fb50 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
2fb60 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64  , topAddr, retAd
2fb70 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
2fb80 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
2fb90 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
2fba0 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
2fbb0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2fbc0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2fbd0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
2fbe0 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
2fbf0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
2fc00 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41  ;.    pParse->zA
2fc10 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
2fc20 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
2fc30 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
2fc40 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74   Various element
2fc50 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
2fc60 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61  copied into loca
2fc70 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a  l variables for.
2fc80 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65    ** convenience
2fc90 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
2fca0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65  ->pEList;.  pWhe
2fcb0 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
2fcc0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2fcd0 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
2fce0 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
2fcf0 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73  ;.  sDistinct.is
2fd00 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  Tnct = (p->selFl
2fd10 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
2fd20 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45  t)!=0;..#if SELE
2fd30 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2fd40 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2fd50 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
2fd60 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2fd70 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2fd80 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46  ,p,("After all F
2fd90 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79  ROM-clause analy
2fda0 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  sis:\n"));.    s
2fdb0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2fdc0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2fdd0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
2fde0 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  f SQLITE_COUNTOF
2fdf0 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
2fe00 4e 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  N.  if( Optimiza
2fe10 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
2fe20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
2fe30 74 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75  tener|SQLITE_Cou
2fe40 6e 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20  ntOfView).   && 
2fe50 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d  countOfViewOptim
2fe60 69 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  ization(pParse, 
2fe70 70 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  p).  ){.    if( 
2fe80 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2fe90 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2fea0 6e 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  nd;.    pEList =
2feb0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
2fec0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2fed0 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
2fee0 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
2fef0 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69  y is DISTINCT wi
2ff00 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62  th an ORDER BY b
2ff10 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ut is not an agg
2ff20 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a  regate, and .  *
2ff30 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d  * if the select-
2ff40 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65  list is the same
2ff50 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59   as the ORDER BY
2ff60 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73   list, then this
2ff70 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20   query.  ** can 
2ff80 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  be rewritten as 
2ff90 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f  a GROUP BY. In o
2ffa0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73  ther words, this
2ffb0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2ffc0 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
2ffd0 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  xyz FROM ... ORD
2ffe0 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
2fff0 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d   ** is transform
30000 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ed to:.  **.  **
30010 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20       SELECT xyz 
30020 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42  FROM ... GROUP B
30030 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78  Y xyz ORDER BY x
30040 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
30050 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
30060 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
30070 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
30080 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
30090 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
300a0 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
300b0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
300c0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
300d0 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
300e0 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
300f0 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
30100 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
30110 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
30120 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
30130 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
30140 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
30150 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
30160 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
30170 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
30180 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
30190 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
301a0 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
301b0 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
301c0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
301d0 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  e(sSort.pOrderBy
301e0 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30  , pEList, -1)==0
301f0 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  .  ){.    p->sel
30200 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
30210 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75  tinct;.    pGrou
30220 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
30230 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
30240 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
30250 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  t, 0);.    /* No
30260 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
30270 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
30280 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
30290 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
302a0 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
302b0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
302c0 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
302d0 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
302e0 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
302f0 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
30300 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
30310 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
30320 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
30330 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
30340 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
30350 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53  isTnct );..#if S
30360 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
30370 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
30380 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
30390 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53  0x400 ){.      S
303a0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
303b0 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e  ,pParse,p,("Tran
303c0 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69  sform DISTINCT i
303d0 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22  nto GROUP BY:\n"
303e0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
303f0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
30400 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, p, 0);.    }.
30410 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
30420 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
30430 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
30440 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20   then create an 
30450 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
30460 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73  to.  ** do the s
30470 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69  orting.  But thi
30480 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65  s sorting epheme
30490 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20  ral index might 
304a0 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e  end up.  ** bein
304b0 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
304c0 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72  data can be extr
304d0 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
304e0 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20  ted order..  ** 
304f0 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
30500 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50  ase, then the OP
30510 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
30520 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
30530 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20  be.  ** changed 
30540 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
30550 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ce we figure out
30560 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
30570 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20  g index is.  ** 
30580 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
30590 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
305a0 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73  ndex variable is
305b0 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
305c0 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68  ate.  ** that ch
305d0 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
305e0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
305f0 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
30600 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
30610 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
30620 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
30630 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  rse, sSort.pOrde
30640 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  rBy, 0, pEList->
30650 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72  nExpr);.    sSor
30660 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  t.iECursor = pPa
30670 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
30680 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
30690 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
306a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
306b0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
306c0 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53  al,.          sS
306d0 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53  ort.iECursor, sS
306e0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
306f0 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45  xpr+1+pEList->nE
30700 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  xpr, 0,.        
30710 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
30720 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20  o, P4_KEYINFO.  
30730 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
30740 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
30750 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
30760 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
30770 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
30780 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
30790 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
307a0 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
307b0 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
307c0 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
307d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
307e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
307f0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
30800 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
30810 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
30820 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
30830 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
30840 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
30850 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
30860 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
30870 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
30880 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  it)==0 ){.    p-
30890 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
308a0 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
308b0 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63   rows */.  }.  c
308c0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
308d0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
308e0 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
308f0 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
30900 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
30910 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
30920 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
30930 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  de(v, sSort.addr
30940 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f  SortIndex, OP_So
30950 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73  rterOpen);.    s
30960 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
30970 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
30980 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
30990 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  Open an ephemera
309a0 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
309b0 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
309c0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
309d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
309e0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
309f0 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
30a00 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
30a10 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
30a20 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
30a30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
30a40 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
30a50 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a70 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
30a80 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
30a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30aa0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
30ab0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
30ac0 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
30ad0 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
30ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30af0 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
30b00 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
30b10 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
30b20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
30b30 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
30b40 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
30b50 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
30b60 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERED;.  }else{. 
30b70 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
30b80 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
30b90 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
30ba0 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  }..  if( !isAgg 
30bb0 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
30bc0 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72  {.    /* No aggr
30bd0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
30be0 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
30bf0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31  clause */.    u1
30c00 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  6 wctrlFlags = (
30c10 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
30c20 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   ? WHERE_WANT_DI
30c30 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 20 20 20  STINCT : 0);.   
30c40 20 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55   assert( WHERE_U
30c50 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78  SE_LIMIT==SF_Fix
30c60 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 77  edLimit );.    w
30c70 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 70 2d 3e  ctrlFlags |= p->
30c80 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69  selFlags & SF_Fi
30c90 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f  xedLimit;..    /
30ca0 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
30cb0 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
30cc0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
30cd0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
30ce0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
30cf0 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
30d00 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
30d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
30d30 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e   wctrlFlags, p->
30d40 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
30d50 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
30d60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
30d70 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
30d80 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
30d90 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70  ount(pWInfo) < p
30da0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
30db0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
30dc0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Row = sqlite3Whe
30dd0 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
30de0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
30df0 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63      if( sDistinc
30e00 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69  t.isTnct && sqli
30e10 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
30e20 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ct(pWInfo) ){.  
30e30 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
30e40 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65  nctType = sqlite
30e50 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
30e60 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
30e70 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f      if( sSort.pO
30e80 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
30e90 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73  sSort.nOBSat = s
30ea0 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
30eb0 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ered(pWInfo);.  
30ec0 20 20 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72      sSort.bOrder
30ed0 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71  edInnerLoop = sq
30ee0 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 65  lite3WhereOrdere
30ef0 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66  dInnerLoop(pWInf
30f00 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53  o);.      if( sS
30f10 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72  ort.nOBSat==sSor
30f20 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
30f30 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f  r ){.        sSo
30f40 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
30f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
30f60 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
30f70 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
30f80 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
30f90 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
30fa0 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
30fb0 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
30fc0 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
30fd0 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
30fe0 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
30ff0 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
31000 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
31010 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72   */.    if( sSor
31020 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
31030 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64  =0 && sSort.pOrd
31040 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
31050 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
31060 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
31070 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
31080 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
31090 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
310a0 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a   inner loop. */.
310b0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
310c0 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b  EList==pEList );
310d0 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  .    selectInner
310e0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
310f0 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
31100 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
31110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31120 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
31130 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
31140 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
31150 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31160 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
31170 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
31180 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
31190 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
311a0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
311b0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
311c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
311d0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
311e0 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
311f0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
31200 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
31210 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
31220 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
31230 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
31240 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
31250 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
31260 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
31270 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
31280 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
31290 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
312a0 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
312b0 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
312c0 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
312d0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
312e0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
312f0 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
31300 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
31310 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
31320 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
31330 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
31340 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
31350 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
31360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31370 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
31380 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
31390 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
313a0 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
313b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
313c0 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
313d0 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
313e0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
313f0 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
31400 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
31410 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
31420 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
31430 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
31440 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
31450 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
31460 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
31470 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
31480 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
31490 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
314a0 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
314b0 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
314c0 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
314d0 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
314e0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
314f0 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
31500 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
31510 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
31520 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
31530 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
31540 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
31550 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
31560 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
31570 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
31580 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
31590 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
315a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
315b0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
315c0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
315d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
315e0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
315f0 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31610 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
31620 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
31630 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
31640 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
31650 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
31660 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
31670 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
31680 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
31690 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
316a0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
316b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
316c0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
316d0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
316e0 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
316f0 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
31700 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
31710 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
31720 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
31730 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
31740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31750 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69  assert( 66==sqli
31760 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
31770 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
31780 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70  SelectRow>66 ) p
31790 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36  ->nSelectRow = 6
317a0 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
317b0 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
317c0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
317d0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  );.      p->nSel
317e0 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
317f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
31800 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
31810 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
31820 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
31830 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
31840 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
31850 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
31860 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
31870 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
31880 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
31890 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
318a0 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
318b0 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
318c0 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
318d0 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
318e0 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
318f0 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
31900 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
31910 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
31920 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
31930 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
31940 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
31950 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
31960 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
31970 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
31980 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
31990 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
319a0 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
319b0 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
319c0 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
319d0 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
319e0 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
319f0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
31a00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
31a10 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
31a20 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
31a30 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
31a40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
31a50 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
31a60 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
31a70 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
31a80 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
31a90 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
31aa0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
31ab0 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
31ac0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
31ad0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
31ae0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
31af0 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
31b00 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
31b10 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
31b20 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
31b30 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
31b40 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
31b50 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
31b60 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
31b70 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
31b80 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
31b90 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
31ba0 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
31bb0 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
31bc0 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
31bd0 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
31be0 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
31bf0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ;.    sAggInfo.m
31c00 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
31c10 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
31c20 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
31c30 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
31c40 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
31c50 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
31c60 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
31c70 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
31c80 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
31c90 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
31ca0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
31cb0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
31cc0 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
31cd0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
31ce0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
31cf0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
31d00 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31d10 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68  ( pWhere==p->pWh
31d20 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 68  ere );.        h
31d30 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61  avingToWhere(pPa
31d40 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70  rse, pGroupBy, p
31d50 48 61 76 69 6e 67 2c 20 26 70 2d 3e 70 57 68 65  Having, &p->pWhe
31d60 72 65 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68  re);.        pWh
31d70 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
31d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
31d90 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
31da0 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
31db0 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  , pHaving);.    
31dc0 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
31dd0 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
31de0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
31df0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
31e00 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
31e10 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
31e20 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
31e30 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  rty(sAggInfo.aFu
31e40 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  nc[i].pExpr, EP_
31e50 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
31e60 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
31e70 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
31e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
31e90 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
31ea0 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
31eb0 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
31ec0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
31ed0 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
31ee0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
31ef0 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
31f00 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mxReg = pParse-
31f10 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64  >nMem;.    if( d
31f20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
31f30 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
31f40 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
31f50 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
31f60 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
31f70 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
31f80 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
31f90 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
31fa0 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
31fb0 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
31fc0 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
31fd0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
31fe0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
31ff0 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
32000 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
32010 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
32020 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  y clause */.    
32030 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
32040 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20        /* A-vs-B 
32050 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70  comparision jump
32060 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
32070 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a  drOutputRow;  /*
32080 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
32090 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
320a0 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
320b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  /.      int regO
320c0 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52  utputRow;   /* R
320d0 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
320e0 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75  gister for outpu
320f0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
32100 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
32110 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74  tAbort;   /* Set
32120 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
32130 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
32140 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
32150 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f  fLoop;  /* Top o
32160 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
32170 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
32180 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a  drSortingIdx; /*
32190 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
321a0 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
321b0 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
321c0 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73       int addrRes
321d0 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72  et;      /* Subr
321e0 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
321f0 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
32200 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ator */.      in
32210 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
32220 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
32230 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
32240 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
32250 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  e */..      /* I
32260 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
32270 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
32280 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
32290 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
322a0 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
322b0 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
322c0 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
322d0 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
322e0 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
322f0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
32300 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
32310 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  l, the OP_Sorter
32320 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  Open instruction
32330 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
32340 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
32350 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
32360 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
32370 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
32380 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
32390 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
323a0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
323b0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
323c0 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e  oupBy, 0, sAggIn
323d0 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  fo.nColumn);.   
323e0 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
323f0 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
32400 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
32410 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20  erOpen, .       
32420 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
32430 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f  ingIdx, sAggInfo
32440 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
32450 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28   .          0, (
32460 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
32470 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
32480 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
32490 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
324a0 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
324b0 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
324c0 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
324d0 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
324e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
324f0 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
32500 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
32510 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
32520 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
32530 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
32540 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
32550 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
32560 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
32570 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
32580 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
32590 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
325a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
325b0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
325c0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
325d0 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
325e0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
325f0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
32600 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
32610 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
32620 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
32630 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
32640 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
32650 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
32660 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
32670 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
32680 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
32690 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
326a0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
326b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
326c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
326d0 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
326e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
326f0 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
32700 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
32710 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
32720 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
32730 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
32740 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
32750 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
32760 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
32770 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
32780 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
32790 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
327a0 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
327b0 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
327c0 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
327d0 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
327e0 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
327f0 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
32800 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
32810 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
32820 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
32830 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
32840 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
32850 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
32860 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
32870 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
32880 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32890 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
328a0 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
328b0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
328c0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
328d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
328e0 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75  t, pWhere, pGrou
328f0 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBy, 0,.        
32900 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20    WHERE_GROUPBY 
32910 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20  | (orderByGrp ? 
32920 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
32930 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20  P : 0), 0.      
32940 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
32950 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
32960 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
32970 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
32980 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
32990 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  )==pGroupBy->nEx
329a0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pr ){.        /*
329b0 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
329c0 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
329d0 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
329e0 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
329f0 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
32a00 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
32a10 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
32a20 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
32a30 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
32a40 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
32a50 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
32a60 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
32a70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
32a80 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
32a90 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
32aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32ab0 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
32ac0 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
32ad0 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
32ae0 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
32af0 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
32b00 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
32b10 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
32b20 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
32b30 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
32b40 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
32b50 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
32b60 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
32b70 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
32b80 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
32b90 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
32ba0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
32bb0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
32bc0 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
32bd0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
32be0 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
32bf0 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
32c00 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
32c10 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
32c20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
32c30 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
32c40 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
32c50 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
32c60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
32c70 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
32c80 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
32c90 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
32ca0 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
32cb0 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
32cc0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
32cd0 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  l = nGroupBy;.  
32ce0 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
32cf0 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
32d00 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
32d10 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
32d20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
32d30 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
32d40 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
32d50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
32d60 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
32d70 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
32d80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
32d90 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
32da0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
32db0 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
32dc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32dd0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
32de0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
32df0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
32e00 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
32e10 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
32e20 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
32e30 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
32e40 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
32e50 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
32e60 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
32e70 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
32e80 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
32e90 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
32ea0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
32eb0 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
32ec0 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
32ed0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
32ee0 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
32ef0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32f00 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
32f10 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20  mnToReg(pParse, 
32f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f40 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
32f50 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  ->iColumn, pCol-
32f60 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20  >iTable, r1);.  
32f70 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
32f80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
32fa0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
32fb0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
32fc0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
32fd0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
32fe0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
32ff0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72  regBase, nCol, r
33000 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
33010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33020 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
33030 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  rInsert, sAggInf
33040 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65  o.sortingIdx, re
33050 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
33060 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
33070 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
33080 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
33090 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
330a0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
330b0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
330c0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
330d0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
330e0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  fo);.        sAg
330f0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
33100 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20  PTab = sortPTab 
33110 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
33120 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75  ;.        sortOu
33130 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
33140 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
33150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33160 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
33170 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50  penPseudo, sortP
33180 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43  Tab, sortOut, nC
33190 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
331a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
331b0 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
331c0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
331d0 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
331e0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
331f0 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42  ent((v, "GROUP B
33200 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43  Y sort")); VdbeC
33210 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
33220 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65      sAggInfo.use
33230 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a  SortingIdx = 1;.
33240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
33250 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
33260 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a  arse);..      }.
33270 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
33280 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72   index or tempor
33290 61 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62  ary table used b
332a0 79 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73  y the GROUP BY s
332b0 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ort.      ** wil
332c0 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69  l naturally deli
332d0 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20  ver rows in the 
332e0 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62  order required b
332f0 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  y the ORDER BY. 
33300 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20       ** clause, 
33310 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d  cancel the ephem
33320 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20  eral table open 
33330 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20  coded earlier.. 
33340 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
33350 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
33360 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63  mization - the c
33370 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68  orrect answer sh
33380 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61  ould result rega
33390 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a  rdless..      **
333a0 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f   Use the SQLITE_
333b0 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61  GroupByOrder fla
333c0 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45  g with SQLITE_TE
333d0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52  STCTRL_OPTIMIZER
333e0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69   to .      ** di
333f0 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d  sable this optim
33400 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74  ization for test
33410 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a  ing purposes.  *
33420 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65  /.      if( orde
33430 72 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69  rByGrp && Optimi
33440 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
33450 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  , SQLITE_GroupBy
33460 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26  Order) .       &
33470 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c  & (groupBySort |
33480 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  | sqlite3WhereIs
33490 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a  Sorted(pWInfo)).
334a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
334b0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
334c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
334d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
334e0 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  Noop(v, sSort.ad
334f0 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
33500 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
33510 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
33520 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
33530 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
33540 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
33550 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
33560 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
33570 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
33580 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
33590 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
335a0 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
335b0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
335c0 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
335d0 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
335e0 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
335f0 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
33600 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
33610 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
33620 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33630 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
33640 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
33650 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
33660 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
33670 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
33680 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
33690 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
336a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
336b0 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
336c0 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Data, sAggInfo.s
336d0 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
336e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336f0 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f       sortOut, so
33700 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  rtPTab);.      }
33710 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
33720 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
33730 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
33740 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
33750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
33760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
33770 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f  v, OP_Column, so
33780 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d  rtPTab, j, iBMem
33790 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +j);.        }el
337a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
337b0 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
337c0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
337d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
337e0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
337f0 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69  y->a[j].pExpr, i
33800 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
33810 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
33820 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33830 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
33840 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20  , iAMem, iBMem, 
33850 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
33860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33870 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
33880 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
33890 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
338a0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
338b0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
338c0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
338d0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
338e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
338f0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31  OP_Jump, addr1+1
33900 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56  , 0, addr1+1); V
33910 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
33920 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
33930 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
33940 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
33950 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
33960 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
33970 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
33980 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
33990 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
339a0 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
339b0 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
339c0 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
339d0 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
339e0 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
339f0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
33a00 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
33a10 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
33a20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
33a30 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
33a40 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
33a50 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
33a60 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
33a70 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
33a80 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
33a90 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
33aa0 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
33ab0 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
33ac0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
33ad0 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
33ae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
33af0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
33b00 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
33b10 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
33b20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
33b30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
33b40 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
33b50 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
33b60 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
33b70 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
33b80 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
33b90 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
33ba0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
33bb0 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
33bc0 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20  Flag, addrEnd); 
33bd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
33be0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
33bf0 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
33c00 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
33c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33c20 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
33c30 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
33c40 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
33c50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
33c60 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
33c70 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
33c80 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
33c90 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
33ca0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
33cb0 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
33cc0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
33cd0 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
33ce0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
33cf0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
33d00 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
33d10 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
33d20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
33d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33d40 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
33d50 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 1, iUseFlag);
33d60 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
33d70 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
33d80 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
33d90 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
33da0 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
33db0 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
33dc0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
33dd0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
33de0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
33df0 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
33e00 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
33e10 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
33e20 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64  oop);.        Vd
33e30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
33e40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33e50 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
33e60 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
33e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33e80 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
33e90 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b  addrSortingIdx);
33ea0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33eb0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
33ec0 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
33ed0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
33ee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33ef0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
33f00 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
33f10 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
33f20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
33f30 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
33f40 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20  l row"));..     
33f50 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68   /* Jump over th
33f60 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20  e subroutines.  
33f70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
33f80 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
33f90 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
33fa0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
33fb0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
33fc0 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
33fd0 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
33fe0 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
33ff0 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
34000 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
34010 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
34020 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
34030 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
34040 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
34050 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
34060 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
34070 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
34080 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
34090 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
340a0 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
340b0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
340c0 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
340d0 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
340e0 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
340f0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
34100 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
34110 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
34120 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
34130 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
34140 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
34150 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
34160 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
34170 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34180 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
34190 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
341a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
341b0 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
341c0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
341d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
341e0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
341f0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
34200 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
34210 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
34220 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
34230 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
34240 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
34250 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
34260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34270 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
34280 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
34290 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
342a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
342b0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
342c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
342d0 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
342e0 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
342f0 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
34300 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
34310 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
34320 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
34330 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
34340 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
34350 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
34360 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
34370 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
34380 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
34390 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  w+1, SQLITE_JUMP
343a0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
343b0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
343c0 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
343d0 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Sort,.          
343e0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69              &sDi
343f0 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
34400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34410 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
34420 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f  ow+1, addrSetAbo
34430 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
34440 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
34450 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
34460 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
34470 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34480 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73  "end groupby res
34490 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
344a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
344b0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
344c0 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
344d0 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
344e0 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
344f0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
34500 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34510 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b  l(v, addrReset);
34520 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
34530 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
34540 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
34550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34560 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
34570 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20  , regReset);.   
34580 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
34590 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67  f pGroupBy.  Beg
345a0 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  in aggregate que
345b0 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f  ries without GRO
345c0 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c  UP BY: */.    el
345d0 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  se {.      ExprL
345e0 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23  ist *pDel = 0;.#
345f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34600 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20  IT_BTREECOUNT.  
34610 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
34620 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62  .      if( (pTab
34630 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74   = isSimpleCount
34640 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21  (p, &sAggInfo))!
34650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
34660 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e   If isSimpleCoun
34670 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f  t() returns a po
34680 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65  inter to a Table
34690 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
346a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
346b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
346c0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
346d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
346e0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75   **   SELECT cou
346f0 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
34700 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
34710 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65      ** where the
34720 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
34730 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73   returned repres
34740 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e  ents table <tbl>
34750 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
34760 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61       ** This sta
34770 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d  tement is so com
34780 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f  mon that it is o
34790 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c  ptimized special
347a0 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ly. The.        
347b0 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74  ** OP_Count inst
347c0 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75  ruction is execu
347d0 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68  ted either on th
347e0 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74  e intkey table t
347f0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
34800 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
34810 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e   for table <tbl>
34820 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74   or on one of it
34830 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20  s indexes. It.  
34840 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74        ** is bett
34850 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  er to execute th
34860 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78  e op on an index
34870 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65  , as indexes are
34880 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20   almost.        
34890 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64  ** always spread
348a0 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67   across less pag
348b0 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f  es than their co
348c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
348d0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
348e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
348f0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
34900 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
34910 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
34920 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
34930 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d  const int iCsr =
34940 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
34950 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
34960 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f  o scan b-tree */
34970 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
34980 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
34990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
349a0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
349b0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65  le */.        Ke
349c0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
349d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
349e0 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f     /* Keyinfo fo
349f0 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20  r scanned index 
34a00 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
34a10 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20   *pBest = 0;    
34a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a30 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f  /* Best index fo
34a40 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  und so far */.  
34a50 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20        int iRoot 
34a60 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20  = pTab->tnum;   
34a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
34a80 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e  ot page of scann
34a90 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20  ed b-tree */..  
34aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
34ab0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
34ac0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
34ad0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
34ae0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
34af0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
34b00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
34b10 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
34b20 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  h for the index 
34b30 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77  that has the low
34b40 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20  est scan cost.. 
34b50 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34b60 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35    ** (2011-04-15
34b70 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75  ) Do not do a fu
34b80 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e  ll scan of an un
34b90 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20  ordered index.. 
34ba0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34bb0 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33    ** (2013-10-03
34bc0 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74  ) Do not count t
34bd0 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20  he entries in a 
34be0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20  partial index.. 
34bf0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34c00 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65    ** In practice
34c10 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
34c20 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20  ucture will not 
34c30 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f  be used. It is o
34c40 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  nly .        ** 
34c50 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f  passed to keep O
34c60 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79  P_OpenRead happy
34c70 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34c80 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
34c90 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74  id(pTab) ) pBest
34ca0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
34cb0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
34cc0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
34cd0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
34ce0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
34cf0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
34d00 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e     if( pIdx->bUn
34d10 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
34d20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73        && pIdx->s
34d30 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a  zIdxRow<pTab->sz
34d40 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20  TabRow.         
34d50 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74    && pIdx->pPart
34d60 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20  IdxWhere==0.    
34d70 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73         && (!pBes
34d80 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78  t || pIdx->szIdx
34d90 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78  Row<pBest->szIdx
34da0 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29  Row).          )
34db0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
34dc0 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
34dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34de0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
34df0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
34e00 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e   iRoot = pBest->
34e10 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
34e20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
34e30 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
34e40 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b  (pParse, pBest);
34e50 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
34e60 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65      /* Open a re
34e70 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
34e80 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43  execute the OP_C
34e90 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20  ount, close the 
34ea0 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20  cursor. */.     
34eb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34ec0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70  dOp4Int(v, OP_Op
34ed0 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52  enRead, iCsr, iR
34ee0 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  oot, iDb, 1);.  
34ef0 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
34f00 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
34f10 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
34f20 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
34f30 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)pKeyInfo, P4_
34f40 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
34f50 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
34f60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34f70 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c   OP_Count, iCsr,
34f80 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
34f90 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0].iMem);.      
34fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34fb0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
34fc0 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   iCsr);.        
34fd0 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
34fe0 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  nt(pParse, pTab,
34ff0 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   pBest);.      }
35000 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
35010 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
35020 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
35030 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
35040 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
35050 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
35060 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
35070 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
35080 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
35090 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
350a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
350b0 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
350c0 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
350d0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
350e0 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
350f0 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
35100 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
35110 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
35120 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
35130 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
35140 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
35150 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
35160 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
35170 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
35180 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
35190 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
351a0 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
351b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
351c0 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
351d0 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
351e0 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
351f0 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
35200 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
35210 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
35220 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
35230 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
35240 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
35250 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
35260 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
35270 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
35280 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
35290 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
352a0 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
352b0 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
352c0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
352d0 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
352e0 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
352f0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
35300 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
35310 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
35320 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c  behavior as foll
35330 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ows:.        **.
35340 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49          **   + I
35350 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
35360 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
35370 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
35380 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20  coded by.       
35390 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20   **     where.c 
353a0 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61  should not itera
353b0 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75  te over any valu
353c0 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  es with a NULL v
353d0 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
353e0 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
353f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
35400 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a     + The optimiz
35410 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  er code in where
35420 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68  .c (the thing th
35430 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68  at decides which
35440 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
35450 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73  index or indices
35460 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20   to use) should 
35470 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e  place a differen
35480 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20  t priority on . 
35490 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61         **     sa
354a0 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
354b0 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
354c0 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
354d0 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
354e0 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72      **     Refer
354f0 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d   to code and com
35500 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63  ments in where.c
35510 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
35520 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
35530 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
35540 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ax = 0;.        
35550 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f  u8 flag = WHERE_
35560 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
35570 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
35580 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
35590 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
355a0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
355b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
355c0 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
355d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
355e0 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
355f0 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e  &sAggInfo, &pMin
35600 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Max);.        }.
35610 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35620 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e  flag==0 || (pMin
35630 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61  Max!=0 && pMinMa
35640 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a  x->nExpr==1) );.
35650 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
35660 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  g ){.          p
35670 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
35680 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
35690 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20  pMinMax, 0);.   
356a0 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d         pDel = pM
356b0 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20  inMax;.         
356c0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
356d0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 4d 69  locFailed || pMi
356e0 6e 4d 61 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  nMax!=0 );.     
356f0 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
35700 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
35710 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
35720 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  x->a[0].sortOrde
35730 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f  r = flag!=WHERE_
35740 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30  ORDERBY_MIN ?1:0
35750 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
35760 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
35770 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
35780 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  N;.          }. 
35790 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
357a0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
357b0 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
357c0 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
357d0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
357e0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
357f0 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
35800 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
35810 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
35820 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
35830 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
35840 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
35850 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
35860 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
35870 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
35880 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
35890 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
358a0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
358b0 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 20 30  here, pMinMax, 0
358c0 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20  ,flag,0);.      
358d0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
358e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
358f0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
35900 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
35910 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
35920 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
35930 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74   }.        updat
35940 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
35950 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
35960 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
35970 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70   pMinMax==0 || p
35980 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
35990 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
359a0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
359b0 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20  dered(pWInfo)>0 
359c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
359d0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
359e0 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
359f0 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
35a00 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
35a10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
35a20 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20   by index",.    
35a30 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
35a40 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
35a50 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
35a60 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )));.        }. 
35a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
35a80 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
35a90 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65          finalize
35aa0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
35ab0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
35ac0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
35ad0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
35ae0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
35af0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
35b00 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
35b10 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
35b20 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
35b30 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
35b40 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20  (pParse, p, -1, 
35b50 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
35b60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
35b70 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
35b80 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEnd);.      sql
35b90 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
35ba0 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
35bb0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
35bc0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
35bd0 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
35be0 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
35bf0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
35c00 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e  /..  if( sDistin
35c10 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  ct.eTnctType==WH
35c20 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
35c30 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78  RDERED ){.    ex
35c40 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
35c50 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
35c60 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ");.  }..  /* If
35c70 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
35c80 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
35c90 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
35ca0 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
35cb0 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
35cc0 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
35cd0 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
35ce0 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
35cf0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65  OrderBy ){.    e
35d00 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
35d10 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
35d20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 53 6f               sSo
35d30 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52  rt.nOBSat>0 ? "R
35d40 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44  IGHT PART OF ORD
35d50 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59  ER BY":"ORDER BY
35d60 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  ");.    generate
35d70 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
35d80 20 70 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69   p, &sSort, pELi
35d90 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
35da0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
35db0 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
35dc0 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
35dd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
35de0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
35df0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
35e00 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
35e10 65 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ed. If there is 
35e20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
35e30 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2c  Parse structure,
35e40 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 72 65  .  ** set the re
35e50 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20  turn code to 1. 
35e60 4f 74 68 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a  Otherwise 0. */.
35e70 20 20 72 63 20 3d 20 28 70 50 61 72 73 65 2d 3e    rc = (pParse->
35e80 6e 45 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43  nErr>0);..  /* C
35e90 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
35ea0 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
35eb0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
35ec0 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
35ed0 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
35ee0 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
35ef0 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
35f00 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53  _end:.  explainS
35f10 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
35f20 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
35f30 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
35f40 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
35f50 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
35f60 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
35f70 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
35f80 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45  o.aFunc);.#if SE
35f90 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
35fa0 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  D.  SELECTTRACE(
35fb0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64  1,pParse,p,("end
35fc0 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29   processing\n"))
35fd0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c  ;.  pParse->nSel
35fe0 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e  ectIndent--;.#en
35ff0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
36000 0a 7d 0a                                         .}.