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

Artifact 8a506e0a27799e96276aea0b5fd1591762905bd572f326d2886cb74f5ceb5f4a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41  .    if( OK_IF_A
0b00: 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70 57  LWAYS_TRUE(p->pW
0b10: 69 74 68 29 20 29 20 73 71 6c 69 74 65 33 57 69  ith) ) sqlite3Wi
0b20: 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  thDelete(db, p->
0b30: 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66 28 20  pWith);.    if( 
0b40: 62 46 72 65 65 20 29 20 73 71 6c 69 74 65 33 44  bFree ) sqlite3D
0b50: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
0b60: 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a      p = pPrior;.
0b70: 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a 20      bFree = 1;. 
0b80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
0b90: 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74 44  ialize a SelectD
0ba0: 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
0bb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
0bc0: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65 6c  lectDestInit(Sel
0bd0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
0be0: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
0bf0: 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e  Parm){.  pDest->
0c00: 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65 73  eDest = (u8)eDes
0c10: 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44 50  t;.  pDest->iSDP
0c20: 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70  arm = iParm;.  p
0c30: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d  Dest->zAffSdst =
0c40: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
0c50: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0c60: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0c70: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0c80: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0c90: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0ca0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0cb0: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0cc0: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0cd0: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0ce0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0cf0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0d00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0d10: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0d20: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0d30: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0d40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0d50: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0d60: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0d70: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0d80: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0d90: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0da0: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0db0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0dc0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0dd0: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0de0: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0df0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0e00: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0e10: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0e20: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0e30: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0e40: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0e50: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33 32 20  clause */.  u32 
0e60: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0e70: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0e80: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0e90: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0ea0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0eb0: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0ec0: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0ed0: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0ee0: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0ef0: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0f00: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0f10: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0f20: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0f30: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0f40: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
0f50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
0f60: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
0f70: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
0f80: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
0f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
0fa0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
0fb0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0fc0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
0fd0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
0fe0: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
0ff0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1000: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1010: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1040: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
1050: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
1060: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
1070: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
1080: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1090: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
10a0: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
10b0: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
10c0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
10d0: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
10e0: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
10f0: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1100: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
1110: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
1120: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
1130: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1140: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
1150: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
1160: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
1170: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
1180: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1190: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
11a0: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
11b0: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
11c0: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
11d0: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
11e0: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
11f0: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
1200: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
1210: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
1220: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1230: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
1240: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
1250: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
1260: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1270: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
1280: 70 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d  pOffset;.  pNew-
1290: 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 61 73  >pWith = 0;.  as
12a0: 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30  sert( pOffset==0
12b0: 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c   || pLimit!=0 ||
12c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 0a   pParse->nErr>0.
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
12f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1300: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
1310: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1320: 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c  ailed ) {.    cl
1330: 65 61 72 53 65 6c 65 63 74 28 70 50 61 72 73 65  earSelect(pParse
1340: 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  ->db, pNew, pNew
1350: 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20  !=&standin);.   
1360: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c   pNew = 0;.  }el
1370: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1380: 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c  pNew->pSrc!=0 ||
1390: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
13a0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
13b0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20   pNew!=&standin 
13c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
13d0: 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  ;.}..#if SELECTT
13e0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
13f0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
1400: 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a 65  of a Select obje
1410: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
1420: 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
1430: 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74  Select *p, const
1440: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1450: 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65 20   if( p && zName 
1460: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1470: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
1480: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e  ->zSelName), p->
1490: 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20  zSelName, "%s", 
14a0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  zName);.  }.}.#e
14b0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  ndif.../*.** Del
14c0: 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65  ete the given Se
14d0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
14e0: 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
14f0: 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a  bstructures..*/.
1500: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1510: 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  ctDelete(sqlite3
1520: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29   *db, Select *p)
1530: 7b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  {.  if( OK_IF_AL
1540: 57 41 59 53 5f 54 52 55 45 28 70 29 20 29 20 63  WAYS_TRUE(p) ) c
1550: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
1560: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 1);.}../*.** R
1570: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1580: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
1590: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
15a0: 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  nt in a compound
15b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c 65  ..*/.static Sele
15c0: 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f 73  ct *findRightmos
15d0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
15e0: 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74 20  while( p->pNext 
15f0: 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ) p = p->pNext;.
1600: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1610: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
1620: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
1630: 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e  eceding the JOIN
1640: 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d   keyword, determ
1650: 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  ine the.** type 
1660: 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e  of join.  Return
1670: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
1680: 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65 73  tant that expres
1690: 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a  ses that type.**
16a0: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
16b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76   following bit v
16c0: 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
16d0: 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20   JT_INNER.**    
16e0: 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20   JT_CROSS.**    
16f0: 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20   JT_OUTER.**    
1700: 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20   JT_NATURAL.**  
1710: 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20     JT_LEFT.**   
1720: 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a    JT_RIGHT.**.**
1730: 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f   A full outer jo
1740: 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e  in is the combin
1750: 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54  ation of JT_LEFT
1760: 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a   and JT_RIGHT..*
1770: 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67  *.** If an illeg
1780: 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  al or unsupporte
1790: 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73  d join type is s
17a0: 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20  een, then still 
17b0: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e  return.** a join
17c0: 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20 61   type, but put a
17d0: 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70  n error in the p
17e0: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
17f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a  .*/.int sqlite3J
1800: 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  oinType(Parse *p
1810: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41  Parse, Token *pA
1820: 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b  , Token *pB, Tok
1830: 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a  en *pC){.  int j
1840: 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54  ointype = 0;.  T
1850: 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a  oken *apAll[3];.
1860: 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20    Token *p;.    
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 30 31           /*   01
1890: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
18a0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
18b0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
18c0: 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65 78 74  st char zKeyText
18d0: 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65 66 74  [] = "naturaleft
18e0: 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e  outerightfullinn
18f0: 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74 61 74  ercross";.  stat
1900: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
1910: 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20 20 20  {.    u8 i;     
1920: 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
1930: 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78 74 20  of keyword text 
1940: 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f  in zKeyText[] */
1950: 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 20 20  .    u8 nChar;  
1960: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1970: 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20 63 68  he keyword in ch
1980: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20  aracters */.    
1990: 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20  u8 code;     /* 
19a0: 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a  Join type mask *
19b0: 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d  /.  } aKeyword[]
19c0: 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75   = {.    /* natu
19d0: 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20  ral */ { 0,  7, 
19e0: 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20 20 20  JT_NATURAL      
19f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1a00: 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b   /* left    */ {
1a10: 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   6,  4, JT_LEFT|
1a20: 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20  JT_OUTER        
1a30: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65    },.    /* oute
1a40: 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20  r   */ { 10, 5, 
1a50: 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20  JT_OUTER        
1a60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1a70: 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f 20 7b   /* right   */ {
1a80: 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54   14, 5, JT_RIGHT
1a90: 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20  |JT_OUTER       
1aa0: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c    },.    /* full
1ab0: 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20      */ { 19, 4, 
1ac0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
1ad0: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
1ae0: 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b   /* inner   */ {
1af0: 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   23, 5, JT_INNER
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73    },.    /* cros
1b20: 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20  s   */ { 28, 5, 
1b30: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53  JT_INNER|JT_CROS
1b40: 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  S         },.  }
1b50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
1b60: 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20  apAll[0] = pA;. 
1b70: 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a   apAll[1] = pB;.
1b80: 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b    apAll[2] = pC;
1b90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20  .  for(i=0; i<3 
1ba0: 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b  && apAll[i]; i++
1bb0: 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c  ){.    p = apAll
1bc0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  [i];.    for(j=0
1bd0: 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 4b  ; j<ArraySize(aK
1be0: 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20  eyword); j++){. 
1bf0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61       if( p->n==a
1c00: 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72  Keyword[j].nChar
1c10: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73   .          && s
1c20: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
1c30: 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65  char*)p->z, &zKe
1c40: 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a  yText[aKeyword[j
1c50: 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29  ].i], p->n)==0 )
1c60: 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79  {.        jointy
1c70: 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a  pe |= aKeyword[j
1c80: 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].code;.        
1c90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1ca0: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
1cb0: 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20  e( j==0 || j==1 
1cc0: 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20  || j==2 || j==3 
1cd0: 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20  || j==4 || j==5 
1ce0: 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69  || j==6 );.    i
1cf0: 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28  f( j>=ArraySize(
1d00: 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20 20 20  aKeyword) ){.   
1d10: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a     jointype |= J
1d20: 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  T_ERROR;.      b
1d30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1d40: 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e    if(.     (join
1d50: 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52  type & (JT_INNER
1d60: 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54  |JT_OUTER))==(JT
1d70: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
1d80: 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79   ||.     (jointy
1d90: 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d  pe & JT_ERROR)!=
1da0: 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  0.  ){.    const
1db0: 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22   char *zSp = " "
1dc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1dd0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
1de0: 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d  C==0 ){ zSp++; }
1df0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1e00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1e10: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
1e20: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
1e30: 22 0a 20 20 20 20 20 20 20 22 25 54 20 25 54 25  ".       "%T %T%
1e40: 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53  s%T", pA, pB, zS
1e50: 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  p, pC);.    join
1e60: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
1e70: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f  .  }else if( (jo
1e80: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1e90: 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  R)!=0 .         
1ea0: 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28  && (jointype & (
1eb0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
1ec0: 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  ))!=JT_LEFT ){. 
1ed0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ee0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
1ef0: 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c    "RIGHT and FUL
1f00: 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72  L OUTER JOINs ar
1f10: 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  e not currently 
1f20: 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20  supported");.   
1f30: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
1f40: 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NNER;.  }.  retu
1f50: 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a  rn jointype;.}..
1f60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1f70: 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75   index of a colu
1f80: 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20  mn in a table.  
1f90: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
1fa0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f   column.** is no
1fb0: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
1fc0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
1fd0: 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e  tic int columnIn
1fe0: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  dex(Table *pTab,
1ff0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2000: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
2010: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
2020: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2030: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2040: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  mp(pTab->aCol[i]
2050: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
2060: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
2070: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
2080: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
2090: 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c 65 73  e first N tables
20a0: 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c   in pSrc, from l
20b0: 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f  eft to right, lo
20c0: 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74  oking for a.** t
20d0: 61 62 6c 65 20 74 68 61 74 20 68 61 73 20 61 20  able that has a 
20e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f  column named zCo
20f0: 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  l.  .**.** When 
2100: 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69 54 61  found, set *piTa
2110: 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20  b and *piCol to 
2120: 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65 78 20  the table index 
2130: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  and column index
2140: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68  .** of the match
2150: 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72  ing column and r
2160: 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a  eturn TRUE..**.*
2170: 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  * If not found, 
2180: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
2190: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61 62 6c  .static int tabl
21a0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
21b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
21c0: 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ,       /* Array
21d0: 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
21e0: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  arch */.  int N,
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2200: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  * Number of tabl
2210: 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  es in pSrc->a[] 
2220: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63  to search */.  c
2230: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
2240: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2250: 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65  he column we are
2260: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
2270: 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20 20 20    int *piTab,   
2280: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2290: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
22a0: 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  [] here */.  int
22b0: 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20 20 20   *piCol         
22c0: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
22d0: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54   of pSrc->a[*piT
22e0: 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d  ab].pTab->aCol[]
22f0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2300: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2310: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
2320: 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
2330: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2340: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2350: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
2360: 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c  mn matching zCol
2370: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
2380: 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f  piTab==0)==(piCo
2390: 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74  l==0) );  /* Bot
23a0: 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61 72 65  h or neither are
23b0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69   NULL */.  for(i
23c0: 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<N; i++){. 
23d0: 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e     iCol = column
23e0: 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d  Index(pSrc->a[i]
23f0: 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20  .pTab, zCol);.  
2400: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
2410: 0a 20 20 20 20 20 20 69 66 28 20 70 69 54 61 62  .      if( piTab
2420: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 54   ){.        *piT
2430: 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ab = i;.        
2440: 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20  *piCol = iCol;. 
2450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2460: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
2470: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2480: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2490: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
24a0: 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69 65 64  dd terms implied
24b0: 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20   by JOIN syntax 
24c0: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
24d0: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
24e0: 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  n of a SELECT st
24f0: 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77  atement. The new
2500: 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20   term, which.** 
2510: 69 73 20 41 4e 44 65 64 20 77 69 74 68 20 74 68  is ANDed with th
2520: 65 20 65 78 69 73 74 69 6e 67 20 57 48 45 52 45  e existing WHERE
2530: 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66 20 74   clause, is of t
2540: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
2550: 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74    (tab1.col1 = t
2560: 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20  ab2.col2).**.** 
2570: 77 68 65 72 65 20 74 61 62 31 20 69 73 20 74 68  where tab1 is th
2580: 65 20 69 53 72 63 27 74 68 20 74 61 62 6c 65 20  e iSrc'th table 
2590: 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63 20  in SrcList pSrc 
25a0: 61 6e 64 20 74 61 62 32 20 69 73 20 74 68 65 20  and tab2 is the 
25b0: 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74 68 2e  .** (iSrc+1)'th.
25c0: 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20   Column col1 is 
25d0: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20  column iColLeft 
25e0: 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c  of tab1, and col
25f0: 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69  2 is.** column i
2600: 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61 62 32  ColRight of tab2
2610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2620: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
2630: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
2660: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
2670: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2690: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 46 52   of tables in FR
26a0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
26b0: 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20 20 20  nt iLeft,       
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
26e0: 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69   table to join i
26f0: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2700: 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20 20  iColLeft,       
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2720: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
2730: 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  n first table */
2740: 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c 20 20  .  int iRight,  
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
2770: 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20 70  econd table in p
2780: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
2790: 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  lRight,         
27a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
27b0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73  x of column in s
27c0: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
27d0: 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e   int isOuterJoin
27e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2800: 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69   is an OUTER joi
2810: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
2820: 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20  Where           
2830: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2840: 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  : The WHERE clau
2850: 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a  se to add to */.
2860: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2870: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2880: 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20 45 78   Expr *pE1;.  Ex
2890: 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70 72 20  pr *pE2;.  Expr 
28a0: 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pEq;..  assert(
28b0: 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20 29 3b   iLeft<iRight );
28c0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
28d0: 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29 3b 0a  >nSrc>iRight );.
28e0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
28f0: 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b  a[iLeft].pTab );
2900: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
2910: 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61 62 20  >a[iRight].pTab 
2920: 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c 69  );..  pE1 = sqli
2930: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
2940: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 4c  xpr(db, pSrc, iL
2950: 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a  eft, iColLeft);.
2960: 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65 33 43    pE2 = sqlite3C
2970: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2980: 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67 68 74  db, pSrc, iRight
2990: 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20  , iColRight);.. 
29a0: 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45   pEq = sqlite3PE
29b0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45  xpr(pParse, TK_E
29c0: 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a 20 20  Q, pE1, pE2);.  
29d0: 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74  if( pEq && isOut
29e0: 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78  erJoin ){.    Ex
29f0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
2a00: 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  q, EP_FromJoin);
2a10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
2a20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2a30: 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  q, EP_TokenOnly|
2a40: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2a50: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2a60: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f  perty(pEq, EP_No
2a70: 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45 71  Reduce);.    pEq
2a80: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2a90: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2aa0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2ab0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2ac0: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
2ad0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
2ae0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
2af0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2b00: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
2b10: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
2b20: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2b30: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2b40: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2b50: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2b60: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2b70: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2b80: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2b90: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2ba0: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2bb0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2bc0: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
2bd0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
2be0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
2bf0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
2c00: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
2c10: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
2c20: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2c30: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2c40: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2c50: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2c60: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2c70: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2c80: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2c90: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2ca0: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2cb0: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2cc0: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
2cd0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
2ce0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
2cf0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2d00: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
2d10: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
2d20: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
2d30: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
2d40: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
2d50: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2d60: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
2d70: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
2d80: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
2d90: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
2da0: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
2db0: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
2dc0: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
2dd0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
2de0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
2df0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
2e00: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2e10: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
2e20: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
2e30: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
2e40: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
2e50: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
2e60: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2e70: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
2e80: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
2e90: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
2ea0: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
2eb0: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
2ec0: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
2ed0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
2ee0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
2ef0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
2f00: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
2f10: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
2f20: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2f30: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2f40: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2f50: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2f60: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2f70: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2f80: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2f90: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2fa0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2fb0: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
2fc0: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
2fd0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
2fe0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
2ff0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
3000: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
3010: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
3020: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
3030: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
3040: 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
3050: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
3060: 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67  ce);.    p->iRig
3070: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
3080: 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69  16)iTable;.    i
3090: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  f( p->op==TK_FUN
30a0: 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c  CTION && p->x.pL
30b0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
30c0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
30d0: 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  0; i<p->x.pList-
30e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
30f0: 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
3100: 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  r(p->x.pList->a[
3110: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
3120: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3130: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
3140: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
3150: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
3160: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
3170: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3180: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
3190: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
31a0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
31b0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
31c0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
31d0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
31e0: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
31f0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3200: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
3210: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
3220: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
3230: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
3240: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
3250: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
3260: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
3270: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
3280: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
3290: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
32a0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
32b0: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
32c0: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
32d0: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
32e0: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
32f0: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
3300: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
3310: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
3320: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
3330: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
3340: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
3350: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
3360: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
3370: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
3380: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3390: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
33a0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
33b0: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
33c0: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
33d0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
33e0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
33f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
3400: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
3410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
3420: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
3430: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
3440: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
3450: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3470: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
3480: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3490: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
34c0: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
34d0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
34e0: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
34f0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3500: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
3510: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
3520: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
3530: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3540: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
3550: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
3560: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
3570: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
3580: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
3590: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
35a0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
35b0: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
35c0: 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62  Table *pRightTab
35d0: 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b   = pRight->pTab;
35e0: 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72  .    int isOuter
35f0: 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  ;..    if( NEVER
3600: 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30 20  (pLeft->pTab==0 
3610: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
3620: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3630: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
3640: 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  ht->fg.jointype 
3650: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a  & JT_OUTER)!=0;.
3660: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
3670: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
3680: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
3690: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
36a0: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
36b0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
36c0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
36d0: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
36e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
36f0: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3700: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
3710: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
3720: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
3730: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3750: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
3760: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
3770: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
3780: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
3790: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
37a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
37b0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
37c0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
37d0: 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b  pRightTab->nCol;
37e0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
37f0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
3800: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20   Name of column 
3810: 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  in the right tab
3820: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3830: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  t iLeft;     /* 
3840: 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61  Matching left ta
3850: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
3860: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a  nt iLeftCol;  /*
3870: 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   Matching column
3880: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
3890: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  le */..        z
38a0: 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62  Name = pRightTab
38b0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
38c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62  .        if( tab
38d0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
38e0: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
38f0: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
3900: 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  tCol) ){.       
3910: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
3920: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
3930: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
3940: 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20  +1, j,.         
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
3960: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
3970: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
3980: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3990: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
39a0: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
39b0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
39c0: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
39d0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
39e0: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
39f0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
3a00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3a10: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
3a20: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
3a30: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
3a40: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3a50: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
3a60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3a70: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
3a80: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
3a90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
3aa0: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
3ab0: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
3ac0: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
3ad0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3ae0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
3af0: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
3b00: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
3b10: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
3b20: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
3b30: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
3b40: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
3b50: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57  Parse->db, p->pW
3b60: 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f  here, pRight->pO
3b70: 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  n);.      pRight
3b80: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
3b90: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
3ba0: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
3bb0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3bc0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
3bd0: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
3be0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3bf0: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
3c00: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
3c10: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
3c20: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
3c30: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
3c40: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
3c50: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
3c60: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
3c70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
3c80: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
3c90: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
3ca0: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
3cb0: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
3cc0: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
3cd0: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
3ce0: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
3cf0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
3d00: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
3d10: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
3d20: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3d30: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
3d40: 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74     IdList *pList
3d50: 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e   = pRight->pUsin
3d60: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
3d70: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
3d80: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
3d90: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
3da0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65  * Name of the te
3db0: 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  rm in the USING 
3dc0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
3dd0: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
3de0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74     /* Table on t
3df0: 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74  he left with mat
3e00: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
3e10: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3e20: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a   iLeftCol;    /*
3e30: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3e40: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
3e50: 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  n on the left */
3e60: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69  .        int iRi
3e70: 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c  ghtCol;   /* Col
3e80: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3e90: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3ea0: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20   the right */.. 
3eb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
3ec0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
3ed0: 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74  ;.        iRight
3ee0: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
3ef0: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
3f00: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
3f10: 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20   iRightCol<0.   
3f20: 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41        || !tableA
3f30: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  ndColumnIndex(pS
3f40: 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20  rc, i+1, zName, 
3f50: 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f  &iLeft, &iLeftCo
3f60: 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  l).        ){.  
3f70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3f80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3f90: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
3fa0: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
3fb0: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
3fc0: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
3fd0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
3fe0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
3ff0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4010: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
4020: 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  rse, pSrc, iLeft
4030: 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c  , iLeftCol, i+1,
4040: 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20   iRightCol,.    
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
4070: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
4080: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4090: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n 0;.}../* Forwa
40a0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
40b0: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
40c0: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
40d0: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
40e0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
40f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
4100: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
4110: 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d  ist,     /* Form
4120: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
4130: 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78  ect from this Ex
4140: 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  prList */.  int 
4150: 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
4160: 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74   /* Begin with t
4170: 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c  his column of pL
4180: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
4190: 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tra           /*
41a0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65   Add this many e
41b0: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  xtra columns to 
41c0: 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f  the end */.);../
41d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
41e0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
41f0: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4200: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4210: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4220: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4230: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4240: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4250: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4260: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4270: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4280: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4290: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
42a0: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
42b0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
42c0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
42d0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
42e0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
42f0: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4300: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4310: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4320: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4330: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4340: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4350: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4360: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4370: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4380: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4390: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
43a0: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
43b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
43c0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
43d0: 65 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a  e data array */.
43e0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
43f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
4400: 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20  of reg prior to 
4410: 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c  regData availabl
4420: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a  e for use */.){.
4430: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4440: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72     /* Stmt under
4470: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
4480: 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28  .  int bSeq = ((
4490: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
44a0: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
44b0: 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e  orter)==0);.  in
44c0: 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d  t nExpr = pSort-
44d0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
44e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
44f0: 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42  * No. of ORDER B
4500: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  Y terms */.  int
4510: 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b   nBase = nExpr +
4520: 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20   bSeq + nData;  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4540: 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65   Fields in sorte
4550: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4560: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4590: 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65  * Regs for sorte
45a0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
45b0: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b  t regRecord = ++
45c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
45e0: 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74  * Assembled sort
45f0: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4600: 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72  nt nOBSat = pSor
4610: 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20  t->nOBSat;      
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
4640: 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69  s to skip */.  i
4650: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61    /* Opcode to a
4680: 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  dd sorter record
4690: 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20   to sorter */.  
46a0: 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20  int iLimit;     
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46c0: 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e     /* LIMIT coun
46d0: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
46e0: 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65  ( bSeq==0 || bSe
46f0: 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q==1 );.  assert
4700: 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65  ( nData==1 || re
4710: 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61  gData==regOrigDa
4720: 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74  ta || regOrigDat
4730: 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 50  a==0 );.  if( nP
4740: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
4750: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
4760: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
4770: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
4780: 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20  regData - nExpr 
4790: 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b  - bSeq;.  }else{
47a0: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
47b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
47c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
47d0: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
47e0: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
47f0: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
4800: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4810: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
4820: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
4830: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
4840: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
4850: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
4860: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
4870: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4880: 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74  abel(v);.  sqlit
4890: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
48a0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
48b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
48c0: 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61  ase, regOrigData
48d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
48f0: 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72  TE_ECEL_DUP | (r
4900: 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49  egOrigData? SQLI
4910: 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29  TE_ECEL_REF : 0)
4920: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
4930: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4940: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
4950: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
4960: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
4970: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
4980: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
4990: 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20  && nData>0 ){.  
49a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
49b0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
49c0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
49d0: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
49e0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
49f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4a00: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
4a10: 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61  Base+nOBSat, nBa
4a20: 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52 65  se-nOBSat, regRe
4a30: 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42  cord);.  if( nOB
4a40: 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Sat>0 ){.    int
4a50: 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f   regPrevKey;   /
4a60: 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53  * The first nOBS
4a70: 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  at columns of th
4a80: 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  e previous row *
4a90: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46 69  /.    int addrFi
4aa0: 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65  rst;    /* Addre
4ab0: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e  ss of the OP_IfN
4ac0: 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  ot opcode */.   
4ad0: 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20   int addrJmp;   
4ae0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
4af0: 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63   the OP_Jump opc
4b00: 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f  ode */.    VdbeO
4b10: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20  p *pOp;      /* 
4b20: 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e  Opcode that open
4b30: 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  s the sorter */.
4b40: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20      int nKey;   
4b50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4b60: 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63  of sorting key c
4b70: 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e  olumns, includin
4b80: 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f  g OP_Sequence */
4b90: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
4ba0: 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  I;     /* Origin
4bb0: 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68  al KeyInfo on th
4bc0: 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a  e sorter table *
4bd0: 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65  /..    regPrevKe
4be0: 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  y = pParse->nMem
4bf0: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
4c00: 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e  nMem += pSort->n
4c10: 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20  OBSat;.    nKey 
4c20: 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  = nExpr - pSort-
4c30: 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a  >nOBSat + bSeq;.
4c40: 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a      if( bSeq ){.
4c50: 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20        addrFirst 
4c60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4c70: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
4c80: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
4c90: 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20   .    }else{.   
4ca0: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
4cb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4cc0: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54  (v, OP_SequenceT
4cd0: 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  est, pSort->iECu
4ce0: 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rsor);.    }.   
4cf0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4d00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4d10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4d20: 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65  mpare, regPrevKe
4d30: 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72  y, regBase, pSor
4d40: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
4d50: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
4d60: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
4d70: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
4d80: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
4d90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4da0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
4db0: 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b  pOp->p2 = nKey +
4dc0: 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20   nData;.    pKI 
4dd0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
4de0: 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  fo;.    memset(p
4df0: 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  KI->aSortOrder, 
4e00: 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  0, pKI->nKeyFiel
4e10: 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f  d); /* Makes OP_
4e20: 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f  Jump testable */
4e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4e40: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
4e50: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
4e60: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
4e70: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c  tcase( pKI->nAll
4e80: 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65  Field > pKI->nKe
4e90: 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20  yField+2 );.    
4ea0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
4eb0: 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
4ec0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
4ed0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Sort->pOrderBy, 
4ee0: 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20 20  nOBSat,.        
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c     pKI->nAllFiel
4f20: 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  d-pKI->nKeyField
4f30: 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70  -1);.    addrJmp
4f40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
4f50: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
4f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f70: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
4f80: 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64  addrJmp+1, 0, ad
4f90: 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f  drJmp+1); VdbeCo
4fa0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70  verage(v);.    p
4fb0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
4fc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4fd0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
4fe0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
4ff0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
5000: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
5010: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
5020: 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67  osub, pSort->reg
5030: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c  Return, pSort->l
5040: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
5050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5060: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
5070: 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ter, pSort->iECu
5080: 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69  rsor);.    if( i
5090: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73  Limit ){.      s
50a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
50b0: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c  (v, OP_IfNot, iL
50c0: 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  imit, pSort->lab
50d0: 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56  elDone);.      V
50e0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
50f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5100: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
5110: 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20   addrFirst);.   
5120: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5130: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
5140: 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79  Base, regPrevKey
5150: 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29  , pSort->nOBSat)
5160: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5170: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5180: 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rJmp);.  }.  if(
5190: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
51a0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
51b0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70  Sorter ){.    op
51c0: 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65   = OP_SorterInse
51d0: 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rt;.  }else{.   
51e0: 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65   op = OP_IdxInse
51f0: 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rt;.  }.  sqlite
5200: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5210: 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43  , op, pSort->iEC
5220: 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64  ursor, regRecord
5230: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5240: 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65           regBase
5250: 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e  +nOBSat, nBase-n
5260: 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69 4c  OBSat);.  if( iL
5270: 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  imit ){.    int 
5280: 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72 31  addr;.    int r1
5290: 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69 6c   = 0;.    /* Fil
52a0: 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e 74  l the sorter unt
52b0: 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 4c  il it contains L
52c0: 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74 72  IMIT+OFFSET entr
52d0: 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d 69  ies.  (The iLimi
52e0: 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65  t.    ** registe
52f0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
5300: 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20 4c   with value of L
5310: 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20 41  IMIT+OFFSET.)  A
5320: 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72 0a  fter the sorter.
5330: 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70 2c      ** fills up,
5340: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61 73   delete the leas
5350: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  t entry in the s
5360: 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63 68  orter after each
5370: 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a 20   insert..    ** 
5380: 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68 6f  Thus we never ho
5390: 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  ld more than the
53a0: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72 6f   LIMIT+OFFSET ro
53b0: 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74 20  ws in memory at 
53c0: 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64 72  once */.    addr
53d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
53e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
53f0: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56  Zero, iLimit); V
5400: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5410: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5420: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
5430: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
5440: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72  r);.    if( pSor
5450: 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  t->bOrderedInner
5460: 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72 31  Loop ){.      r1
5470: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
5480: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
5490: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
54a0: 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d 3e  _Column, pSort->
54b0: 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72 2c  iECursor, nExpr,
54c0: 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
54d0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 71  Comment((v, "seq
54e0: 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  "));.    }.    s
54f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5500: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
5510: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
5520: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
5530: 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
5540: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  p ){.      /* If
5550: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5560: 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e 20  is driven by an 
5570: 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74 20  index such that 
5580: 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20 20  values from.    
5590: 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 74    ** the same it
55a0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  eration of the i
55b0: 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69 6e  nner loop are in
55c0: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 74   sorted order, t
55d0: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  hen.      ** imm
55e0: 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74 6f  ediately jump to
55f0: 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
5600: 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72 20  ion of an inner 
5610: 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20 20  loop if the.    
5620: 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d 20    ** entry from 
5630: 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65 72  the current iter
5640: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 66  ation does not f
5650: 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70 0a  it into the top.
5660: 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b 4f        ** LIMIT+O
5670: 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f 66  FFSET entries of
5680: 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a   the sorter. */.
5690: 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20 3d        int iBrk =
56a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
56b0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a  entAddr(v) + 2;.
56c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
56d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
56e0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2c  , regBase+nExpr,
56f0: 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20   iBrk, r1);.    
5700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5710: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
5720: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
5730: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5740: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5750: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
5760: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   addr);.  }.}../
5770: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
5780: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
5790: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
57a0: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
57b0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
57c0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
57d0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
57e0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  VM */.  int iOff
57f0: 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67  set,      /* Reg
5800: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
5810: 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72  e offset counter
5820: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
5830: 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue     /* Jump 
5840: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
5850: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
5860: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66  */.){.  if( iOff
5870: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  set>0 ){.    sql
5880: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5890: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
58a0: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  set, iContinue, 
58b0: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
58c0: 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  (v);.    VdbeCom
58d0: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
58e0: 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  "));.  }.}../*.*
58f0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
5900: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
5910: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
5920: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
5930: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
5940: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
5950: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
5960: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
5970: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
5980: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
5990: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
59a0: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
59b0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
59c0: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
59d0: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
59e0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
59f0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
5a00: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
5a10: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
5a20: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
5a30: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
5a40: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
5a50: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
5a60: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
5a70: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
5a80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5a90: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
5aa0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5ab0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5ac0: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
5ad0: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
5ae0: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
5af0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
5b00: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
5b10: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
5b20: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
5b30: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
5b40: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
5b50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5b60: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
5b70: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
5b80: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
5b90: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
5ba0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
5bb0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
5bc0: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
5bd0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5be0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
5bf0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5c00: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
5c10: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
5c20: 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65  em, N); VdbeCove
5c30: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
5c40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5c50: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
5c60: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
5c70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5c80: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
5c90: 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69  ert, iTab, r1, i
5ca0: 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74  Mem, N);.  sqlit
5cb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
5cc0: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
5cd0: 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
5ce0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
5cf0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
5d00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5d10: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
5d20: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
5d30: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
5d40: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
5d50: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
5d60: 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74   srcTab is negat
5d70: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 2d  ive, then the p-
5d80: 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69  >pEList expressi
5d90: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
5da0: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
5db0: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
5dc0: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
5dd0: 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72  srcTab is.** zer
5de0: 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20  o or more, then 
5df0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
5e00: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
5e10: 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  ->pEList is used
5e20: 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74   only .** to get
5e30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
5e40: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 63  olumns and the c
5e50: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
5e60: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
5e70: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
5e80: 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  d selectInnerLoo
5e90: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
5ea0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
5eb0: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
5ec0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
5ed0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
5ee0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
5ef0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
5f00: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
5f10: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
5f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
5f30: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
5f40: 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65   table if non-ne
5f50: 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72 74  gative */.  Sort
5f60: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
5f70: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
5f80: 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20  LL, info on how 
5f90: 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52  to process ORDER
5fa0: 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63   BY */.  Distinc
5fb0: 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c  tCtx *pDistinct,
5fc0: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
5fd0: 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   info on how to 
5fe0: 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54  process DISTINCT
5ff0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
6000: 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
6010: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
6020: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
6030: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
6040: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
6050: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
6060: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
6070: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
6080: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
6090: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
60a0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
60b0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29   inner loop */.)
60c0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
60d0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
60e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
60f0: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
6100: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6110: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
6120: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
6130: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  /.  int eDest = 
6140: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20  pDest->eDest;   
6150: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
6160: 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a  e of results */.
6170: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
6180: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a  est->iSDParm; /*
6190: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
61a0: 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  to disposal meth
61b0: 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73  od */.  int nRes
61c0: 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  ultCol;         
61d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
61e0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
61f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
6200: 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
6210: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
6220: 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62 65  tra registers be
6230: 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20 2a  fore regResult *
6240: 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c  /..  /* Usually,
6250: 20 72 65 67 52 65 73 75 6c 74 20 69 73 20 74 68   regResult is th
6260: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20  e first cell in 
6270: 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f  an array of memo
6280: 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f  ry cells.  ** co
6290: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
62a0: 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e  rent result row.
62b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65   In this case re
62c0: 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20  gOrig is set to 
62d0: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61  the.  ** same va
62e0: 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  lue. However, if
62f0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
6300: 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74   being sent to t
6310: 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20  he sorter, the. 
6320: 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61   ** values for a
6330: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ny expressions t
6340: 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72  hat are also par
6350: 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65  t of the sort-ke
6360: 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20  y are omitted.  
6370: 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72  ** from this arr
6380: 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ay. In this case
6390: 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20   regOrig is set 
63a0: 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69  to zero.  */.  i
63b0: 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20  nt regResult;   
63c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
63d0: 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f  art of memory ho
63e0: 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65  lding current re
63f0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72  sults */.  int r
6400: 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20  egOrig;         
6410: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
6420: 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e  of memory holdin
6430: 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f  g full result (o
6440: 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72  r 0) */..  asser
6450: 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74  t( v );.  assert
6460: 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
6470: 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  ;.  hasDistinct 
6480: 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44  = pDistinct ? pD
6490: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
64a0: 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49  pe : WHERE_DISTI
64b0: 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20  NCT_NOOP;.  if( 
64c0: 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e  pSort && pSort->
64d0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53  pOrderBy==0 ) pS
64e0: 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ort = 0;.  if( p
64f0: 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44  Sort==0 && !hasD
6500: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61  istinct ){.    a
6510: 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65  ssert( iContinue
6520: 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f  !=0 );.    codeO
6530: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
6540: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
6550: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
6560: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
6570: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52  lumns..  */.  nR
6580: 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45  esultCol = p->pE
6590: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
65a0: 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
65b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
65c0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  Sort ){.      nP
65d0: 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74  refixReg = pSort
65e0: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
65f0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70  r;.      if( !(p
6600: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
6610: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
6620: 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52  rter) ) nPrefixR
6630: 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  eg++;.      pPar
6640: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65  se->nMem += nPre
6650: 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  fixReg;.    }.  
6660: 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
6670: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
6680: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
6690: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
66a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65  .  }else if( pDe
66b0: 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c  st->iSdst+nResul
66c0: 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e  tCol > pParse->n
66d0: 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Mem ){.    /* Th
66e0: 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63  is is an error c
66f0: 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61  ondition that ca
6700: 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78  n result, for ex
6710: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45  ample, when a SE
6720: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  LECT.    ** on t
6730: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
6740: 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20  de of an INSERT 
6750: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65  contains more re
6760: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
6770: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61  n.    ** there a
6780: 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  re columns in th
6790: 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  e table on the l
67a0: 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20  eft.  The error 
67b0: 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20  will be caught. 
67c0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74     ** and report
67d0: 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77  ed later.  But w
67e0: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
67f0: 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72  ure enough memor
6800: 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20  y is allocated. 
6810: 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f     ** to avoid o
6820: 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72  ther spurious er
6830: 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e  rors in the mean
6840: 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  time. */.    pPa
6850: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
6860: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70  sultCol;.  }.  p
6870: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52  Dest->nSdst = nR
6880: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f  esultCol;.  regO
6890: 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20  rig = regResult 
68a0: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
68b0: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
68c0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
68d0: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
68e0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
68f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6900: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
6910: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
6920: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
6930: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
6940: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ->pEList->a[i].z
6950: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
6960: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21  }else if( eDest!
6970: 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20  =SRT_Exists ){. 
6980: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
6990: 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45  tination is an E
69a0: 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65  XISTS(...) expre
69b0: 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61  ssion, the actua
69c0: 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  l.    ** values 
69d0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
69e0: 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72  SELECT are not r
69f0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
6a00: 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73      u8 ecelFlags
6a10: 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d  ;.    if( eDest=
6a20: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
6a30: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
6a40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
6a50: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65  utine ){.      e
6a60: 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  celFlags = SQLIT
6a70: 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20  E_ECEL_DUP;.    
6a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65  }else{.      ece
6a90: 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  lFlags = 0;.    
6aa0: 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  }.    if( pSort 
6ab0: 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d  && hasDistinct==
6ac0: 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f  0 && eDest!=SRT_
6ad0: 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65 73  EphemTab && eDes
6ae0: 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a  t!=SRT_Table ){.
6af0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63        /* For eac
6b00: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
6b10: 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20 69  p->pEList that i
6b20: 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65  s a copy of an e
6b30: 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20  xpression in.   
6b40: 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20     ** the ORDER 
6b50: 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74  BY clause (pSort
6b60: 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74  ->pOrderBy), set
6b70: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
6b80: 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72  .      ** iOrder
6b90: 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f  ByCol value to o
6ba0: 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  ne more than the
6bb0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52   index of the OR
6bc0: 44 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a  DER BY .      **
6bd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
6be0: 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  in the sort-key 
6bf0: 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72  that pushOntoSor
6c00: 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72  ter() will gener
6c10: 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ate..      ** Th
6c20: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 2d  is allows the p-
6c30: 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74 6f  >pEList field to
6c40: 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   be omitted from
6c50: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 63 6f   the sorted reco
6c60: 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76  rd,.      ** sav
6c70: 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43 50  ing space and CP
6c80: 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20  U cycles.  */.  
6c90: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d      ecelFlags |=
6ca0: 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d   (SQLITE_ECEL_OM
6cb0: 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43 45  ITREF|SQLITE_ECE
6cc0: 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20 20 66 6f  L_REF);.      fo
6cd0: 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r(i=pSort->nOBSa
6ce0: 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64  t; i<pSort->pOrd
6cf0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
6d00: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
6d10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6a  ;.        if( (j
6d20: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
6d30: 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
6d40: 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20  derByCol)>0 ){. 
6d50: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
6d60: 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69  st->a[j-1].u.x.i
6d70: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b 31  OrderByCol = i+1
6d80: 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a  -pSort->nOBSat;.
6d90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6da0: 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69 67 20  }.      regOrig 
6db0: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
6dc0: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  t( eDest==SRT_Se
6dd0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
6de0: 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20 20  Mem .           
6df0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6e00: 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74  routine || eDest
6e10: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
6e20: 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73 75 6c      }.    nResul
6e30: 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  tCol = sqlite3Ex
6e40: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
6e50: 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73 74 2c  Parse,p->pEList,
6e60: 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20  regResult,.     
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e90: 20 20 20 20 30 2c 65 63 65 6c 46 6c 61 67 73 29      0,ecelFlags)
6ea0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6eb0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
6ec0: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
6ed0: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
6ee0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
6ef0: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
6f00: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
6f10: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
6f20: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
6f30: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
6f40: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
6f50: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
6f60: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
6f70: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
6f80: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6f90: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
6fa0: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
6fb0: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
6fc0: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
6fd0: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
6fe0: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
6ff0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7000: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
7010: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
7020: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
7030: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
7040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
7050: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
7060: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
7070: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
7080: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
7090: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
70a0: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
70b0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
70c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
70d0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
70e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
70f0: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
7100: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
7110: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
7120: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
7130: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
7140: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
7150: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
7160: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
7170: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
7180: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
7190: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
71a0: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
71b0: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
71c0: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
71d0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
71e0: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
71f0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
7200: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
7210: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
7220: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7230: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
7240: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
7250: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
7260: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
7270: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
7280: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
7290: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
72a0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
72b0: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
72c0: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
72d0: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
72e0: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
72f0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
7300: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
7310: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
7320: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
7330: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
7340: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
7350: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
7360: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
7370: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
7380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
7390: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
73a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
73b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
73c0: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
73d0: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
73e0: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
73f0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
7400: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
7410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7430: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
7440: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
7450: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
7460: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
7470: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7480: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
7490: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
74a0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
74b0: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
74c0: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
74d0: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
74e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
74f0: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
7500: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
7510: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7520: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
7530: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
7540: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
7550: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
7560: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7570: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7580: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
7590: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
75a0: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
75b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
75c0: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
75d0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
75e0: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
75f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
7600: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
7610: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
7620: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7630: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
7640: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
7650: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
7660: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
7670: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
7680: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
7690: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
76a0: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
76b0: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
76c0: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
76d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
76e0: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
76f0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
7700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7710: 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30      if( pSort==0
7720: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
7730: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
7740: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
7750: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
7760: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
7770: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
7780: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
7790: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
77a0: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
77b0: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
77c0: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
77d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
77e0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
77f0: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
7800: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
7810: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
7820: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7830: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7850: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
7860: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
7870: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
7880: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
7890: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
78a0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
78b0: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67  , iParm, r1, reg
78c0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
78d0: 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ol);.      sqlit
78e0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
78f0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
7900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7910: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
7920: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
7930: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
7940: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
7950: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
7960: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
7970: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
7980: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
7990: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
79a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
79b0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
79c0: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
79d0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
79e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
79f0: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
7a00: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
7a10: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7a20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7a30: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7a40: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7a50: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
7a60: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
7a70: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
7a80: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
7a90: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7aa0: 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65  T_Fifo:.    case
7ab0: 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20   SRT_DistFifo:. 
7ac0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
7ad0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
7ae0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
7af0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
7b00: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
7b10: 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65  Parse, nPrefixRe
7b20: 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  g+1);.      test
7b30: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7b40: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
7b50: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7b60: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
7b70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7b80: 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f   eDest==SRT_Fifo
7b90: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7ba0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  se( eDest==SRT_D
7bb0: 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20  istFifo );.     
7bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7bd0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
7be0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
7bf0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e  nResultCol, r1+n
7c00: 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e  PrefixReg);.#ifn
7c10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7c20: 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65 44  CTE.      if( eD
7c30: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
7c40: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
7c50: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
7c60: 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20  on is DistFifo, 
7c70: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
7c80: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
7c90: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65        ** on an e
7ca0: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20  phemeral index. 
7cb0: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  If the current r
7cc0: 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  ow is already pr
7cd0: 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  esent.        **
7ce0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64   in the index, d
7cf0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74  o not write it t
7d00: 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66  o the output. If
7d10: 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20   not, add the.  
7d20: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
7d30: 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65   row to the inde
7d40: 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69  x and proceed wi
7d50: 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f  th writing it to
7d60: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7d70: 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73 20  output table as 
7d80: 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  well.  */.      
7d90: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
7da0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
7db0: 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20  ddr(v) + 4;.    
7dc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7dd0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
7de0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61  ound, iParm+1, a
7df0: 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ddr, r1, 0);.   
7e00: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
7e10: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
7e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7e30: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
7e40: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c  rt, iParm+1, r1,
7e50: 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c  regResult,nResul
7e60: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61  tCol);.        a
7e70: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
7e80: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
7e90: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
7ea0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
7eb0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
7ec0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31  se, pSort, p, r1
7ed0: 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67 52  +nPrefixReg,regR
7ee0: 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52  esult,1,nPrefixR
7ef0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
7f00: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
7f10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7f20: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7f50: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
7f60: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7f70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7f80: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
7f90: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
7fa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7fb0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
7fc0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
7fd0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7fe0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7ff0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
8000: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
8010: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
8020: 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52  se, r1, nPrefixR
8030: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65  eg+1);.      bre
8040: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
8050: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8060: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
8070: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
8080: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
8090: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
80a0: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
80b0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
80c0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
80d0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
80e0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
80f0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
8100: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
8110: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
8120: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
8130: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
8140: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8150: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
8160: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
8170: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
8180: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
8190: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
81a0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
81b0: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
81c0: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
81d0: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
81e0: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
81f0: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
8200: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
8210: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
8220: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
8230: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
8240: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
8250: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
8260: 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20  oSorter(.       
8270: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f       pParse, pSo
8280: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
8290: 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75  , regOrig, nResu
82a0: 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65  ltCol, nPrefixRe
82b0: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
82c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
82d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
82e0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
82f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
8300: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65  ite3Strlen30(pDe
8310: 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d 6e  st->zAffSdst)==n
8320: 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 20  ResultCol );.   
8330: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8340: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
8350: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
8360: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
8370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c  .            r1,
8380: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
8390: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
83a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
83b0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
83c0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
83d0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
83e0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
83f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
8400: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
8410: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
8420: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8430: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8440: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8450: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
8460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8470: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
8480: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
8490: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
84a0: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
84b0: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
84c0: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
84d0: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
84e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
84f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8500: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
8510: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
8520: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
8530: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
8540: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
8550: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8560: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
8570: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
8580: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
8590: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
85a0: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
85b0: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
85c0: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
85d0: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
85e0: 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20 0a  ll or array of .
85f0: 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 65      ** memory ce
8600: 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  lls and break ou
8610: 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  t of the scan lo
8620: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
8630: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
8640: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
8650: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8660: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70 44  ( nResultCol<=pD
8670: 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20  est->nSdst );.  
8680: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
8690: 72 74 65 72 28 0a 20 20 20 20 20 20 20 20 20 20  rter(.          
86a0: 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c    pParse, pSort,
86b0: 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72   p, regResult, r
86c0: 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43  egOrig, nResultC
86d0: 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b  ol, nPrefixReg);
86e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
86f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
8700: 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d  esultCol==pDest-
8710: 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20  >nSdst );.      
8720: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65 73    assert( regRes
8730: 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20  ult==iParm );.  
8740: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
8750: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
8760: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
8770: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
8780: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8790: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
87a0: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
87b0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
87c0: 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54  */..    case SRT
87d0: 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20  _Coroutine:     
87e0: 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74    /* Send data t
87f0: 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  o a co-routine *
8800: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  /.    case SRT_O
8810: 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20  utput: {        
8820: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  /* Return the re
8830: 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  sults */.      t
8840: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8850: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
8860: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8870: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8880: 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
8890: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
88a0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
88b0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
88c0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
88d0: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
88e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
88f0: 20 20 20 20 20 20 20 20 20 6e 50 72 65 66 69 78           nPrefix
8900: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
8910: 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54  e if( eDest==SRT
8920: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
8930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8940: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
8950: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
8960: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
8970: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8980: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8990: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
89a0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
89b0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
89c0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
89d0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
89e0: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
89f0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8a00: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
8a10: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
8a20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
8a30: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
8a40: 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  e results into a
8a50: 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65 20   priority queue 
8a60: 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61 63  that is order ac
8a70: 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a  cording to.    *
8a80: 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  * pDest->pOrderB
8a90: 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65  y (in pSO).  pDe
8aa0: 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20  st->iSDParm (in 
8ab0: 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63 75  iParm) is the cu
8ac0: 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20  rsor for an.    
8ad0: 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70 53  ** index with pS
8ae0: 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d  O->nExpr+2 colum
8af0: 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79  ns.  Build a key
8b00: 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74   using pSO for t
8b10: 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  he first.    ** 
8b20: 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d  pSO->nExpr colum
8b30: 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ns, then make su
8b40: 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20  re all keys are 
8b50: 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e 67  unique by adding
8b60: 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20   a.    ** final 
8b70: 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75  OP_Sequence colu
8b80: 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f  mn.  The last co
8b90: 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f  lumn is the reco
8ba0: 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20  rd as a blob..  
8bb0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8bc0: 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20  T_DistQueue:.   
8bd0: 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a   case SRT_Queue:
8be0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65   {.      int nKe
8bf0: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  y;.      int r1,
8c00: 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69   r2, r3;.      i
8c10: 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b  nt addrTest = 0;
8c20: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
8c30: 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20  *pSO;.      pSO 
8c40: 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  = pDest->pOrderB
8c50: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
8c60: 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b   pSO );.      nK
8c70: 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b  ey = pSO->nExpr;
8c80: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
8c90: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
8ca0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20  arse);.      r2 
8cb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8cc0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b  Range(pParse, nK
8cd0: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20  ey+2);.      r3 
8ce0: 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20  = r2+nKey+1;.   
8cf0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
8d00: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
8d10: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
8d20: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
8d30: 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20  DistQueue, then 
8d40: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
8d50: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
8d60: 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20   ** on a second 
8d70: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
8d80: 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76  that holds all v
8d90: 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65 76  alues every prev
8da0: 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a  iously.        *
8db0: 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 71  * added to the q
8dc0: 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ueue. */.       
8dd0: 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69   addrTest = sqli
8de0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
8df0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
8e00: 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20  arm+1, 0, .     
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e30: 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52     regResult, nR
8e40: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
8e50: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
8e60: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
8e70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8e80: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
8e90: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
8ea0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29   nResultCol, r3)
8eb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
8ec0: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
8ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8ee0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8ef0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
8f00: 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20  Parm+1, r3);.   
8f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8f20: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8f30: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
8f40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8f50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79   for(i=0; i<nKey
8f60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8f70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8f80: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20  2(v, OP_SCopy,. 
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
8fb0: 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75  lt + pSO->a[i].u
8fc0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
8fd0: 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   1,.            
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 32                r2
8ff0: 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
9000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9010: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
9020: 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e  nce, iParm, r2+n
9030: 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Key);.      sqli
9040: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9050: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
9060: 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b  r2, nKey+2, r1);
9070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9080: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
9090: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
90a0: 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65 79  rm, r1, r2, nKey
90b0: 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  +2);.      if( a
90c0: 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65  ddrTest ) sqlite
90d0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
90e0: 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20   addrTest);.    
90f0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
9100: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
9110: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
9120: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
9130: 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e  ge(pParse, r2, n
9140: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72  Key+2);.      br
9150: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
9160: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9170: 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21  _CTE */....#if !
9180: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9190: 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20  MIT_TRIGGER).   
91a0: 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
91b0: 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69  results.  This i
91c0: 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43  s used for SELEC
91d0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  T statements ins
91e0: 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  ide.    ** the b
91f0: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
9200: 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
9210: 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69  f such selects i
9220: 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  s to call.    **
9230: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
9240: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  nctions that hav
9250: 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20  e side effects. 
9260: 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   We do not care.
9270: 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65      ** about the
9280: 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20   actual results 
9290: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20  of the select.. 
92a0: 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
92b0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
92c0: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t( eDest==SRT_Di
92d0: 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62  scard );.      b
92e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
92f0: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  if.  }..  /* Jum
9300: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
9310: 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
9320: 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
9330: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20  .  Except, if.  
9340: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f  ** there is a so
9350: 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63  rter, in which c
9360: 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68  ase the sorter h
9370: 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74  as already limit
9380: 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70  ed.  ** the outp
9390: 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a  ut for us..  */.
93a0: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26    if( pSort==0 &
93b0: 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & p->iLimit ){. 
93c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
93d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
93e0: 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  umpZero, p->iLim
93f0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
9400: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
9410: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
9420: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
9430: 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20  ject sufficient 
9440: 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20  for an index of 
9450: 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e  N key columns an
9460: 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c  d.** X extra col
9470: 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  umns..*/.KeyInfo
9480: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
9490: 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64  Alloc(sqlite3 *d
94a0: 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29  b, int N, int X)
94b0: 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  {.  int nExtra =
94c0: 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43   (N+X)*(sizeof(C
94d0: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73 69  ollSeq*)+1) - si
94e0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a  zeof(CollSeq*);.
94f0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73    KeyInfo *p = s
9500: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
9510: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4b  wNN(db, sizeof(K
9520: 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72 61  eyInfo) + nExtra
9530: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
9540: 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
9550: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c  = (u8*)&p->aColl
9560: 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4b  [N+X];.    p->nK
9570: 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e  eyField = (u16)N
9580: 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69 65  ;.    p->nAllFie
9590: 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29 3b  ld = (u16)(N+X);
95a0: 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e  .    p->enc = EN
95b0: 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  C(db);.    p->db
95c0: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52   = db;.    p->nR
95d0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73  ef = 1;.    mems
95e0: 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78  et(&p[1], 0, nEx
95f0: 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tra);.  }else{. 
9600: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
9610: 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  lt(db);.  }.  re
9620: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
9630: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65   Deallocate a Ke
9640: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
9650: 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49  void sqlite3KeyI
9660: 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f  nfoUnref(KeyInfo
9670: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
9680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9690: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
96a0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
96b0: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71   p->nRef==0 ) sq
96c0: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70 2d  lite3DbFreeNN(p-
96d0: 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  >db, p);.  }.}..
96e0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77  /*.** Make a new
96f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
9700: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
9710: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
9720: 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e  KeyInfoRef(KeyIn
9730: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
9740: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9750: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
9760: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  p->nRef++;.  }. 
9770: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69   return p;.}..#i
9780: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9790: 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  G./*.** Return T
97a0: 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f  RUE if a KeyInfo
97b0: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63   object can be c
97c0: 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49  hange.  The KeyI
97d0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61  nfo object.** ca
97e0: 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65  n only be change
97f0: 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  d if this is jus
9800: 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72  t a single refer
9810: 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65  ence to the obje
9820: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ct..**.** This r
9830: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
9840: 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73  nly inside of as
9850: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
9860: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9870: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
9880: 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ble(KeyInfo *p){
9890: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d   return p->nRef=
98a0: 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =1; }.#endif /* 
98b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
98c0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
98d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
98e0: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
98f0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
9900: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
9910: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
9920: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
9930: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
9940: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9950: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
9960: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
9970: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
9980: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
9990: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
99a0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
99b0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
99c0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
99d0: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
99e0: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
99f0: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
9a00: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
9a10: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
9a20: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
9a30: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
9a40: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
9a50: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
9a60: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
9a70: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
9a80: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
9a90: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
9aa0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
9ab0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
9ac0: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
9ad0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
9ae0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
9af0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
9b00: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
9b10: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
9b20: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
9b30: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
9b40: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
9b50: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
9b60: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
9b70: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
9b80: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9b90: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9ba0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
9bb0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
9bc0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
9bd0: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
9be0: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
9bf0: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
9c00: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
9c10: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
9c20: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
9c30: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
9c40: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
9c50: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a  o the end */.){.
9c60: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
9c70: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
9c80: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9c90: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
9ca0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9cb0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
9cc0: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
9cd0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
9ce0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
9cf0: 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
9d00: 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78 74  xpr-iStart, nExt
9d10: 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49 6e  ra+1);.  if( pIn
9d20: 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  fo ){.    assert
9d30: 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
9d40: 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66  IsWriteable(pInf
9d50: 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  o) );.    for(i=
9d60: 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c  iStart, pItem=pL
9d70: 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69  ist->a+iStart; i
9d80: 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  <nExpr; i++, pIt
9d90: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 6e  em++){.      pIn
9da0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
9db0: 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rt] = sqlite3Exp
9dc0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
9dd0: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
9de0: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
9df0: 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61  SortOrder[i-iSta
9e00: 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  rt] = pItem->sor
9e10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
9e20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
9e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  ;.}../*.** Name 
9e40: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
9e50: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
9e60: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
9e70: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
9e80: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
9e90: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
9ea0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
9eb0: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
9ec0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
9ed0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
9ee0: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
9ef0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
9f00: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
9f10: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
9f20: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
9f30: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
9f40: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9f50: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
9f60: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
9f70: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
9f80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
9f90: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9fa0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
9fb0: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22  *.** Unless an "
9fc0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
9fd0: 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62  AN" command is b
9fe0: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
9ff0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
a000: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
a010: 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20  erwise, it adds 
a020: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
a030: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51  output to the EQ
a040: 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65  P result,.** whe
a050: 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69  re the caption i
a060: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
a070: 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50  *.**   "USE TEMP
a080: 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22   B-TREE FOR xxx"
a090: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78  .**.** where xxx
a0a0: 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54   is one of "DIST
a0b0: 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59  INCT", "ORDER BY
a0c0: 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e  " or "GROUP BY".
a0d0: 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a   Exactly which.*
a0e0: 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  * is determined 
a0f0: 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72  by the zUsage ar
a100: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
a110: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65  c void explainTe
a120: 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  mpTable(Parse *p
a130: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
a140: 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66  r *zUsage){.  if
a150: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
a160: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
a170: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a180: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
a190: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
a1a0: 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
a1b0: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
a1c0: 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67  E FOR %s", zUsag
a1d0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
a1e0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a1f0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
a200: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
a210: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
a220: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
a230: 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73  * Assign express
a240: 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20  ion b to lvalue 
a250: 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d  a. A second, no-
a260: 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  op, version of t
a270: 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20  his macro.** is 
a280: 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51  provided when SQ
a290: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
a2a0: 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  N is defined. Th
a2b0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  is allows the co
a2c0: 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33  de.** in sqlite3
a2d0: 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69  Select() to assi
a2e0: 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72  gn values to str
a2f0: 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61  ucture member va
a300: 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20  riables that.** 
a310: 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51  only exist if SQ
a320: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
a330: 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  N is not defined
a340: 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69   without polluti
a350: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  ng the.** code w
a360: 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65  ith #ifndef dire
a370: 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66  ctives..*/.# def
a380: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
a390: 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20  teger(a, b) a = 
a3a0: 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  b..#else./* No-o
a3b0: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
a3c0: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
a3d0: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
a3e0: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
a3f0: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
a400: 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20  e(y,z).# define 
a410: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
a420: 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23  r(y,z).#endif..#
a430: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a440: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
a450: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
a460: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
a470: 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20  D_SELECT)./*.** 
a480: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
a490: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
a4a0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
a4b0: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
a4c0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
a4d0: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
a4e0: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
a4f0: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
a500: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
a510: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
a520: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
a530: 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66  one of the two f
a540: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43  orms:.**.**   "C
a550: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
a560: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
a570: 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22  ub2 (op)".**   "
a580: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
a590: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
a5a0: 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20  Sub2 USING TEMP 
a5b0: 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a  B-TREE (op)".**.
a5c0: 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61  ** where iSub1 a
a5d0: 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65  nd iSub2 are the
a5e0: 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64   integers passed
a5f0: 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
a600: 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  nding.** functio
a610: 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e  n parameters, an
a620: 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74  d op is the text
a630: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
a640: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
a650: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
a660: 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65  name. The parame
a670: 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65  ter "op" must be
a680: 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   one of TK_UNION
a690: 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20  , TK_EXCEPT,.** 
a6a0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20  TK_INTERSECT or 
a6b0: 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73  TK_ALL. The firs
a6c0: 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69  t form is used i
a6d0: 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54  f argument bUseT
a6e0: 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c  mp is .** false,
a6f0: 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66   or the second f
a700: 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75  orm if it is tru
a710: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
a720: 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  d explainComposi
a730: 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  te(.  Parse *pPa
a740: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
a750: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
a760: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
a770: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
a780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a790: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
a7a0: 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a  TK_EXCEPT etc. *
a7b0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20  /.  int iSub1,  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
a7e0: 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53  id 1 */.  int iS
a7f0: 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub2,            
a800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
a810: 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20  query id 2 */.  
a820: 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20  int bUseTmp     
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d  /* True if a tem
a850: 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64  p table was used
a860: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
a870: 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c   op==TK_UNION ||
a880: 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
a890: 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
a8a0: 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  CT || op==TK_ALL
a8b0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
a8c0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
a8d0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
a8e0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
a8f0: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
a900: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20  lite3MPrintf(.  
a910: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
a920: 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51  , "COMPOUND SUBQ
a930: 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64  UERIES %d AND %d
a940: 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c   %s(%s)", iSub1,
a950: 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20   iSub2,.        
a960: 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54  bUseTmp?"USING T
a970: 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c  EMP B-TREE ":"",
a980: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70   selectOpName(op
a990: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ).    );.    sql
a9a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
a9b0: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
a9c0: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
a9d0: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
a9e0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
a9f0: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
aa00: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
aa10: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
aa20: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
aa30: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
aa40: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76  plainComposite(v
aa50: 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
aa60: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
aa70: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
aa80: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
aa90: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
aaa0: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
aab0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
aac0: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
aad0: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
aae0: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
aaf0: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
ab00: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
ab10: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
ab20: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
ab30: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
ab40: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
ab50: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
ab60: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
ab70: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
ab80: 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50  ateSortTail(.  P
ab90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
aba0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
abb0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
abc0: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
abd0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
abe0: 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  nt */.  SortCtx 
abf0: 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66  *pSort,   /* Inf
ac00: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20  ormation on the 
ac10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ac20: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
ac30: 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ,      /* Number
ac40: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
ac50: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
ac60: 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72  est *pDest /* Wr
ac70: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
ac80: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
ac90: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
aca0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
acd0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
ace0: 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20  int addrBreak = 
acf0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65  pSort->labelDone
ad00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
ad10: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69  Jump here to exi
ad20: 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  t loop */.  int 
ad30: 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73  addrContinue = s
ad40: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ad50: 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70  bel(v);  /* Jump
ad60: 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63   here for next c
ad70: 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ycle */.  int ad
ad80: 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e  dr;.  int addrOn
ad90: 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  ce = 0;.  int iT
ada0: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
adb0: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74  pOrderBy = pSort
adc0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
add0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
ade0: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
adf0: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
ae00: 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52  Parm;.  int regR
ae10: 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ow;.  int regRow
ae20: 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  id;.  int iCol;.
ae30: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e    int nKey;.  in
ae40: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae60: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
ae70: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
ae80: 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20   int nSortData; 
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c   /* Trailing val
aeb0: 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ues to read from
aec0: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74   sorter */.  int
aed0: 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20   i;.  int bSeq; 
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
af00: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69   sorter record i
af10: 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e  ncludes seq. no.
af20: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
af30: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74  rList_item *aOut
af40: 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Ex = p->pEList->
af50: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64  a;..  assert( ad
af60: 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69  drBreak<0 );.  i
af70: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
af80: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  kOut ){.    sqli
af90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
afa0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
afb0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
afc0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
afd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
afe0: 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61  Goto(v, addrBrea
aff0: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
b000: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b010: 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  v, pSort->labelB
b020: 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61  kOut);.  }.  iTa
b030: 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  b = pSort->iECur
b040: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
b050: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
b060: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
b070: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
b080: 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  RT_Mem ){.    re
b090: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  gRowid = 0;.    
b0a0: 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e  regRow = pDest->
b0b0: 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74  iSdst;.    nSort
b0c0: 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  Data = nColumn;.
b0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
b0e0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
b0f0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
b100: 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  );.    regRow = 
b110: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
b120: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
b130: 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44  umn);.    nSortD
b140: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
b150: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
b160: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
b170: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
b180: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
b190: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
b1a0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
b1b0: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
b1c0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
b1d0: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
b1e0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
b1f0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
b200: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
b210: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
b220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
b230: 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
b240: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b250: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b260: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b270: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72  OpenPseudo, iSor
b280: 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  tTab, regSortOut
b290: 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61  , nKey+1+nSortDa
b2a0: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  ta);.    if( add
b2b0: 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56  rOnce ) sqlite3V
b2c0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b2d0: 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64  ddrOnce);.    ad
b2e0: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
b2f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b300: 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61  _SorterSort, iTa
b310: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
b320: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
b330: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
b340: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
b350: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
b360: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b370: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
b380: 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72  terData, iTab, r
b390: 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74  egSortOut, iSort
b3a0: 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d  Tab);.    bSeq =
b3b0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
b3c0: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
b3d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b3e0: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
b3f0: 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
b400: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b410: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
b420: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
b430: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53  ontinue);.    iS
b440: 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ortTab = iTab;. 
b450: 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d     bSeq = 1;.  }
b460: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c  .  for(i=0, iCol
b470: 3d 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c 6e 53  =nKey+bSeq; i<nS
b480: 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20  ortData; i++){. 
b490: 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20     int iRead;.  
b4a0: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
b4b0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
b4c0: 29 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d  ){.      iRead =
b4d0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
b4e0: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
b4f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b500: 52 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b 0a 20  Read = iCol++;. 
b510: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b520: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b530: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
b540: 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77  b, iRead, regRow
b550: 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  +i);.    VdbeCom
b560: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61  ment((v, "%s", a
b570: 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f  OutEx[i].zName ?
b580: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
b590: 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70   : aOutEx[i].zSp
b5a0: 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  an));.  }.  swit
b5b0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
b5c0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
b5d0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
b5e0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
b5f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b600: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
b610: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
b620: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
b630: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b640: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
b650: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
b660: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
b670: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
b680: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
b690: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b6a0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
b6b0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b6c0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
b6d0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
b6e0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69  t( nColumn==sqli
b6f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73  te3Strlen30(pDes
b700: 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a  t->zAffSdst) );.
b710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b720: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
b730: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
b740: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f  , nColumn, regRo
b750: 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
b760: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
b770: 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43  st->zAffSdst, nC
b780: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71  olumn);.      sq
b790: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
b7a0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
b7b0: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
b7c0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
b7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b7e0: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
b7f0: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
b800: 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  id, regRow, nCol
b810: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
b820: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b830: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
b840: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
b850: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
b860: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
b870: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
b880: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b890: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
b8a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b8b0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
b8c0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
b8d0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
b8e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
b8f0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
b900: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b910: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
b920: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
b930: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b940: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
b950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b960: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
b970: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  Row, pDest->iSds
b980: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
b990: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b9a0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
b9b0: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73  nge(pParse, pDes
b9c0: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
b9d0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
b9e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b9f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ba00: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
ba10: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
ba20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ba30: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65    }.  }.  if( re
ba40: 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66  gRowid ){.    if
ba50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  ( eDest==SRT_Set
ba60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ba70: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
ba80: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
ba90: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
baa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
bab0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
bac0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
bad0: 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  w);.    }.    sq
bae0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
baf0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
bb00: 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  owid);.  }.  /* 
bb10: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
bb20: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
bb30: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
bb40: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
bb50: 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53  tinue);.  if( pS
bb60: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
bb70: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
bb80: 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
bb90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bba0: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
bbb0: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
bbc0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
bbd0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
bbe0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bbf0: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
bc00: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
bc10: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
bc20: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
bc30: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
bc40: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
bc50: 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  n, pSort->regRet
bc60: 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  urn);.  sqlite3V
bc70: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
bc80: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d  v, addrBreak);.}
bc90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
bca0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
bcb0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
bcc0: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
bcd0: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
bce0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
bcf0: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
bd00: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
bd10: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
bd20: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  ller..**.** Also
bd30: 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
bd40: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
bd50: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
bd60: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a  and return that.
bd70: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45  ** result in *pE
bd80: 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54  stWidth..**.** T
bd90: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
bda0: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
bdb0: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
bdc0: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
bdd0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
bde0: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
bdf0: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
be00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
be10: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
be20: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
be30: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
be40: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
be50: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
be60: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
be70: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
be80: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
be90: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
bea0: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
beb0: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
bec0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
bed0: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
bee0: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
bef0: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
bf00: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
bf10: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
bf20: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
bf30: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
bf40: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
bf50: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
bf60: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
bf70: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
bf80: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
bf90: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
bfa0: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
bfb0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
bfc0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
bfd0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
bfe0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
bff0: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
c000: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
c010: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65  is routine has e
c020: 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72  ither 3 or 6 par
c030: 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e  ameters dependin
c040: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
c050: 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  not.** the SQLIT
c060: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c070: 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65  METADATA compile
c080: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
c090: 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  used..*/.#ifdef 
c0a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c0b0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20  LUMN_METADATA.# 
c0c0: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
c0d0: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
c0e0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
c0f0: 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f 2a 20  C,D,E).#else /* 
c100: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c110: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c120: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
c130: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
c140: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
c150: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 29  umnTypeImpl(A,B)
c160: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
c170: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
c180: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
c190: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
c1a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
c1b0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c1c0: 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a 70 45  ADATA.  Expr *pE
c1d0: 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78 70 72  xpr.#else.  Expr
c1e0: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
c1f0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
c200: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
c210: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
c220: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
c230: 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b 0a 20  gCol.#endif.){. 
c240: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
c250: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
c260: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c270: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c280: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
c290: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
c2a0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
c2b0: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
c2c0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
c2d0: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
c2e0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
c2f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
c300: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
c310: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
c320: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
c330: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
c340: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
c350: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
c360: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
c370: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
c380: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
c390: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
c3a0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
c3b0: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
c3c0: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
c3d0: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
c3e0: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
c3f0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
c400: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
c410: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
c420: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c430: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
c440: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
c450: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
c460: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
c470: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
c480: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
c490: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
c4a0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
c4b0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
c4c0: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
c4d0: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
c4e0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
c4f0: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74   pTab */.      t
c500: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
c510: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
c520: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
c530: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
c540: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
c550: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
c560: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
c570: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
c580: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
c590: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
c5a0: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
c5b0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
c5c0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
c5d0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
c5e0: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
c5f0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
c600: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
c610: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
c620: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
c630: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
c640: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
c650: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
c660: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
c670: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
c680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
c690: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
c6a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
c6b0: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
c6c0: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
c6d0: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
c6e0: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
c6f0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
c700: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
c710: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
c720: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
c730: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
c740: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
c750: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
c760: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
c770: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
c780: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
c790: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
c7a0: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
c7b0: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
c7c0: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
c7d0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
c7e0: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
c7f0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
c800: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
c810: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
c820: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
c830: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
c840: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
c850: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c860: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
c870: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
c880: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
c890: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
c8a0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
c8b0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
c8c0: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
c8d0: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
c8e0: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
c8f0: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
c900: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
c910: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
c920: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
c930: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
c940: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
c950: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
c960: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
c970: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
c980: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
c990: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
c9a0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
c9b0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
c9c0: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
c9d0: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
c9e0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
c9f0: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
ca00: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
ca10: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
ca20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ca30: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
ca40: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
ca50: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
ca60: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
ca70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
ca80: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
ca90: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
caa0: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
cab0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
cac0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
cad0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
cae0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
caf0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
cb00: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
cb10: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
cb20: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
cb30: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
cb40: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
cb50: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
cb60: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e  >=0 && iCol<pS->
cb70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
cb80: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
cb90: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
cba0: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
cbb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
cbc0: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
cbd0: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
cbe0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
cbf0: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
cc00: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
cc10: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
cc20: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
cc30: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
cc40: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
cc50: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
cc60: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e    */.          N
cc70: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
cc80: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
cc90: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
cca0: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20  a[iCol].pExpr;. 
ccb0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72           sNC.pSr
ccc0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
ccd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
cce0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
ccf0: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
cd00: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
cd10: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
cd20: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
cd30: 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26  NC, p,&zOrigDb,&
cd40: 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43  zOrigTab,&zOrigC
cd50: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ol); .        }.
cd60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cd70: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
cd80: 61 62 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61  able or a CTE ta
cd90: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
cda0: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69  ssert( !pS );.#i
cdb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cdc0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
cdd0: 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  TA.        if( i
cde0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
cdf0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
ce00: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
ce10: 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69  ==XN_ROWID || (i
ce20: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
ce30: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
ce40: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
ce50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
ce60: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
ce70: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
ce80: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
ce90: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
cea0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
ceb0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
cec0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
ced0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c       zType = sql
cee0: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26  ite3ColumnType(&
cef0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cf00: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ,0);.        }. 
cf10: 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20         zOrigTab 
cf20: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
cf30: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
cf40: 70 50 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e  pParse && pTab->
cf50: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
cf60: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
cf70: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
cf80: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
cf90: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
cfa0: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
cfb0: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
cfc0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
cfd0: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
cfe0: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
cff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
d000: 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28  l==XN_ROWID || (
d010: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
d020: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
d030: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
d040: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
d050: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
d060: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d070: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
d080: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
d090: 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c  Type(&pTab->aCol
d0a0: 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20  [iCol],0);.     
d0b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d0c0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d0d0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
d0e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
d0f0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
d100: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
d110: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
d120: 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  n is a sub-selec
d130: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
d140: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
d150: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67  nd.      ** orig
d160: 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20  in info for the 
d170: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e  single column in
d180: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d190: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
d1a0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
d1b0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d1c0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
d1d0: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
d1e0: 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  pS = pExpr->x.pS
d1f0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
d200: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
d210: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
d220: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
d230: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
d240: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
d250: 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ) );.      sNC.p
d260: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
d270: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
d280: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
d290: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
d2a0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
d2b0: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
d2c0: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
d2d0: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
d2e0: 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20  , &zOrigCol); . 
d2f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d300: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
d310: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d320: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
d330: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
d340: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
d350: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
d360: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
d370: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
d380: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
d390: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
d3a0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
d3b0: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
d3c0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
d3d0: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
d3e0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
d3f0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
d400: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
d410: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
d420: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
d430: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
d440: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
d450: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
d460: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d470: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
d480: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
d490: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
d4a0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
d4b0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
d4c0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
d4d0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
d4e0: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
d4f0: 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  set */.){.#ifnde
d500: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
d510: 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76  CLTYPE.  Vdbe *v
d520: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d530: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
d540: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
d550: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
d560: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
d570: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
d580: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b    sNC.pNext = 0;
d590: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
d5a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
d5b0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
d5c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
d5d0: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
d5e0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64  har *zType;.#ifd
d5f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d600: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d610: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d620: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
d630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
d640: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
d650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
d660: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54  gCol = 0;.    zT
d670: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
d680: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
d690: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
d6a0: 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20  zOrigCol);..    
d6b0: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
d6c0: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
d6d0: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
d6e0: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
d6f0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
d700: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
d710: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
d720: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
d730: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
d740: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
d750: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
d760: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
d770: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d780: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
d790: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
d7a0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
d7b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d7c0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d7d0: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
d7e0: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
d7f0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d800: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d810: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d820: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
d830: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
d840: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
d850: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d860: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d870: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
d880: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d890: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d8a0: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
d8b0: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
d8c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
d8d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
d8e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d8f0: 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a  DECLTYPE) */.}..
d900: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
d910: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d920: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
d930: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
d940: 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
d950: 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
d960: 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
d970: 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
d980: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
d990: 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
d9a0: 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
d9b0: 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
d9c0: 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
d9d0: 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
d9e0: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
d9f0: 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
da00: 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
da10: 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
da20: 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
da30: 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
da40: 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
da50: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
da60: 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
da70: 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
da80: 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
da90: 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
daa0: 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
dab0: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
dac0: 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
dad0: 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
dae0: 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
daf0: 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73  *.** See Also: s
db00: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
db10: 6d 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a  mExprList().**.*
db20: 2a 20 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f  * The PRAGMA sho
db30: 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20  rt_column_names 
db40: 61 6e 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f  and PRAGMA full_
db50: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74  column_names set
db60: 74 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70  tings are.** dep
db70: 72 65 63 61 74 65 64 2e 20 20 54 68 65 20 64 65  recated.  The de
db80: 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73  fault setting is
db90: 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d   short=ON, full=
dba0: 4f 46 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61  OFF.  99.9% of a
dbb0: 6c 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ll.** applicatio
dbc0: 6e 73 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74  ns should operat
dbd0: 65 20 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76  e this way.  Nev
dbe0: 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65  ertheless, we ne
dbf0: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68  ed to support th
dc00: 65 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73  e.** other modes
dc10: 20 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a   for legacy:.**.
dc20: 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c  **    short=OFF,
dc30: 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
dc40: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74  Column name is t
dc50: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 65  he text of the e
dc60: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74  xpression has it
dc70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65   originally appe
dca0: 61 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ars in the SELEC
dcb0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  T statement.  In
dcc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
dcf0: 65 20 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72  e zSpan of the r
dd00: 65 73 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e  esult expression
dd10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  ..**.**    short
dd20: 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20  =ON, full=OFF:  
dd30: 20 20 20 20 20 28 54 68 69 73 20 69 73 20 74 68       (This is th
dd40: 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
dd50: 67 29 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  g).  If the resu
dd60: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 72 65 66 65 72 73 20 64 69 72 65 63 74     refers direct
dd90: 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f  ly to a table co
dda0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a  lumn, then the.*
ddb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
ddd0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
dde0: 65 20 69 73 20 6a 75 73 74 20 74 68 65 20 74 61  e is just the ta
ddf0: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20  ble column.**   
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a             name:
de20: 20 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77   COLUMN.  Otherw
de30: 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
de40: 2a 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c  *.**    full=ON,
de50: 20 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20   short=ANY:     
de60: 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
de70: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
de80: 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  to a table colum
de90: 6e 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n,.**           
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 74 68 65 6e 20 74 68 65 20 72 65 73 75     then the resu
dec0: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  lt column name w
ded0: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
dee0: 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  me.**           
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54     prefix, ex: T
df10: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74  ABLE.COLUMN.  Ot
df20: 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70 61  herwise use zSpa
df30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
df40: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
df50: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
df60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
df70: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
df80: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
df90: 65 63 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ect     /* Gener
dfa0: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ate column names
dfb0: 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
dfc0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
dfd0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
dfe0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
dff0: 74 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t i;.  Table *pT
e000: 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
e010: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
e020: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
e030: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e040: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
e050: 75 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54  ullName;    /* T
e060: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e  ABLE.COLUMN if n
e070: 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20  o AS clause and 
e080: 69 73 20 61 20 64 69 72 65 63 74 20 74 61 62 6c  is a direct tabl
e090: 65 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73  e ref */.  int s
e0a0: 72 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43  rcName;     /* C
e0b0: 4f 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43  OLUMN or TABLE.C
e0c0: 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63  OLUMN if no AS c
e0d0: 6c 61 75 73 65 20 61 6e 64 20 69 73 20 64 69 72  lause and is dir
e0e0: 65 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ect */..#ifndef 
e0f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
e100: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
e110: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
e120: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
e130: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
e140: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
e150: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
e160: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
e170: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
e180: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e190: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20   ) return;.  /* 
e1a0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  Column names are
e1b0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
e1c0: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
e1d0: 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  m of a compound 
e1e0: 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c  select */.  whil
e1f0: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
e200: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
e210: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
e220: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65    pTabList = pSe
e230: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45  lect->pSrc;.  pE
e240: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
e250: 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
e260: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
e270: 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20  rt( pTabList!=0 
e280: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  );.  pParse->col
e290: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
e2a0: 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e  fullName = (db->
e2b0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
e2c0: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
e2d0: 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62  .  srcName = (db
e2e0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
e2f0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
e300: 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a  =0 || fullName;.
e310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e320: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
e330: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
e340: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
e350: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
e360: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
e370: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a  t->a[i].pExpr;..
e380: 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30      assert( p!=0
e390: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e3a0: 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  p->op!=TK_AGG_CO
e3b0: 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20  LUMN );  /* Agg 
e3c0: 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e  processing has n
e3d0: 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20  ot run yet */.  
e3e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
e3f0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
e400: 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43  >pTab!=0 ); /* C
e410: 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20  overing idx not 
e420: 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20  yet coded */.   
e430: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
e440: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
e450: 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65   /* An AS clause
e460: 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69   always takes fi
e470: 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a  rst priority */.
e480: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
e490: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
e4a0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
e4b0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
e4c0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
e4d0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
e4e0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
e4f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e500: 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70  srcName && p->op
e510: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
e520: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
e530: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
e540: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
e550: 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54      pTab = p->pT
e560: 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ab;.      assert
e570: 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
e580: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
e590: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
e5a0: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
e5b0: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
e5c0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
e5d0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
e5e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e5f0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
e600: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
e610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
e620: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
e630: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
e640: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e650: 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  fullName ){.    
e660: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
e670: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
e680: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
e690: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
e6a0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
e6b0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
e6c0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
e6d0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
e6e0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
e6f0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
e700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e710: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e720: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
e730: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
e740: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
e750: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
e760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
e780: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
e790: 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
e7a0: 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
e7b0: 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
e7c0: 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
e7d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
e7e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e7f0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
e800: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
e810: 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
e820: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
e830: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
e840: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
e850: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
e860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
e870: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
e880: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
e890: 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
e8a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
e8b0: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
e8c0: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
e8d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
e8e0: 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
e8f0: 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
e900: 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
e910: 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
e920: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
e930: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
e940: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
e950: 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
e960: 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
e970: 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
e980: 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
e990: 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
e9a0: 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
e9b0: 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
e9c0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
e9d0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
e9e0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
e9f0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
ea00: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
ea10: 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
ea20: 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
ea30: 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
ea40: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
ea50: 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  NOMEM..**.** The
ea60: 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20   only guarantee 
ea70: 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65  that SQLite make
ea80: 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
ea90: 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20  ames is that if 
eaa0: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61  the.** column ha
eab0: 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61  s an AS clause a
eac0: 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61  ssigning it a na
ead0: 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  me, that will be
eae0: 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a   the name used..
eaf0: 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f  ** That is the o
eb00: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67  nly documented g
eb10: 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76  uarantee.  Howev
eb20: 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70  er, countless ap
eb30: 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65  plications.** de
eb40: 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65  veloped over the
eb50: 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65   years have made
eb60: 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70   baseless assump
eb70: 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75  tions about colu
eb80: 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20  mn names.** and 
eb90: 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68  will break if th
eba0: 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ose assumptions 
ebb0: 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c  changes.  Hence,
ebc0: 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75   use extreme cau
ebd0: 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64  tion.** when mod
ebe0: 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74  ifying this rout
ebf0: 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65  ine to avoid bre
ec00: 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a  aking legacy..**
ec10: 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65  .** See Also: ge
ec20: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
ec30: 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s().*/.int sqlit
ec40: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
ec50: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
ec60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
ec70: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ec80: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
ec90: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
eca0: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
ecb0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
ecc0: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
ecd0: 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ecf0: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
ed00: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
ed10: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
ed20: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
ed30: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
ed40: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
ed50: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
ed60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ed70: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
ed80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
ed90: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
edb0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
edc0: 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20    u32 cnt;      
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ede0: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
edf0: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
ee00: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
ee10: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
ee20: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
ee30: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
ee40: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
ee50: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
ee60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ee70: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
ee80: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
ee90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
eea0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
eeb0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
eec0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
eef0: 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
ef00: 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20    Hash ht;      
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef20: 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63   Hash table of c
ef30: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
ef40: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
ef50: 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45  t(&ht);.  if( pE
ef60: 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
ef70: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
ef80: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
ef90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
efa0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
efb0: 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
efc0: 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
efd0: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
efe0: 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
eff0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  aCol = 0;.  }.  
f000: 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69  assert( nCol==(i
f010: 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e  16)nCol );.  *pn
f020: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
f030: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
f040: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
f050: 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64  ol; i<nCol && !d
f060: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
f070: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
f080: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
f090: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
f0a0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
f0b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61   */.    if( (zNa
f0c0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
f0d0: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
f0e0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
f0f0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
f100: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
f110: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
f120: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
f130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f140: 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
f150: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
f160: 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
f170: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
f180: 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45      while( pColE
f190: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
f1a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45  ){.        pColE
f1b0: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
f1c0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
f1d0: 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
f1e0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
f1f0: 20 20 20 20 20 69 66 28 20 28 70 43 6f 6c 45 78       if( (pColEx
f200: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
f210: 4e 20 7c 7c 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  N || pColExpr->o
f220: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
f230: 29 0a 20 20 20 20 20 20 20 26 26 20 70 43 6f 6c  ).       && pCol
f240: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 0a 20  Expr->pTab!=0 . 
f250: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
f260: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
f270: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
f280: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
f290: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
f2a0: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
f2b0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
f2c0: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
f2d0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
f2e0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
f2f0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
f300: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
f310: 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
f320: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
f330: 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
f340: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
f350: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
f360: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
f370: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
f380: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
f390: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
f3a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
f3b0: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
f3c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f3d0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
f3e0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
f3f0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
f400: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
f410: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
f420: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
f430: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
f440: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
f450: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
f460: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
f470: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
f480: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
f490: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
f4a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
f4b0: 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b  "column%d",i+1);
f4c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
f4d0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
f4e0: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
f4f0: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
f500: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
f510: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
f520: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
f530: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
f540: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
f550: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
f560: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
f570: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
f580: 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
f590: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
f5a0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
f5b0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
f5c0: 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
f5d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
f5e0: 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
f5f0: 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
f600: 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
f610: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
f620: 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
f630: 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
f640: 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
f650: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
f660: 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
f670: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
f680: 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
f690: 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
f6a0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
f6b0: 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
f6c0: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
f6d0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
f6e0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
f6f0: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
f700: 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
f710: 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
f720: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
f730: 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
f740: 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
f750: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
f760: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
f770: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
f780: 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
f790: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
f7a0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
f7b0: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
f7c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f7d0: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
f7e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f7f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
f800: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
f810: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
f820: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
f830: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
f840: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
f850: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f860: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
f870: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
f880: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
f890: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
f8a0: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
f8b0: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
f8c0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
f8d0: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
f8e0: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
f8f0: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
f900: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
f910: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
f920: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
f930: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
f940: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
f950: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
f960: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
f970: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
f980: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f990: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
f9a0: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
f9b0: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
f9c0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
f9d0: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
f9e0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
f9f0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
fa00: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
fa10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
fa20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
fa30: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
fa40: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
fa50: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
fa60: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
fa70: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
fa80: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
fa90: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
faa0: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
fab0: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
fac0: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
fad0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fae0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
faf0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
fb00: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
fb10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
fb20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
fb30: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
fb40: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
fb50: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
fb60: 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
fb70: 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
fb80: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
fb90: 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
fba0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
fbb0: 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
fbc0: 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
fbd0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
fbe0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
fbf0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
fc00: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
fc10: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
fc20: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
fc30: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
fc40: 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
fc50: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
fc60: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
fc70: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
fc80: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
fc90: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
fca0: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74   *zType;.    int
fcb0: 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61   n, m;.    p = a
fcc0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a  [i].pExpr;.    z
fcd0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
fce0: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
fcf0: 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43 6f 6c   0);.    /* pCol
fd00: 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20 2f 2f  ->szEst = ... //
fd10: 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65 73 74   Column size est
fd20: 20 66 6f 72 20 53 45 4c 45 43 54 20 74 61 62 6c   for SELECT tabl
fd30: 65 73 20 6e 65 76 65 72 20 75 73 65 64 20 2a 2f  es never used */
fd40: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
fd50: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
fd60: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
fd70: 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20    if( zType ){. 
fd80: 20 20 20 20 20 6d 20 3d 20 73 71 6c 69 74 65 33       m = sqlite3
fd90: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
fda0: 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
fdb0: 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d  e3Strlen30(pCol-
fdc0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
fdd0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Col->zName = sql
fde0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
fdf0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
fe00: 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20  ame, n+m+2);.   
fe10: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61     if( pCol->zNa
fe20: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  me ){.        me
fe30: 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d  mcpy(&pCol->zNam
fe40: 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d  e[n+1], zType, m
fe50: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  +1);.        pCo
fe60: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
fe70: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
fe80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fe90: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
fea0: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
feb0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
fec0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
fed0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
fee0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
fef0: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
ff00: 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43  Coll && pCol->zC
ff10: 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
ff20: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
ff30: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ff40: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
ff50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
ff60: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b  b->szTabRow = 1;
ff70: 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f   /* Any non-zero
ff80: 20 76 61 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a   value works */.
ff90: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
ffa0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ffb0: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
ffc0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
ffd0: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
ffe0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
fff0: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
10000 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
10010 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
10020 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
10030 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
10040 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
10050 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10060 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10070 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
10080 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
10090 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
100a0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
100b0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
100c0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
100d0 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
100e0 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
100f0 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
10100 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
10110 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
10120 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
10130 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
10140 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
10150 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
10160 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
10170 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
10180 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
10190 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
101a0 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
101b0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
101c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
101d0 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
101e0 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
101f0 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
10200 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
10210 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
10220 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
10230 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
10240 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
10250 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54  le );.  pTab->nT
10260 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  abRef = 1;.  pTa
10270 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
10280 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
10290 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
102a0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
102b0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
102c0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
102d0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
102e0 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
102f0 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
10300 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
10310 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
10320 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
10330 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
10340 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
10350 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
10360 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
10370 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
10380 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
10390 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
103a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
103b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
103c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
103d0 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
103e0 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
103f0 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
10400 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
10410 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
10420 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10430 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
10440 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
10450 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
10460 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
10470 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
10480 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  if( pParse->pVdb
10490 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
104a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
104b0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
104c0 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
104d0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
104e0 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
104f0 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  db,SQLITE_Factor
10500 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20  OutConst).  ){. 
10510 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e     pParse->okCon
10520 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20  stFactor = 1;.  
10530 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
10540 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
10550 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rse);.}.../*.** 
10560 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
10570 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
10580 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
10590 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
105a0 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
105b0 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
105c0 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
105d0 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
105e0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
105f0 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
10600 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
10610 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
10620 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
10630 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
10640 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
10650 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
10660 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
10670 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
10680 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
10690 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
106a0 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
106b0 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
106c0 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
106d0 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
106e0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
106f0 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
10700 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
10710 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
10720 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
10730 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10740 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
10750 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
10760 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
10770 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
10780 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
10790 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
107a0 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
107b0 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
107c0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
107d0 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
107e0 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
107f0 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a  values (zero).**
10800 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
10810 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
10820 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65  **.** The iOffse
10830 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69  t register (if i
10840 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69  t exists) is ini
10850 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
10860 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
10870 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69  OFFSET.  The iLi
10880 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20  mit register is 
10890 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
108a0 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a  IMIT.  Register.
108b0 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20  ** iOffset+1 is 
108c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
108d0 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a  IMIT+OFFSET..**.
108e0 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
108f0 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
10900 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
10910 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
10920 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
10930 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
10940 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
10950 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
10960 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
10970 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
10980 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
10990 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
109a0 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
109b0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
109c0 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
109d0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
109e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
109f0 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
10a00 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
10a10 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
10a20 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
10a30 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
10a40 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
10a50 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a   return;..  /* .
10a60 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
10a70 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
10a80 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
10a90 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
10aa0 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  oversy about wha
10ab0 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
10ac0 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
10ad0 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
10ae0 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
10af0 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
10b00 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
10b10 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
10b20 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
10b30 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
10b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
10b50 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d  pOffset==0 || p-
10b60 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >pLimit!=0 );.  
10b70 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
10b80 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
10b90 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
10ba0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
10bb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10bc0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
10bd0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
10be0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
10bf0 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
10c00 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  imit, &n) ){.   
10c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10c20 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
10c30 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a  er, n, iLimit);.
10c40 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
10c50 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
10c60 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69  nter"));.      i
10c70 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
10c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
10c90 74 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  to(v, iBreak);. 
10ca0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
10cb0 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  >=0 && p->nSelec
10cc0 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45  tRow>sqlite3LogE
10cd0 73 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20  st((u64)n) ){.  
10ce0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
10cf0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
10d00 45 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20  Est((u64)n);.   
10d10 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
10d20 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69   |= SF_FixedLimi
10d30 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
10d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
10d50 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10d60 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69  se, p->pLimit, i
10d70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
10d80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10d90 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
10da0 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
10db0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
10dc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10dd0 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
10de0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
10df0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10e00 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c  P_IfNot, iLimit,
10e10 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
10e20 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
10e30 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
10e40 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
10e50 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
10e60 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
10e70 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
10e80 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
10e90 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
10ea0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
10eb0 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
10ec0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10ed0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
10ee0 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
10ef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10f00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10f10 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
10f20 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
10f30 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
10f40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
10f50 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
10f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10f70 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
10f80 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  fsetLimit, iLimi
10f90 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f  t, iOffset+1, iO
10fa0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
10fb0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
10fc0 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
10fd0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
10fe0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10ff0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
11000 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11010 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
11020 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11030 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
11040 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
11050 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
11060 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
11070 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
11080 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
11090 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
110a0 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
110b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
110c0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
110d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
110e0 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
110f0 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
11100 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
11110 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
11120 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
11130 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
11140 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
11150 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
11160 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
11170 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11180 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
11190 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
111a0 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
111b0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
111c0 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
111d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
111e0 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
111f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11200 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
11210 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
11220 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74  ;.  /* iCol must
11230 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d   be less than p-
11240 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20  >pEList->nExpr. 
11250 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   Otherwise an er
11260 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68  ror would.  ** h
11270 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20  ave been thrown 
11280 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f  during name reso
11290 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f  lution and we wo
112a0 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74  uld not have got
112b0 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ten.  ** this fa
112c0 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d  r */.  if( pRet=
112d0 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
112e0 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
112f0 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20  pr) ){.    pRet 
11300 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
11310 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
11320 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
11330 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
11340 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
11350 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
11360 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
11370 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
11380 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
11390 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
113a0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
113b0 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
113c0 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
113d0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
113e0 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
113f0 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
11400 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
11410 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
11420 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
11430 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
11440 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
11450 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
11460 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
11470 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
11480 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
11490 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
114a0 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
114b0 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
114c0 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
114d0 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
114e0 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
114f0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
11500 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
11510 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
11520 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
11530 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
11540 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
11550 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
11560 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11570 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
11580 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
11590 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
115a0 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
115b0 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
115c0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
115d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
115e0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
115f0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
11600 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
11610 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
11620 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
11630 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
11640 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
11650 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
11660 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
11670 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
11680 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
11690 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
116a0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
116b0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
116c0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
116d0 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
116e0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
116f0 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
11700 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
11710 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
11720 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
11730 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
11740 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
11750 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
11760 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
11770 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
11780 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
11790 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
117a0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
117b0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
117c0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
117d0 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
117e0 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
117f0 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
11800 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
11810 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11820 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
11830 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
11840 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
11850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
11860 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11870 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
11880 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
11890 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
118a0 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
118b0 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
118c0 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
118d0 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
118e0 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
118f0 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
11900 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
11910 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
11930 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
11940 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
11950 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
119a0 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
119b0 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
119c0 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
119d0 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
119e0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
119f0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
11a00 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
11a10 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67   SrcList->a[].fg
11a20 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
11a30 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
11a40 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
11a50 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
11a60 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
11a70 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
11a80 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
11a90 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
11aa0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
11ab0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
11ac0 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
11ad0 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
11ae0 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
11af0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
11b00 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
11b10 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
11b20 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
11b30 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
11b40 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
11b50 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
11b60 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
11b70 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
11b80 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
11b90 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
11ba0 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
11bb0 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
11bc0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
11bd0 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
11be0 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
11bf0 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
11c00 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
11c10 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
11c20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
11c30 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
11c40 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
11c50 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
11c60 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
11c70 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
11c80 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
11c90 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
11ca0 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
11cb0 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
11cc0 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
11cd0 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
11ce0 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
11cf0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
11d00 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
11d10 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
11d20 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
11d30 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
11d40 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
11d50 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
11d60 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
11d70 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
11d80 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
11d90 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
11da0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
11db0 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
11dc0 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
11dd0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
11de0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
11df0 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
11e00 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
11e10 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
11e20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
11e30 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
11e40 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
11e50 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
11e60 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
11e70 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
11e80 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
11e90 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
11ea0 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
11eb0 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
11ec0 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
11ed0 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
11ee0 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
11ef0 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
11f00 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
11f10 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
11f20 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
11f30 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
11f40 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
11f50 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
11f60 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
11f70 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
11f80 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
11f90 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
11fa0 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
11fb0 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
11fc0 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
11fd0 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
11fe0 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
11ff0 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
12000 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
12010 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12020 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12030 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12050 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
12060 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
12070 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
12080 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
12090 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
120a0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
120b0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
120c0 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
120d0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
120e0 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
120f0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
12100 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
12110 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
12120 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
12130 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
12140 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
12150 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
12160 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
12170 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
12180 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
12190 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
121a0 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
121b0 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
121c0 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
121d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
12200 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
12210 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
12220 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
12230 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
12240 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
12250 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
12260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12270 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
12280 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
12290 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
122a0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
122b0 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
122c0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
122d0 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
122e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
122f0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
12300 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
12310 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
12320 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
12330 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
12340 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
12350 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
12360 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
12370 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
12380 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
12390 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
123a0 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
123b0 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
123c0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
123d0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
123f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
12400 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12430 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
12440 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
12450 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
12460 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
12470 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
12480 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
12490 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
124a0 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
124b0 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
124c0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
124d0 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
124e0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
124f0 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
12500 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
12510 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20   do a recursive 
12520 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73  query */.  if( s
12530 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12540 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
12550 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20  ECURSIVE, 0, 0, 
12560 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
12570 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c  /* Process the L
12580 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
12590 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79  clauses, if they
125a0 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72   exist */.  addr
125b0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
125c0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
125d0 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
125e0 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69   = 320;  /* 4 bi
125f0 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20  llion rows */.  
12600 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
12610 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
12620 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
12630 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
12640 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70  t;.  pOffset = p
12650 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67  ->pOffset;.  reg
12660 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
12670 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d  t;.  regOffset =
12680 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
12690 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f  ->pLimit = p->pO
126a0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ffset = 0;.  p->
126b0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
126c0 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
126d0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
126e0 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
126f0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
12700 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
12710 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
12720 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
12730 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
12740 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
12750 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  [i].fg.isRecursi
12760 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
12770 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
12780 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
12790 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
127a0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
127b0 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
127c0 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
127d0 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
127e0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
127f0 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
12800 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
12810 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
12820 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
12830 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
12840 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
12850 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
12860 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
12870 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
12880 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
12890 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
128a0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
128b0 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
128c0 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
128d0 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
128e0 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
128f0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
12900 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
12910 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
12920 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
12930 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
12940 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
12950 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
12960 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
12970 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
12980 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
12990 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
129a0 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
129b0 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
129c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
129d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
129e0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
129f0 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
12a00 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
12a10 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
12a20 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
12a30 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
12a40 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
12a50 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
12a60 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
12a70 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12a80 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
12a90 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
12aa0 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
12ad0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
12ae0 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
12af0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
12b00 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
12b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b20 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
12b30 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
12b40 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
12b50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
12b60 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
12b70 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
12b80 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
12b90 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
12ba0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12bb0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
12bc0 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
12bd0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
12be0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
12bf0 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
12c00 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
12c10 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
12c20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
12c30 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
12c40 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
12c50 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
12c60 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
12c70 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
12c80 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
12c90 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  t = 0;.  rc = sq
12ca0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12cb0 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
12cc0 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
12cd0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
12ce0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
12cf0 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
12d00 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
12d10 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
12d20 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
12d30 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
12d40 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
12d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12d60 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
12d70 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
12d80 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12d90 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
12da0 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
12db0 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
12dc0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
12dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12de0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
12df0 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
12e00 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
12e10 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
12e20 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
12e30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12e40 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
12e50 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
12e60 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
12e70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12e80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e90 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
12ea0 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
12eb0 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
12ec0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12ed0 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
12ee0 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
12ef0 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
12f00 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
12f10 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
12f20 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12f30 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
12f40 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
12f50 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
12f60 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
12f70 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74  rse, p, iCurrent
12f80 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
12f90 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
12fa0 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
12fb0 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
12fc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12fd0 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
12fe0 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
12ff0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
13000 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13010 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13020 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
13030 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
13040 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
13050 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
13060 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
13070 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
13080 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
13090 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
130a0 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
130b0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
130c0 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
130d0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
130e0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
130f0 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
13100 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13110 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
13120 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
13130 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
13140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
13150 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
13160 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13170 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75  arse, p, &destQu
13180 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  eue);.    assert
13190 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
131a0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
131b0 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20  = pSetup;.  }.. 
131c0 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67   /* Keep running
131d0 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20   the loop until 
131e0 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70  the Queue is emp
131f0 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ty */.  sqlite3V
13200 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54  dbeGoto(v, addrT
13210 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  op);.  sqlite3Vd
13220 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13230 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65  , addrBreak);..e
13240 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
13250 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33  query:.  sqlite3
13260 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
13270 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f  Parse->db, p->pO
13280 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f  rderBy);.  p->pO
13290 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
132a0 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  y;.  p->pLimit =
132b0 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f   pLimit;.  p->pO
132c0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
132d0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
132e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
132f0 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f  IT_CTE */../* Fo
13300 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
13310 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
13320 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
13330 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
13340 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
13350 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13360 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
13370 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13380 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
13390 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
133a0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
133b0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
133c0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
133d0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
133e0 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c  .);../*.** Handl
133f0 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  e the special ca
13400 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  se of a compound
13410 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69  -select that ori
13420 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a  ginates from a.*
13430 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  * VALUES clause.
13440 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68    By handling th
13450 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  is as a special 
13460 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64  case, we avoid d
13470 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e  eep.** recursion
13480 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f  , and thus do no
13490 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63  t need to enforc
134a0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  e the SQLITE_LIM
134b0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
134c0 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45  CT.** on a VALUE
134d0 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  S clause..**.** 
134e0 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65  Because the Sele
134f0 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e  ct object origin
13500 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55  ates from a VALU
13510 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20  ES clause:.**   
13520 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49  (1) It has no LI
13530 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a  MIT or OFFSET.**
13540 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73     (2) All terms
13550 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a   are UNION ALL.*
13560 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73  *   (3) There is
13570 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
13580 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  use.*/.static in
13590 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c  t multiSelectVal
135a0 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ues(.  Parse *pP
135b0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
135c0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
135d0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
135e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
135f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
13600 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
13610 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
13620 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
13630 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
13640 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
13650 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
13660 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52  pPrior;.  int nR
13670 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63  ow = 1;.  int rc
13680 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
13690 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
136a0 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20  _MultiValue );. 
136b0 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28   do{.    assert(
136c0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
136d0 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20  F_Values );.    
136e0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
136f0 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d  K_ALL || (p->op=
13700 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d  =TK_SELECT && p-
13710 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20  >pPrior==0) );. 
13720 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
13730 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  imit==0 );.    a
13740 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
13750 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t==0 );.    asse
13760 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
13770 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
13780 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70  xpr==p->pNext->p
13790 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
137a0 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f      if( p->pPrio
137b0 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
137c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
137d0 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b  ior->pNext==p );
137e0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
137f0 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a  or;.    nRow++;.
13800 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77    }while(1);.  w
13810 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70  hile( p ){.    p
13820 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
13830 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  r;.    p->pPrior
13840 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
13850 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13860 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
13870 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13880 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20  pPrior;.    if( 
13890 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
138a0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
138b0 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d  nRow;.    p = p-
138c0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
138d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
138e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
138f0 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
13900 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
13910 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
13920 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
13930 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
13940 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
13950 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
13960 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
13970 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
13980 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
13990 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
139a0 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
139b0 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
139c0 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
139d0 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
139e0 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
139f0 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
13a00 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
13a10 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
13a20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
13a30 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
13a40 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
13a50 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
13a60 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
13a70 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
13a80 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
13a90 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
13aa0 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
13ab0 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
13ac0 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
13ad0 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
13ae0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
13af0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
13b00 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
13b10 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
13b20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
13b30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
13b40 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
13b50 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
13b60 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
13b70 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
13b80 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
13b90 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
13ba0 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
13bb0 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
13bd0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
13be0 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
13bf0 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
13c00 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
13c10 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
13c20 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
13c30 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
13c40 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
13c50 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
13c60 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
13c70 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
13c80 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
13c90 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
13ca0 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
13cb0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
13cc0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
13cd0 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
13ce0 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
13cf0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
13d00 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
13d10 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
13d20 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
13d30 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
13d40 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
13d50 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
13d60 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
13d70 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
13d80 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
13d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13da0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
13db0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
13dc0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
13dd0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13de0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
13df0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13e00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
13e10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
13e20 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
13e30 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
13e40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
13e50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
13e60 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
13e70 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
13e80 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
13e90 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
13ea0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13eb0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
13ec0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
13ed0 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
13ee0 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
13ef0 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
13f00 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
13f10 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
13f20 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
13f30 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
13f40 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
13f50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
13f60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23   connection */.#
13f70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13f80 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
13f90 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20   iSub1 = 0;     
13fa0 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
13fb0 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
13fc0 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d  */.  int iSub2 =
13fd0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
13fe0 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
13ff0 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
14000 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
14010 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
14020 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
14030 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
14040 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
14050 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
14060 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
14070 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
14080 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
14090 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
140a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
140b0 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
140c0 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
140d0 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
140e0 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61  this much */.  a
140f0 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
14100 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
14110 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d  ve)==0 || p->op=
14120 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70  =TK_ALL || p->op
14130 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
14140 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14150 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
14160 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20  Prior;.  dest = 
14170 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
14180 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c  rior->pOrderBy |
14190 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  | pPrior->pLimit
141a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
141b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
141c0 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  %s clause should
141d0 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
141e0 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
141f0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
14200 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42  By!=0 ? "ORDER B
14210 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65  Y" : "LIMIT", se
14220 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
14230 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
14240 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14250 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
14260 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14270 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14280 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
14290 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
142a0 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
142b0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
142c0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
142d0 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
142e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
142f0 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
14300 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
14310 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
14320 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
14330 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
14340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14350 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
14360 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
14370 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
14380 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65  ->nExpr);.    de
14390 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
143a0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
143b0 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  Special handling
143c0 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d   for a compound-
143d0 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
143e0 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55  inates as a VALU
143f0 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ES clause..  */.
14400 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
14410 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
14420 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  e ){.    rc = mu
14430 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
14440 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
14450 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  );.    goto mult
14460 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
14470 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
14480 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
14490 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
144a0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
144b0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
144c0 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
144d0 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
144e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
144f0 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
14500 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72  EList );.  asser
14510 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  t( p->pEList->nE
14520 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr==pPrior->pEL
14530 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23  ist->nExpr );..#
14540 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14550 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e  IT_CTE.  if( p->
14560 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
14570 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67  cursive ){.    g
14580 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
14590 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65  siveQuery(pParse
145a0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d  , p, &dest);.  }
145b0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  else.#endif..  /
145c0 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
145d0 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
145e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
145f0 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
14600 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
14610 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
14620 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
14630 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
14640 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
14650 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
14660 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
14670 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
14680 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
14690 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
146a0 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
146b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
146c0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
146d0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
146e0 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
146f0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
14700 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
14710 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
14720 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  = p->iLimit;.   
14730 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73     pPrior->iOffs
14740 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
14750 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
14760 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
14770 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
14780 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
14790 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70  ffset;.      exp
147a0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
147b0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
147c0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
147d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
147e0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
147f0 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
14800 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
14810 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66   0;.      p->pOf
14820 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
14830 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14840 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
14850 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
14860 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14870 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
14880 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
14890 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  iLimit;.      p-
148a0 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
148b0 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
148c0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
148d0 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  ){.        addr 
148e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
148f0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
14900 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62   p->iLimit); Vdb
14910 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14920 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
14930 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61  t((v, "Jump ahea
14940 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
14950 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ed"));.        i
14960 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b  f( p->iOffset ){
14970 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14980 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14990 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a  OP_OffsetLimit,.
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149b0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
149c0 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65  Limit, p->iOffse
149d0 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  t+1, p->iOffset)
149e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
149f0 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69    }.      explai
14a00 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14a10 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
14a20 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14a40 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
14a50 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
14a60 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
14a70 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
14a80 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14a90 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14aa0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14ab0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
14ac0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
14ad0 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
14ae0 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
14af0 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66  ctRow);.      if
14b00 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
14b10 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
14b20 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
14b30 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20  pPrior->pLimit, 
14b40 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
14b50 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70  && nLimit>0 && p
14b60 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73  ->nSelectRow > s
14b70 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
14b80 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20  4)nLimit) .     
14b90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
14ba0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
14bb0 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
14bc0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
14bd0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
14be0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14bf0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14c00 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
14c10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14c20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
14c30 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
14c40 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
14c50 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
14c60 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
14c70 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
14c80 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
14c90 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
14ca0 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
14cb0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
14cc0 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
14cd0 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
14ce0 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
14cf0 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
14d00 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
14d10 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
14d20 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
14d30 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
14d40 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
14d50 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
14d60 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
14d70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
14d80 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
14d90 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
14da0 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
14db0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
14dc0 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20  =TK_EXCEPT );.  
14dd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
14de0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
14df0 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
14e00 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
14e10 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
14e20 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  ==priorOp ){.   
14e30 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
14e40 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
14e50 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
14e60 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
14e70 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
14e80 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
14e90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14ea0 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
14eb0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c        /* Not all
14ec0 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
14ed0 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
14ee0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14ef0 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
14f00 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
14f10 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
14f20 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
14f30 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74   unionTab = dest
14f40 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
14f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
14f60 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
14f70 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
14f80 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14f90 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
14fa0 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
14fb0 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
14fc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14fd0 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
14fe0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
14ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15000 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
15010 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
15020 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15030 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
15040 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
15050 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15060 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
15070 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
15080 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
15090 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
150a0 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67  .        findRig
150b0 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
150c0 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
150d0 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
150e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
150f0 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
15100 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
15110 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15120 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
15130 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
15140 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
15150 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
15160 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
15170 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73  stInit(&uniondes
15180 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  t, priorOp, unio
15190 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70  nTab);.      exp
151a0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
151b0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
151c0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
151d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
151e0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
151f0 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
15200 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
15210 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
15220 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
15230 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
15240 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
15250 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
15260 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
15270 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
15280 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
15290 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
152a0 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
152b0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
152c0 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
152d0 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
152e0 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
152f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
15300 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15310 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
15320 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
15330 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
15340 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
15350 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
15360 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
15370 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
15380 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65  st = op;.      e
15390 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
153a0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
153b0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
153c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
153d0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
153e0 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
153f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15400 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15410 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79  ;.      /* Query
15420 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
15430 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
15440 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
15450 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a  OrderBy..      *
15460 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
15470 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
15480 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
15490 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
154a0 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ak. */.      sql
154b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
154c0 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
154d0 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  By);.      pDele
154e0 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
154f0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
15500 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
15510 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
15520 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
15530 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
15540 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
15550 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
15560 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
15570 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
15580 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
15590 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
155a0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
155b0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
155c0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
155d0 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
155e0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
155f0 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
15600 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
15610 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20  Offset = 0;..   
15620 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
15630 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
15640 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
15650 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
15660 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
15670 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
15680 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
15690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
156a0 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53  nionTab==dest.iS
156b0 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  DParm || dest.eD
156c0 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
156d0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
156e0 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
156f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
15700 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
15710 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
15720 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
15730 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
15740 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15750 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
15760 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
15770 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15780 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
15790 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
157a0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
157b0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
157c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
157d0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
157e0 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
157f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15800 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
15810 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15820 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
15830 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
15840 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
15850 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20   unionTab,.     
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
15880 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
15890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
158a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
158b0 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
158c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
158d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
158e0 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
158f0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
15900 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
15910 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15920 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
15930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15940 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15950 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
15960 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
15970 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15980 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
15990 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
159a0 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20  INTERSECT ); {. 
159b0 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
159c0 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
159d0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
159e0 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
159f0 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
15a00 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  et;.      int ad
15a10 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
15a20 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65  Dest intersectde
15a30 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  st;.      int r1
15a40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
15a50 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
15a60 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
15a70 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
15a80 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
15a90 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
15aa0 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
15ab0 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
15ac0 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
15ad0 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
15ae0 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
15af0 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
15b00 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
15b10 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
15b20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
15b30 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
15b40 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
15b50 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rBy==0 );..     
15b60 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15b70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b80 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
15b90 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
15ba0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
15bb0 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
15bc0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
15bd0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
15be0 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69  dr;.      findRi
15bf0 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
15c00 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
15c10 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
15c20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15c30 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
15c40 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
15c50 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
15c60 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15c70 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
15c80 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
15c90 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
15ca0 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
15cb0 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
15cc0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
15cd0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
15ce0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
15cf0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
15d00 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
15d10 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
15d20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
15d30 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
15d40 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
15d50 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
15d60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
15d70 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
15d80 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
15d90 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
15da0 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
15db0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
15dc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15dd0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
15de0 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
15df0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
15e00 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
15e10 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
15e20 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
15e30 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
15e40 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
15e50 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
15e60 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
15e70 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
15e80 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
15e90 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
15ea0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
15eb0 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
15ec0 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
15ed0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
15ee0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
15ef0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
15f00 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
15f10 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
15f20 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
15f30 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
15f40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
15f50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
15f60 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
15f70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
15f80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
15f90 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
15fa0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
15fb0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
15fc0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
15fd0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
15fe0 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
15ff0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
16000 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
16010 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
16020 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
16030 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
16040 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
16050 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
16060 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
16070 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
16080 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
16090 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
160a0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
160b0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
160c0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
160d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
160e0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
160f0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
16100 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16110 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
16120 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
16130 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
16140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16150 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
16160 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
16170 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16180 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
16190 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
161a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
161b0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
161c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
161d0 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
161e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
161f0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
16200 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
16210 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20  ab2, iCont, r1, 
16220 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
16230 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
16240 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16250 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
16260 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
16270 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74  oop(pParse, p, t
16280 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ab1,.           
16290 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
162a0 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
162b0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
162c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
162d0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
162e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
162f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16300 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
16310 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
16320 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
16330 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16340 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
16350 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16360 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
16370 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
16380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16390 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
163a0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
163b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
163c0 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f    }..  explainCo
163d0 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
163e0 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
163f0 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41  ub2, p->op!=TK_A
16400 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  LL);..  /* Compu
16410 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
16420 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
16430 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
16440 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
16450 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
16460 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
16470 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
16480 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
16490 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
164a0 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
164b0 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
164c0 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
164d0 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
164e0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
164f0 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
16500 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
16510 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
16520 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
16530 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
16540 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
16550 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
16560 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
16570 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
16580 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
16590 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
165a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
165b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
165c0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
165d0 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
16600 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
16610 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
16620 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
16630 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
16640 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
16650 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
16660 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
16670 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
16680 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
16690 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
166a0 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
166b0 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
166c0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
166d0 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
166e0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
166f0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
16720 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
16730 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
16740 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
16750 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
16760 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
16770 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
16780 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
16790 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29  loc(db, nCol, 1)
167a0 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
167b0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
167c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
167d0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
167e0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
167f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
16800 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
16810 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
16820 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
16830 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
16840 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
16850 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
16860 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
16870 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
16880 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
16890 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
168a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
168b0 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
168c0 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
168d0 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
168e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
168f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
16900 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
16910 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
16920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
16930 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
16940 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
16950 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
16960 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
16970 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
16980 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
16990 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
169a0 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
169b0 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
169c0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
169d0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
169e0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
169f0 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
16a00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16a10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16a20 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
16a30 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
16a40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16a50 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
16a60 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
16a70 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
16a80 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
16ab0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
16ac0 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
16ad0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
16ae0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
16af0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
16b00 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
16b10 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
16b20 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
16b30 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
16b40 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
16b50 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
16b60 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
16b70 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
16b80 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
16b90 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
16ba0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
16bb0 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d  /../*.** Error m
16bc0 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20  essage for when 
16bd0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
16be0 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  s of a compound 
16bf0 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66  select have diff
16c00 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65  erent.** size re
16c10 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f  sult sets..*/.vo
16c20 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
16c30 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
16c40 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
16c50 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
16c60 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16c70 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
16c80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16c90 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20  sg(pParse, "all 
16ca0 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65  VALUES must have
16cb0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
16cc0 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d   of terms");.  }
16cd0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
16ce0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16cf0 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
16d00 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
16d10 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
16d20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
16d30 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
16d40 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
16d50 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
16d60 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  op));.  }.}../*.
16d70 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
16d80 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
16d90 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
16da0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
16db0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
16dc0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
16dd0 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
16de0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
16df0 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68   pIn->iSdst.  Th
16e00 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e  ere are.** pIn->
16e10 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  nSdst columns to
16e20 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
16e30 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
16e40 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
16e50 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
16e60 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
16e70 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
16e80 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
16e90 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
16ea0 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
16eb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
16ec0 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
16ed0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
16ee0 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
16ef0 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
16f00 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
16f10 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
16f20 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
16f30 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
16f40 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
16f50 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
16f60 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
16f70 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
16f80 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
16f90 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
16fa0 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
16fb0 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
16fc0 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
16fd0 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
16fe0 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
16ff0 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
17000 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
17010 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
17020 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
17030 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
17040 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
17050 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
17060 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
17070 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
17080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17090 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
170a0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
170b0 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
170c0 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
170d0 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
170e0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
170f0 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
17100 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
17110 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
17120 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
17130 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
17140 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
17150 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
17160 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
17170 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
17180 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
17190 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
171a0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
171b0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
171c0 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
171d0 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
171e0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ry */.  int iBre
171f0 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
17200 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
17210 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
17220 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
17230 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
17240 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
17250 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
17260 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
17270 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
17280 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
17290 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
172a0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
172b0 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
172c0 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
172d0 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
172e0 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
172f0 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
17300 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
17310 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  2;.    addr1 = s
17320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17330 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
17340 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65  gPrev); VdbeCove
17350 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
17360 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
17370 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
17380 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  pare, pIn->iSdst
17390 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
173a0 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20  ->nSdst,.       
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
173d0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
173e0 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
173f0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
17400 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17410 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b   OP_Jump, addr2+
17420 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64  2, iContinue, ad
17430 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65  dr2+2); VdbeCove
17440 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
17450 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
17460 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
17470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17480 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49  3(v, OP_Copy, pI
17490 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
174a0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d  v+1, pIn->nSdst-
174b0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
174c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
174d0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
174e0 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
174f0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
17500 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
17510 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
17520 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46  ess the first OF
17530 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
17540 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
17550 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
17560 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
17570 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
17580 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  inue);..  assert
17590 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  ( pDest->eDest!=
175a0 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20  SRT_Exists );.  
175b0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
175c0 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
175d0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  );.  switch( pDe
175e0 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
175f0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
17600 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
17610 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
17620 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
17630 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
17640 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
17650 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17660 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17670 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
17680 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
17690 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
176a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
176b0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
176c0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
176d0 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
176e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
176f0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
17700 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
17710 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
17720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17730 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
17740 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
17750 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
17760 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
17770 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
17780 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
17790 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
177a0 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
177b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
177c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
177d0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
177e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
177f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
17800 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
17810 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
17820 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
17830 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
17840 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  ...)"..    */.  
17850 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
17860 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
17870 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17880 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a  pIn->nSdst>1 );.
17890 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
178a0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
178b0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
178c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
178d0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
178e0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
178f0 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20  >nSdst, .       
17900 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41     r1, pDest->zA
17910 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  ffSdst, pIn->nSd
17920 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
17930 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
17940 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
17950 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
17960 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17980 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
17990 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
179a0 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20  DParm, r1,.     
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74        pIn->iSdst
179d0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
179e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
179f0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17a00 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
17a10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
17a20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
17a30 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
17a40 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
17a50 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
17a60 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
17a70 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
17a80 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
17a90 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
17aa0 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
17ab0 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
17ac0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
17ad0 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
17ae0 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
17af0 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73  Sdst==1 || pPars
17b00 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65  e->nErr>0 );  te
17b10 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
17b20 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  st!=1 );.      s
17b30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
17b40 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
17b50 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
17b60 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  DParm, 1);.     
17b70 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
17b80 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
17b90 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
17ba0 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
17bb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
17bc0 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
17bd0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17be0 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  RY */..    /* Th
17bf0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
17c00 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
17c10 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ce of registers.
17c20 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
17c30 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e  at pDest->iSdst.
17c40 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f    Then the co-ro
17c50 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20  utine yields..  
17c60 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
17c70 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  T_Coroutine: {. 
17c80 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e       if( pDest->
17c90 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
17ca0 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
17cb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17cc0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
17cd0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17ce0 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74      pDest->nSdst
17cf0 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20   = pIn->nSdst;. 
17d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
17d10 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
17d20 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
17d30 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  dst, pDest->iSds
17d40 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17d60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
17d70 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
17d80 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arm);.      brea
17d90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
17da0 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
17db0 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
17dc0 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69  result destinati
17dd0 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a  on must be.    *
17de0 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54  * SRT_Output.  T
17df0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
17e00 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
17e10 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a   any other.    *
17e20 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  * destination ot
17e30 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
17e40 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20  s handled above 
17e50 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20  or SRT_Output.. 
17e60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
17e70 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73   SRT_Output, res
17e80 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
17e90 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
17ea0 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20   registers.  .  
17eb0 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50    ** Then the OP
17ec0 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
17ed0 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75  e is used to cau
17ee0 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
17ef0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) to.    ** retu
17f00 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  rn the next row 
17f10 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a  of result..    *
17f20 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
17f30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17f40 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
17f50 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
17f60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17f70 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
17f80 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  ow, pIn->iSdst, 
17f90 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17fa0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17fb0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
17fc0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17fd0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17fe0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17ff0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18000 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
18010 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
18020 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
18030 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
18040 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
18050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18060 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
18070 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  pZero, p->iLimit
18080 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
18090 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
180a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
180b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
180c0 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
180d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
180e0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
180f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18100 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
18110 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
18120 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
18130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
18140 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
18150 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
18160 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
18170 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
18180 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
18190 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
181a0 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
181b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
181c0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
181d0 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
181e0 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
181f0 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
18200 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
18210 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
18220 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
18230 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
18240 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
18250 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
18260 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
18270 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
18280 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
18290 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
182a0 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
182b0 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
182c0 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
182d0 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
182e0 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
182f0 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
18300 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
18310 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
18320 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
18330 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
18340 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
18350 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
18360 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
18370 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
18380 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
18390 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
183a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
183b0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
183c0 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
183d0 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
183e0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
183f0 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
18400 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
18410 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
18420 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
18430 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
18440 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
18450 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
18460 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
18470 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
18480 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
18490 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
184a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
184b0 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
184c0 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
184d0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
184e0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
184f0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
18500 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
18510 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
18520 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
18530 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
18540 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
18550 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
18560 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
18570 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
18580 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
18590 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
185a0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
185b0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
185c0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
185d0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
185e0 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
185f0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
18600 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
18610 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
18620 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
18630 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
18640 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
18650 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
18660 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
18670 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
18680 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
18690 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
186a0 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
186b0 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
186c0 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
186d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
186e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
186f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
18700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
18710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18720 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
18730 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
18740 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
18750 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
18760 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
18770 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
18780 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
18790 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
187a0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
187b0 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
187c0 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
187d0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
187e0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
187f0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
18800 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
18810 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
18820 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
18830 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
18840 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
18850 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
18860 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
18870 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
18880 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
18890 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
188a0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
188b0 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
188c0 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
188d0 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
188e0 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
188f0 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
18900 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
18910 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
18920 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
18930 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
18940 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
18950 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
18960 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
18970 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
18980 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
18990 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
189a0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
189b0 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
189c0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
189d0 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
189e0 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
189f0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
18a00 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
18a10 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
18a20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
18a30 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
18a40 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
18a50 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
18a60 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
18a70 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
18a80 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
18a90 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
18aa0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
18ab0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
18ac0 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
18ad0 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
18ae0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
18af0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
18b00 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
18b10 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
18b20 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
18b30 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
18b40 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
18b50 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
18b60 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
18b70 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
18b80 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
18b90 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
18ba0 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
18bb0 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
18bc0 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
18bd0 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
18be0 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
18bf0 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
18c00 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
18c10 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
18c20 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
18c30 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
18c40 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
18c50 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
18c60 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
18c70 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
18c80 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
18c90 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
18ca0 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
18cb0 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
18cc0 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
18cd0 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
18ce0 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
18cf0 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
18d00 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
18d10 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
18d20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
18d30 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
18d40 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
18d50 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
18d60 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
18d70 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
18d80 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
18d90 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
18da0 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
18db0 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
18dc0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
18dd0 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
18de0 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
18df0 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
18e00 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
18e10 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
18e20 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
18e30 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
18e40 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
18e50 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
18e60 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
18e70 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
18e80 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
18e90 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
18ea0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18eb0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
18ec0 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
18ed0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
18ee0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18ef0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
18f00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18f10 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
18f20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
18f30 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
18f40 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
18f50 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
18f60 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
18f70 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
18f80 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
18f90 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
18fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18fb0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
18fc0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
18fd0 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
18fe0 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
18ff0 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
19000 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
19010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
19020 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
19030 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
19040 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
19050 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
19060 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
19070 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
19080 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
19090 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
190a0 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
190b0 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
190c0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
190d0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
190e0 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
190f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ne */.  int regA
19100 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
19110 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
19120 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
19130 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
19140 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
19150 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19160 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
19170 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
19180 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
19190 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
191a0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
191b0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
191c0 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
191d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
191e0 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
191f0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
19200 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
19210 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
19220 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
19230 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
19240 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
19250 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
19260 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
19270 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
19280 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
19290 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
192a0 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
192b0 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
192c0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
192d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
192e0 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
192f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
19300 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
19310 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
19320 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f   int addrEofA_no
19330 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  B;     /* Altern
19340 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20  ate addrEofA if 
19350 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a  B is uninitializ
19360 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
19370 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
19380 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
19390 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
193a0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
193b0 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
193c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
193d0 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
193e0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
193f0 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
19400 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
19410 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
19420 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19430 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
19440 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
19450 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
19460 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
19470 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
19480 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
19490 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
194a0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
194b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
194c0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
194d0 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
194e0 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
194f0 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
19500 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
19510 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
19520 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
19530 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
19540 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
19550 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
19560 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
19570 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
19580 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
19590 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
195a0 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
195b0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
195c0 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
195d0 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
195e0 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
195f0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
19600 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
19610 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
19620 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  stmt */.  int ad
19630 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
19640 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
19650 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
19660 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
19670 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
19680 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
19690 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
196a0 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
196b0 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
196c0 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
196d0 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
196e0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
196f0 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
19700 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
19710 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
19720 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
19730 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
19740 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
19750 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
19760 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
19770 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
19780 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
19790 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
197a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
197b0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
197c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
197d0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
197e0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
197f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
19800 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
19810 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
19820 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
19830 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
19840 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ns */.#ifndef SQ
19850 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
19860 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20  N.  int iSub1;  
19870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
19880 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
19890 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
198a0 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20  iSub2;          
198b0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
198c0 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
198d0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
198e0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
198f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
19900 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
19910 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
19920 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
19930 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
19940 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
19950 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
19960 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
19970 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
19980 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
19990 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
199a0 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
199b0 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
199c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
199d0 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
199e0 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
199f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
19a00 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
19a10 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
19a20 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
19a30 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
19a40 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
19a50 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
19a60 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
19a70 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
19a80 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
19a90 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
19aa0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
19ab0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
19ac0 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
19ad0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
19ae0 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
19af0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
19b00 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
19b10 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
19b20 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
19b30 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
19b40 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
19b50 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
19b60 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
19b70 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
19b80 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
19b90 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
19ba0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
19bb0 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
19bc0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
19bd0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
19be0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19bf0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
19c00 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
19c10 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
19c20 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19c30 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
19c40 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
19c50 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
19c60 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
19c70 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20  OrderByCol==i ) 
19c80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
19c90 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
19ca0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
19cb0 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
19cc0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
19cd0 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20  INTEGER, 0);.   
19ce0 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
19cf0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19d00 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
19d10 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
19d20 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
19d30 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
19d40 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
19d50 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
19d60 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71   = pOrderBy = sq
19d70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
19d80 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
19d90 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20  erBy, pNew);.   
19da0 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
19db0 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  y ) pOrderBy->a[
19dc0 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e  nOrderBy++].u.x.
19dd0 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
19de0 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  16)i;.      }.  
19df0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
19e00 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72  mpute the compar
19e10 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e  ison permutation
19e20 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61   and keyinfo tha
19e30 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20  t is used with. 
19e40 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74   ** the permutat
19e50 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  ion used to dete
19e60 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78  rmine if the nex
19e70 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65  t.  ** row of re
19e80 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d  sults comes from
19e90 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65   selectA or sele
19ea0 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65  ctB.  Also add e
19eb0 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c  xplicit.  ** col
19ec0 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f  lations to the O
19ed0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
19ee0 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65  erms so that whe
19ef0 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
19f00 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67  .  ** to the rig
19f10 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20  ht and the left 
19f20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74  are evaluated, t
19f30 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72  hey use the corr
19f40 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  ect.  ** collati
19f50 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d  on..  */.  aPerm
19f60 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ute = sqlite3DbM
19f70 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
19f80 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64  izeof(int)*(nOrd
19f90 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66  erBy + 1));.  if
19fa0 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
19fb0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
19fc0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19fd0 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d     aPermute[0] =
19fe0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66   nOrderBy;.    f
19ff0 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f  or(i=1, pItem=pO
1a000 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f  rderBy->a; i<=nO
1a010 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
1a020 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
1a030 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
1a040 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
1a050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a060 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1a070 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
1a080 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1a090 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
1a0a0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1a0b0 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  ByCol - 1;.    }
1a0c0 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
1a0d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
1a0e0 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
1a0f0 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  e, p, 1);.  }els
1a100 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
1a110 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1a120 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
1a130 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
1a140 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1a150 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1a160 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
1a170 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
1a180 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1a190 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
1a1a0 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
1a1b0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
1a1c0 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
1a1d0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
1a1e0 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
1a1f0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
1a200 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
1a210 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
1a220 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
1a230 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
1a240 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
1a250 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
1a260 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
1a270 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1a280 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
1a290 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
1a2a0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
1a2b0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
1a2c0 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
1a2d0 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
1a2e0 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
1a2f0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1a300 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
1a310 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
1a320 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70  se->nMem += nExp
1a330 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r+1;.    sqlite3
1a340 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a350 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
1a360 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44  Prev);.    pKeyD
1a370 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  up = sqlite3KeyI
1a380 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
1a390 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
1a3a0 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20  pKeyDup ){.     
1a3b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a3c0 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
1a3d0 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20  le(pKeyDup) );. 
1a3e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1a3f0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1a400 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43       pKeyDup->aC
1a410 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
1a420 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
1a430 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
1a440 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
1a450 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20  tOrder[i] = 0;. 
1a460 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a470 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65  . .  /* Separate
1a480 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68   the left and th
1a490 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72  e right query fr
1a4a0 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20  om one another. 
1a4b0 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
1a4c0 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  = 0;.  pPrior->p
1a4d0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Next = 0;.  sqli
1a4e0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
1a4f0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1a500 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
1a510 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
1a520 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
1a530 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
1a540 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
1a550 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
1a560 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
1a570 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
1a580 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
1a590 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
1a5a0 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
1a5b0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
1a5c0 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
1a5d0 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
1a5e0 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
1a5f0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
1a600 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
1a610 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
1a620 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
1a630 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
1a640 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a650 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
1a660 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
1a670 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
1a6b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a6c0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
1a6d0 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
1a6e0 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
1a6f0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
1a700 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
1a710 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
1a720 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
1a730 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
1a740 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
1a750 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1a760 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
1a770 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
1a780 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
1a790 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1a7a0 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
1a7b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
1a7c0 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
1a7d0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
1a7e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a7f0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1a800 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
1a810 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1a820 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
1a830 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1a840 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
1a850 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1a860 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
1a870 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
1a880 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1a890 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1a8a0 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
1a8b0 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
1a8c0 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
1a8d0 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
1a8e0 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41  */.  addrSelectA
1a8f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1a900 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
1a910 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
1a920 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a930 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
1a940 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20  e, regAddrA, 0, 
1a950 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20  addrSelectA);.  
1a960 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1a970 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b  "left SELECT"));
1a980 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
1a990 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
1a9a0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
1a9b0 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
1a9c0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
1a9d0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1a9e0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
1a9f0 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
1aa00 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
1aa10 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41  tine(v, regAddrA
1aa20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1aa30 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1aa40 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  1);..  /* Genera
1aa50 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
1aa60 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
1aa70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1aa80 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
1aa90 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
1aaa0 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
1aab0 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
1aac0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1aad0 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
1aae0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1aaf0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
1ab00 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1ab10 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  B, 0, addrSelect
1ab20 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  B);.  VdbeCommen
1ab30 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c  t((v, "right SEL
1ab40 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c  ECT"));.  savedL
1ab50 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
1ab60 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20  ;.  savedOffset 
1ab70 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
1ab80 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  p->iLimit = regL
1ab90 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66  imitB;.  p->iOff
1aba0 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70  set = 0;  .  exp
1abb0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
1abc0 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
1abd0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
1abe0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1abf0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
1ac00 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
1ac10 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
1ac20 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
1ac30 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
1ac40 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
1ac50 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  e(v, regAddrB);.
1ac60 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1ac70 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1ac80 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1ac90 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1aca0 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
1acb0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1acc0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1acd0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1ace0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1acf0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1ad00 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
1ad10 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
1ad20 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
1ad30 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad50 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
1ad60 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1ad80 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
1ad90 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
1ada0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1adb0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1adc0 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
1add0 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
1ade0 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
1adf0 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
1ae00 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1ae10 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1ae20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
1ae30 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
1ae40 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1ae50 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1ae60 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
1ae70 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
1ae80 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1ae90 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1aea0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1aeb0 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
1aec0 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1aef0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1af00 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  }.  sqlite3KeyIn
1af10 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29  foUnref(pKeyDup)
1af20 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1af30 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1af40 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1af50 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1af60 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
1af70 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1af80 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
1af90 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1afa0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
1afb0 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
1afc0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1afd0 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64  drEofA_noB = add
1afe0 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64  rEofA = labelEnd
1aff0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1b000 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1b010 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
1b020 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1b030 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
1b040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b050 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1b060 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
1b070 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1b080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b090 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b0a0 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e  egAddrB, labelEn
1b0b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1b0e0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1b0f0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b100 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
1b110 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1b120 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1b130 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
1b140 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1b150 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ow);.  }..  /* G
1b160 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1b170 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
1b180 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
1b190 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
1b1a0 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
1b1b0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
1b1c0 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
1b1d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1b1e0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1b1f0 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
1b200 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28  ddrEofA;.    if(
1b210 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
1b220 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1b230 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
1b240 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
1b250 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73  electRow;.  }els
1b260 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1b270 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1b280 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
1b290 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
1b2a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b2b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1b2c0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1b2d0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1b2e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b2f0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1b300 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62  , labelEnd); Vdb
1b310 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b320 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1b330 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  o(v, addrEofB);.
1b340 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1b350 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1b360 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
1b370 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1b380 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1b390 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
1b3a0 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
1b3b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b3c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1b3d0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1b3e0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1b3f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b400 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1b410 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1b420 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1b430 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b440 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1b450 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b460 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1b470 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
1b480 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1b490 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1b4a0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
1b4b0 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
1b4c0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1b4d0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1b4e0 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
1b4f0 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
1b500 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1b510 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
1b520 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1b530 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
1b540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b550 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b560 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1b570 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1b580 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1b590 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1b5a0 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
1b5b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1b5c0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1b5d0 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
1b5e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1b5f0 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
1b600 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1b610 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
1b620 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1b630 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
1b640 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1b650 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
1b660 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b670 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1b680 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1b690 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1b6a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b6b0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1b6c0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1b6d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1b6e0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b6f0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1b700 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
1b710 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
1b720 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
1b730 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1b740 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1b750 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
1b760 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b770 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1b780 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20   addrEofA_noB); 
1b790 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b7a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b7b0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b7c0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1b7d0 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1b7e0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d  age(v);..  /* Im
1b7f0 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
1b800 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
1b810 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1b820 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1b830 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
1b840 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b850 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
1b860 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
1b870 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
1b880 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
1b890 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b8a0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
1b8b0 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
1b8c0 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1b8f0 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
1b900 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
1b910 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1b920 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
1b930 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1b940 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
1b950 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
1b960 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
1b970 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b980 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
1b990 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
1b9a0 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
1b9b0 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
1b9c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1b9d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b9e0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
1b9f0 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
1ba00 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1ba10 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
1ba20 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
1ba30 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
1ba40 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1ba50 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
1ba60 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
1ba70 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1ba80 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
1ba90 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
1baa0 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f   pPrior;.  pPrio
1bab0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20  r->pNext = p;.. 
1bac0 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
1bad0 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
1bae0 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
1baf0 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
1bb00 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
1bb10 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70  ries ****/.  exp
1bb20 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
1bb30 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
1bb40 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20  b1, iSub2, 0);. 
1bb50 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
1bb60 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69  nErr!=0;.}.#endi
1bb70 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
1bb80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1bb90 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1bba0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1bbb0 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61  EW)../* An insta
1bbc0 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62 73 74  nce of the Subst
1bbd0 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64  Context object d
1bbe0 65 73 63 72 69 62 65 73 20 61 6e 20 73 75 62 73  escribes an subs
1bbf0 74 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a  titution edit.**
1bc00 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
1bc10 20 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65 65   on a parse tree
1bc20 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65  ..**.** All refe
1bc30 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
1bc40 73 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c  s in table iTabl
1bc50 65 20 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c  e are to be repl
1bc60 61 63 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f  aced by correspo
1bc70 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73  nding.** express
1bc80 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a  ions in pEList..
1bc90 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1bca0 74 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b  t SubstContext {
1bcb0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1bcc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1bcd0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1bce0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ext */.  int iTa
1bcf0 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
1bd00 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65     /* Replace re
1bd10 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
1bd20 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1bd30 69 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20  iNewTable;      
1bd40 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62        /* New tab
1bd50 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  le number */.  i
1bd60 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20  nt isLeftJoin;  
1bd70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1bd80 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f  TK_IF_NULL_ROW o
1bd90 70 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72  pcodes on each r
1bda0 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20  eplacement */.  
1bdb0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1bdc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ;         /* Rep
1bdd0 6c 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73  lacement express
1bde0 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43  ions */.} SubstC
1bdf0 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77  ontext;../* Forw
1be00 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  ard Declarations
1be10 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1be20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 53 75  substExprList(Su
1be30 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70  bstContext*, Exp
1be40 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
1be50 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1be60 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20  (SubstContext*, 
1be70 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a  Select*, int);..
1be80 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
1be90 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
1bea0 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
1beb0 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
1bec0 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
1bed0 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
1bee0 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
1bef0 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
1bf00 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
1bf10 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
1bf20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
1bf30 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
1bf40 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
1bf50 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
1bf60 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
1bf70 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
1bf80 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
1bf90 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
1bfa0 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
1bfb0 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
1bfc0 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
1bfd0 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
1bfe0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1bff0 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
1c000 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
1c010 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
1c020 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
1c030 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
1c040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1c050 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
1c060 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1c070 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
1c080 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
1c090 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
1c0a0 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
1c0b0 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
1c0c0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
1c0d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1c0e0 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
1c0f0 73 75 62 73 74 45 78 70 72 28 0a 20 20 53 75 62  substExpr(.  Sub
1c100 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1c110 74 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69  t,  /* Descripti
1c120 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69  on of the substi
1c130 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  tution */.  Expr
1c140 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
1c150 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68     /* Expr in wh
1c160 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ich substitution
1c170 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20   occurs */.){.  
1c180 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
1c190 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45  eturn 0;.  if( E
1c1a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c1b0 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
1c1c0 6e 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  n).   && pExpr->
1c1d0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
1c1e0 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a  =pSubst->iTable.
1c1f0 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e    ){.    pExpr->
1c200 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1c210 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61  = pSubst->iNewTa
1c220 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ble;.  }.  if( p
1c230 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1c240 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
1c250 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1c260 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
1c270 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
1c280 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1c290 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
1c2a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c2b0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
1c2c0 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20    Expr *pCopy = 
1c2d0 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e  pSubst->pEList->
1c2e0 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
1c2f0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45  ].pExpr;.      E
1c300 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20  xpr ifNullRow;. 
1c310 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1c320 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26  bst->pEList!=0 &
1c330 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
1c340 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d  <pSubst->pEList-
1c350 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1c360 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
1c370 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
1c380 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1c390 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c3a0 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f  ExprIsVector(pCo
1c3b0 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  py) ){.        s
1c3c0 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
1c3d0 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61  rMsg(pSubst->pPa
1c3e0 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20  rse, pCopy);.   
1c3f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c400 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c410 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e  pSubst->pParse->
1c420 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  db;.        if( 
1c430 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f  pSubst->isLeftJo
1c440 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21  in && pCopy->op!
1c450 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1c460 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
1c470 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69  ifNullRow, 0, si
1c480 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29  zeof(ifNullRow))
1c490 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75  ;.          ifNu
1c4a0 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46  llRow.op = TK_IF
1c4b0 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20  _NULL_ROW;.     
1c4c0 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70       ifNullRow.p
1c4d0 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20  Left = pCopy;.  
1c4e0 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1c4f0 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  w.iTable = pSubs
1c500 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1c510 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20          pCopy = 
1c520 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20  &ifNullRow;.    
1c530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e      }.        pN
1c540 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1c550 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30  Dup(db, pCopy, 0
1c560 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1c570 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69  New && pSubst->i
1c580 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  sLeftJoin ){.   
1c590 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
1c5a0 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
1c5b0 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  CanBeNull);.    
1c5c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1c5d0 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61  ( pNew && ExprHa
1c5e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1c5f0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1c600 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1c610 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1c620 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  = pExpr->iRightJ
1c630 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  oinTable;.      
1c640 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1c650 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f  rty(pNew, EP_Fro
1c660 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  mJoin);.        
1c670 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1c680 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1c690 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1c6a0 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
1c6b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1c6c0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78  lse{.    if( pEx
1c6d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55  pr->op==TK_IF_NU
1c6e0 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d  LL_ROW && pExpr-
1c6f0 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1c700 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >iTable ){.     
1c710 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
1c720 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1c730 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  le;.    }.    pE
1c740 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62  xpr->pLeft = sub
1c750 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1c760 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1c770 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1c780 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1c790 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  st, pExpr->pRigh
1c7a0 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1c7b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1c7c0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1c7d0 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1c7e0 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45  elect(pSubst, pE
1c7f0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
1c800 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
1c810 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1c820 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  st(pSubst, pExpr
1c830 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
1c840 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1c850 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Expr;.}.static v
1c860 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1c870 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  t(.  SubstContex
1c880 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65  t *pSubst, /* De
1c890 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1c8a0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1c8b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1c8c0 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st       /* List
1c8d0 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
1c8e0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1c8f0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a  bstitutes */.){.
1c900 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1c910 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1c920 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1c930 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1c940 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
1c950 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
1c960 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69  Expr(pSubst, pLi
1c970 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1c980 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1c990 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
1c9a0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1c9b0 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1c9c0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1c9d0 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1c9e0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1c9f0 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
1ca00 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
1ca10 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1ca20 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  itutions */.  in
1ca30 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20  t doPrior       
1ca40 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69      /* Do substi
1ca50 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69  tutes on p->pPri
1ca60 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53  or too */.){.  S
1ca70 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
1ca80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ca90 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
1caa0 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20  t i;.  if( !p ) 
1cab0 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20  return;.  do{.  
1cac0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1cad0 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73  pSubst, p->pELis
1cae0 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
1caf0 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1cb00 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
1cb10 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1cb20 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ubst, p->pOrderB
1cb30 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69  y);.    p->pHavi
1cb40 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ng = substExpr(p
1cb50 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e  Subst, p->pHavin
1cb60 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  g);.    p->pWher
1cb70 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  e = substExpr(pS
1cb80 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29  ubst, p->pWhere)
1cb90 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e  ;.    pSrc = p->
1cba0 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  pSrc;.    assert
1cbb0 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ( pSrc!=0 );.   
1cbc0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1cbd0 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
1cbe0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
1cbf0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
1cc00 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1cc10 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1cc20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  1);.      if( pI
1cc30 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1cc40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62  c ){.        sub
1cc50 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1cc60 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  t, pItem->u1.pFu
1cc70 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  ncArg);.      }.
1cc80 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1cc90 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20  doPrior && (p = 
1cca0 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b  p->pPrior)!=0 );
1ccb0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1ccc0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1ccd0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1cce0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ccf0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
1cd00 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1cd10 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1cd20 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1cd30 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1cd40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1cd50 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
1cd60 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
1cd70 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
1cd80 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
1cd90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1cda0 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
1cdb0 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
1cdc0 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
1cdd0 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ning occurs..**.
1cde0 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
1cdf0 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
1ce00 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
1ce10 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1ce20 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
1ce30 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
1ce40 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
1ce50 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1ce60 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
1ce70 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
1ce80 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
1ce90 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
1cea0 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
1ceb0 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
1cec0 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
1ced0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1cee0 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
1cef0 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
1cf00 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1cf10 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
1cf20 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
1cf30 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
1cf40 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
1cf50 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
1cf60 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
1cf70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1cf80 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
1cf90 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
1cfa0 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
1cfb0 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1cfc0 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
1cfd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1cfe0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
1cff0 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
1d000 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
1d010 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
1d020 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
1d030 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1d040 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
1d050 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
1d060 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
1d070 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
1d080 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
1d090 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  s simplification
1d0a0 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
1d0b0 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
1d0c0 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
1d0d0 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
1d0e0 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
1d0f0 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
1d100 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
1d110 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
1d120 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
1d130 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
1d140 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
1d150 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74  ening is subject
1d160 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
1d170 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a  g constraints:.*
1d180 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1d190 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1d1a0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1d1b0 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1d1c0 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20  . Was:.**       
1d1d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1d1e0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1d1f0 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  y cannot both be
1d200 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1d210 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20  **  (**)  We no 
1d220 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74  longer attempt t
1d230 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67  o flatten aggreg
1d240 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  ate subqueries. 
1d250 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28  Was:.**        (
1d260 32 29 20 49 66 20 74 68 65 20 73 75 62 71 75 65  2) If the subque
1d270 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  ry is an aggrega
1d280 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  te then.**      
1d290 20 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72    (2a) the outer
1d2a0 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1d2b0 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1d2c0 20 20 20 20 20 20 20 20 28 32 62 29 20 74 68 65          (2b) the
1d2d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73   outer query mus
1d2e0 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  t not use subque
1d2f0 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ries.**         
1d300 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20 74      other than t
1d310 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75  he one FROM-clau
1d320 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74  se subquery that
1d330 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a   is a candidate.
1d340 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66  **             f
1d350 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  or flattening.  
1d360 28 54 68 69 73 20 69 73 20 64 75 65 20 74 6f 20  (This is due to 
1d370 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37  ticket [2f7170d7
1d380 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20  3bf9abf80].**   
1d390 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 32            from 2
1d3a0 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a  015-02-09.).**.*
1d3b0 2a 20 20 20 28 33 29 20 20 49 66 20 74 68 65 20  *   (3)  If the 
1d3c0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1d3d0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1d3e0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65   a LEFT JOIN the
1d3f0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61 29  n.**        (3a)
1d400 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1d410 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  y not be a join 
1d420 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33  and.**        (3
1d430 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  b) the FROM clau
1d440 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1d450 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61  ry may not conta
1d460 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  in a virtual.** 
1d470 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
1d480 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  e and.**        
1d490 28 33 63 29 20 74 68 65 20 6f 75 74 65 72 20 71  (3c) the outer q
1d4a0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1d4b0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  an aggregate..**
1d4c0 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1d4d0 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74 20  ubquery can not 
1d4e0 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  be DISTINCT..**.
1d4f0 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65  **  (**)  At one
1d500 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69   point restricti
1d510 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20  ons (4) and (5) 
1d520 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74  defined a subset
1d530 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20   of DISTINCT.** 
1d540 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69         sub-queri
1d550 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63  es that were exc
1d560 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20  luded from this 
1d570 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65  optimization. Re
1d580 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  striction .**   
1d590 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e       (4) has sin
1d5a0 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ce been expanded
1d5b0 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20   to exclude all 
1d5c0 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72  DISTINCT subquer
1d5d0 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ies..**.**  (**)
1d5e0 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
1d5f0 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
1d600 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
1d610 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
1d620 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20 73          If the s
1d630 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65  ubquery is aggre
1d640 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72 20  gate, the outer 
1d650 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1d660 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1d670 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1d680 75 65 72 79 20 6d 75 73 74 20 68 61 76 65 20 61  uery must have a
1d690 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1d6a0 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1d6b0 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1d6c0 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1d6d0 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1d6e0 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61  dding a FROM cla
1d6f0 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  use with the spe
1d700 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1d710 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1d720 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1d730 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1d740 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1d750 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1d760 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1d770 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1d780 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1d790 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d7a0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1d7b0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
1d7c0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1d7d0 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1d7e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d7f0 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72 65  may not be aggre
1d800 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  gate..**.**  (**
1d810 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  )  Restriction (
1d820 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20  10) was removed 
1d830 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e  from the code on
1d840 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20   2005-02-05 but 
1d850 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63  we.**        acc
1d860 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20  idently carried 
1d870 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77  the comment forw
1d880 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30  ard until 2014-0
1d890 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a  9-15.  Original.
1d8a0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  **        constr
1d8b0 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73 75  aint: "If the su
1d8c0 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67  bquery is aggreg
1d8d0 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75 74  ate then the out
1d8e0 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20  er query .**    
1d8f0 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20      may not use 
1d900 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28  LIMIT.".**.**  (
1d910 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1d920 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1d930 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f  query may not bo
1d940 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1d950 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1d960 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1d970 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1d980 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1d990 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1d9a0 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
1d9b0 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
1d9c0 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
1d9d0 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
1d9e0 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
1d9f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1da00 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  d outer query ma
1da10 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  y not both use L
1da20 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
1da30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1da40 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  may not use OFFS
1da50 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
1da60 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
1da70 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 61  ery is part of a
1da80 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1da90 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
1daa0 20 20 20 20 20 73 75 62 71 75 65 72 79 20 6d 61       subquery ma
1dab0 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
1dac0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
1dad0 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
1dae0 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
1daf0 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
1db00 36 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72  6)  If the outer
1db10 20 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67   query is aggreg
1db20 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ate, then the su
1db30 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a  bquery may not.*
1db40 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f 52 44  *        use ORD
1db50 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
1db60 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
1db70 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
1db80 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
1db90 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
1dba0 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
1dbb0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
1dbc0 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74 68 65  **  (17)  If the
1dbd0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 63   subquery is a c
1dbe0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1dbf0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1dc00 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e  17a) all compoun
1dc10 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73 74  d operators must
1dc20 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c   be a UNION ALL,
1dc30 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1dc40 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77 69  17b) no terms wi
1dc50 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72  thin the subquer
1dc60 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62  y compound may b
1dc70 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20  e aggregate.**  
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 44              or D
1dc90 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20  ISTINCT, and.** 
1dca0 20 20 20 20 20 20 20 28 31 37 63 29 20 65 76 65         (17c) eve
1dcb0 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ry term within t
1dcc0 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
1dcd0 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20 61  ound must have a
1dce0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
1dcf0 20 20 20 20 20 20 20 28 31 37 64 29 20 74 68 65         (17d) the
1dd00 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1dd10 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20   not be.**      
1dd20 20 20 20 20 20 20 20 20 28 31 37 64 31 29 20 61          (17d1) a
1dd30 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20  ggregate, or.** 
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37               (17
1dd50 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f 72  d2) DISTINCT, or
1dd60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1dd70 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a   (17d3) a join..
1dd80 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
1dd90 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
1dda0 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
1ddb0 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
1ddc0 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
1ddd0 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
1dde0 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
1ddf0 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
1de00 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
1de10 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
1de20 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
1de30 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
1de40 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
1de50 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1de60 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
1de70 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
1de80 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
1de90 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
1dea0 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1deb0 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
1dec0 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
1ded0 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
1dee0 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
1def0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
1df00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
1df10 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
1df20 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
1df30 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
1df40 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
1df50 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
1df60 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
1df70 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
1df80 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
1df90 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
1dfa0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
1dfb0 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
1dfc0 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
1dfd0 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
1dfe0 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
1dff0 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
1e000 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
1e010 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
1e020 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
1e030 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1e040 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
1e050 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
1e060 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
1e070 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
1e080 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1e090 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1e0a0 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
1e0b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
1e0c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
1e0d0 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
1e0e0 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
1e0f0 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
1e100 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
1e110 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
1e120 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20 74  *.**  (19)  If t
1e130 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1e140 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
1e150 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1e160 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
1e170 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
1e180 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
1e190 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1e1a0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1e1b0 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
1e1c0 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
1e1d0 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
1e1e0 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
1e1f0 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
1e200 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
1e210 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
1e220 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
1e230 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
1e240 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1e250 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
1e260 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
1e270 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
1e280 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
1e290 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1e2a0 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
1e2b0 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
1e2c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
1e2d0 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
1e2e0 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
1e2f0 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74 68  .**  (21)  If th
1e300 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1e310 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1e320 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1e330 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  ot be.**        
1e340 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
1e350 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
1e360 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32  fc])..**.**  (22
1e370 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1e380 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65 63  may not be a rec
1e390 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
1e3a0 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75 6d 65  *  (**)  Subsume
1e3b0 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1e3c0 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61 73 3a  on (17d3).  Was:
1e3d0 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
1e3e0 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ery is.**       
1e3f0 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1e400 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d 71  , then the sub-q
1e410 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1e420 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
1e430 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 69 73  ..**        This
1e440 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20   restriction is 
1e450 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72  because transfor
1e460 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ming the.**     
1e470 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63     parent to a c
1e480 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f  ompound query co
1e490 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20  nfuses the code 
1e4a0 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20  that handles.** 
1e4b0 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65         recursive
1e4c0 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74   queries in mult
1e4d0 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a  iSelect()..**.**
1e4e0 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f    (**)  We no lo
1e4f0 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20  nger attempt to 
1e500 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74  flatten aggregat
1e510 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57  e subqueries.  W
1e520 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
1e530 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1e540 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
1e550 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65  te that uses the
1e560 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20   built-in min() 
1e570 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  or .**        or
1e580 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73   max() functions
1e590 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73  .  (Without this
1e5a0 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20   restriction, a 
1e5b0 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20  query like:.**  
1e5c0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20        "SELECT x 
1e5d0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78  FROM (SELECT max
1e5e0 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22  (y), x FROM t1)"
1e5f0 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73   would not neces
1e600 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20  sarily.**       
1e610 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
1e620 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20  e X for which Y 
1e630 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a  was maximal.).**
1e640 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
1e650 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
1e660 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
1e670 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
1e680 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
1e690 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
1e6a0 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
1e6b0 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
1e6c0 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
1e6d0 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
1e6e0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
1e6f0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
1e700 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
1e710 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1e720 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
1e730 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
1e740 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
1e750 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
1e760 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
1e770 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
1e780 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
1e790 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
1e7a0 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
1e7b0 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
1e7c0 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
1e7d0 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
1e7e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
1e7f0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
1e800 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1e810 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1e820 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1e830 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1e840 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
1e850 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
1e860 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
1e870 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
1e880 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1e890 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
1e8a0 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
1e8b0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
1e8c0 67 67 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg            /*
1e8d0 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
1e8e0 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
1e8f0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
1e900 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1e910 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
1e920 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
1e930 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53  AuthContext;.  S
1e940 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20  elect *pParent; 
1e950 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e     /* Current UN
1e960 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20  ION ALL term of 
1e970 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20  the other query 
1e980 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
1e990 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
1e9a0 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
1e9b0 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
1e9c0 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20  elect *pSub1;   
1e9d0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1e9e0 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73   the rightmost s
1e9f0 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65  elect in sub-que
1ea00 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1ea10 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
1ea20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ea30 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1ea40 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1ea50 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
1ea60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1ea70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1ea80 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
1ea90 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
1eaa0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1eab0 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
1eac0 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
1ead0 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72 65  /.  int iNewPare
1eae0 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61  nt = -1;/* Repla
1eaf0 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f 72  cement table for
1eb00 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   iParent */.  in
1eb10 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30  t isLeftJoin = 0
1eb20 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75  ; /* True if pSu
1eb30 62 20 69 73 20 74 68 65 20 72 69 67 68 74 20 73  b is the right s
1eb40 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ide of a LEFT JO
1eb50 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20  IN */    .  int 
1eb60 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1eb70 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1eb80 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
1eb90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1eba0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1ebb0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
1ebc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1ebd0 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
1ebe0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
1ebf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1ec00 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
1ec10 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1ec20 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
1ec30 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
1ec40 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
1ec50 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1ec60 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1ec70 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
1ec80 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
1ec90 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1eca0 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
1ecb0 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20  tener) ) return 
1ecc0 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
1ecd0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1ece0 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
1ecf0 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
1ed00 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
1ed10 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
1ed20 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
1ed30 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
1ed40 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
1ed50 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
1ed60 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
1ed70 30 20 29 3b 0a 0a 20 20 70 53 75 62 53 72 63 20  0 );..  pSubSrc 
1ed80 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
1ed90 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
1eda0 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
1edb0 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
1edc0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1edd0 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
1ede0 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
1edf0 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
1ee00 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
1ee10 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d  , we allowed som
1ee20 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c  e combining of L
1ee30 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
1ee40 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
1ee50 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75  y could be compu
1ee60 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
1ee70 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c  ime.  But when L
1ee80 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
1ee90 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69    ** became arbi
1eea0 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1eeb0 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  s, we were force
1eec0 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63  d to add restric
1eed0 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20  tions (13).  ** 
1eee0 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69  and (14). */.  i
1eef0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1ef00 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  && p->pLimit ) r
1ef10 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ef20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1ef30 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69  tion (13) */.  i
1ef40 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  f( pSub->pOffset
1ef50 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1ef80 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69  tion (14) */.  i
1ef90 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1efa0 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d  & SF_Compound)!=
1efb0 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  0 && pSub->pLimi
1efc0 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
1efd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  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 2f 2a                /*
1f000 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
1f010 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
1f020 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
1f030 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f050 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f060 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (7)  */.  if( p
1f070 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1f080 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  SF_Distinct ) re
1f090 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f0a0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f0b0 20 28 34 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (4)  */.  if( p
1f0c0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1f0d0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
1f0e0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
1f0f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f100 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1f110 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20   (8)(9) */.  }. 
1f120 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1f130 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1f140 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
1f150 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 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 2f                 /
1f180 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f190 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
1f1a0 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
1f1b0 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
1f1c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f1d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f1e0 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20  n (16) */.  if( 
1f1f0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1f200 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
1f210 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f220 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f230 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20  n (19) */.  if( 
1f240 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1f250 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f260 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29  F_Distinct)!=0 )
1f270 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1f280 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1f290 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a  riction (21) */.
1f2a0 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
1f2b0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52  selFlags & (SF_R
1f2c0 65 63 75 72 73 69 76 65 29 20 29 7b 0a 20 20 20  ecursive) ){.   
1f2d0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
1f2e0 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20  strictions (22) 
1f2f0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  */.  }..  /*.  *
1f300 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
1f310 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1f320 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
1f330 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a   JOIN, then the.
1f340 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 6d 61    ** subquery ma
1f350 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  y not be a join 
1f360 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45 78 61  itself (3a). Exa
1f370 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68 69 73  mple of why this
1f380 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c   is not.  ** all
1f390 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
1f3a0 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
1f3b0 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
1f3c0 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
1f3d0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
1f3e0 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
1f3f0 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
1f400 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
1f410 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
1f420 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
1f430 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
1f440 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
1f450 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
1f460 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
1f470 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1f480 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
1f490 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 20   JOIN, then the 
1f4a0 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79  outer.  ** query
1f4b0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67   cannot be an ag
1f4c0 67 72 65 67 61 74 65 2e 20 28 33 63 29 20 20 54  gregate. (3c)  T
1f4d0 68 69 73 20 69 73 20 61 6e 20 61 72 74 69 66 61  his is an artifa
1f4e0 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  ct of the way.  
1f4f0 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20 61 72  ** aggregates ar
1f500 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74 68  e processed - th
1f510 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e  ere is no mechan
1f520 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ism to determine
1f530 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46   if.  ** the LEF
1f540 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f  T JOIN table sho
1f550 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e  uld be all-NULL.
1f560 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
1f570 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30 36  lso tickets #306
1f580 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33 30  , #350, and #330
1f590 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  0..  */.  if( (p
1f5a0 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
1f5b0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1f5c0 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65 66  !=0 ){.    isLef
1f5d0 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69  tJoin = 1;.    i
1f5e0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1f5f0 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49  >1 || isAgg || I
1f600 73 56 69 72 74 75 61 6c 28 70 53 75 62 53 72 63  sVirtual(pSubSrc
1f610 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a  ->a[0].pTab) ){.
1f620 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29 20 20        /*  (3a)  
1f630 20 20 20 20 20 20 20 20 20 20 20 28 33 63 29 20             (3c) 
1f640 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20 20 20      (3b) */.    
1f650 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1f660 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
1f670 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c  ITE_EXTRA_IFNULL
1f680 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28 20 69  ROW.  else if( i
1f690 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41 67 67  From>0 && !isAgg
1f6a0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 74 69   ){.    /* Setti
1f6b0 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f  ng isLeftJoin to
1f6c0 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f 49 66   -1 causes OP_If
1f6d0 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20  NullRow opcodes 
1f6e0 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
1f6f0 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
1f700 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
1f710 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  y result column 
1f720 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20 69 6e  from subquery in
1f730 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20   a join, even.  
1f740 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 65 79    ** though they
1f750 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73 73 61   are not necessa
1f760 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 73  ry.  This will s
1f770 74 72 65 73 73 2d 74 65 73 74 20 74 68 65 20 4f  tress-test the O
1f780 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20  P_IfNullRow .   
1f790 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20   ** opcode. */. 
1f7a0 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20     isLeftJoin = 
1f7b0 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
1f7c0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f7d0 20 28 31 37 29 3a 20 49 66 20 74 68 65 20 73 75   (17): If the su
1f7e0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1f7f0 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68  pound SELECT, th
1f800 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20  en it must.  ** 
1f810 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49  use only the UNI
1f820 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e  ON ALL operator.
1f830 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   And none of the
1f840 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71   simple select q
1f850 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74  ueries.  ** that
1f860 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d   make up the com
1f870 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65  pound SELECT are
1f880 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
1f890 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74  ggregate or dist
1f8a0 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65  inct.  ** querie
1f8b0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
1f8c0 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1f8d0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
1f8e0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65  erBy ){.      re
1f8f0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74  turn 0;  /* Rest
1f900 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a  riction (20) */.
1f910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
1f920 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  Agg || (p->selFl
1f930 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1f940 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e  t)!=0 || pSrc->n
1f950 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  Src!=1 ){.      
1f960 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37  return 0; /* (17
1f970 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f 72 20  d1), (17d2), or 
1f980 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a  (17d3) */.    }.
1f990 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53      for(pSub1=pS
1f9a0 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31  ub; pSub1; pSub1
1f9b0 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b  =pSub1->pPrior){
1f9c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f9d0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1f9e0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1f9f0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1fa00 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
1fa10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fa20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1fa30 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1fa40 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1fa50 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
1fa60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1fa70 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20  ub->pSrc!=0 );. 
1fa80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1fa90 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
1faa0 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d  ==pSub1->pEList-
1fab0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1fac0 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  if( (pSub1->selF
1fad0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1fae0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1faf0 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31 37 62  ))!=0    /* (17b
1fb00 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28  ) */.       || (
1fb10 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26  pSub1->pPrior &&
1fb20 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41   pSub1->op!=TK_A
1fb30 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20 20 20  LL)             
1fb40 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a      /* (17a) */.
1fb50 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d         || pSub1-
1fb60 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20  >pSrc->nSrc<1   
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb90 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20 20 20  * (17c) */.     
1fba0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1fbb0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1fbc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
1fbd0 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e  ub1->pSrc->nSrc>
1fbe0 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1 );.    }..    
1fbf0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1fc00 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  18). */.    if( 
1fc10 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
1fc20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1fc30 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1fc40 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1fc50 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1fc60 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1fc70 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f  By->a[ii].u.x.iO
1fc80 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72  rderByCol==0 ) r
1fc90 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1fca0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1fcb0 20 45 78 2d 72 65 73 74 72 69 63 74 69 6f 6e 20   Ex-restriction 
1fcc0 28 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f  (23):.  ** The o
1fcd0 6e 6c 79 20 77 61 79 20 74 68 61 74 20 74 68 65  nly way that the
1fce0 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20   recursive part 
1fcf0 6f 66 20 61 20 43 54 45 20 63 61 6e 20 63 6f 6e  of a CTE can con
1fd00 74 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a  tain a compound.
1fd10 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
1fd20 20 66 6f 72 20 74 68 65 20 73 75 62 71 75 65 72   for the subquer
1fd30 79 20 74 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d  y to be one term
1fd40 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74   of a join.  But
1fd50 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   if the.  ** sub
1fd60 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
1fd70 20 74 68 65 6e 20 74 68 65 20 66 6c 61 74 74 65   then the flatte
1fd80 6e 69 6e 67 20 68 61 73 20 61 6c 72 65 61 64 79  ning has already
1fd90 20 62 65 65 6e 20 73 74 6f 70 70 65 64 20 62 79   been stopped by
1fda0 0a 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f  .  ** restrictio
1fdb0 6e 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20  n (17d3).  */.  
1fdc0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
1fdd0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
1fde0 69 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d  ive)==0 || pSub-
1fdf0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20  >pPrior==0 );.. 
1fe00 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65   /***** If we re
1fe10 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
1fe20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1fe30 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a  rmitted. *****/.
1fe40 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
1fe50 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74  pParse,p,("flatt
1fe60 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65  en %s.%p from te
1fe70 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  rm %d\n",.      
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75               pSu
1fe90 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75  b->zSelName, pSu
1fea0 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f  b, iFrom));..  /
1feb0 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
1fec0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
1fed0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1fee0 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
1fef0 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Name;.  TESTONLY
1ff00 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74  (i =) sqlite3Aut
1ff10 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1ff20 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1ff30 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61   0, 0);.  testca
1ff40 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45  se( i==SQLITE_DE
1ff50 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  NY );.  pParse->
1ff60 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
1ff70 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1ff80 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
1ff90 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1ffa0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1ffb0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
1ffc0 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
1ffd0 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
1ffe0 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
1fff0 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
20000 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
20010 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
20020 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
20030 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
20040 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
20050 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
20060 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
20070 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
20080 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
20090 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
200a0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
200b0 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
200c0 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
200d0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
200e0 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
200f0 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
20100 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
20110 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
20120 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
20130 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
20140 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
20150 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
20160 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
20170 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
20180 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
20190 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
201a0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
201b0 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
201c0 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
201d0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
201e0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
201f0 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
20200 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
20210 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
20220 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
20230 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
20240 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
20250 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
20260 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
20270 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
20280 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
20290 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=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 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
202c0 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
202d0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
202e0 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
202f0 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
20300 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
20310 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
20320 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
20330 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
20340 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
20350 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
20360 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
20370 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
20380 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
20390 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
203a0 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
203b0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
203c0 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
203d0 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
203e0 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
203f0 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
20400 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
20410 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
20420 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
20430 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
20440 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
20450 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
20460 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d   Expr *pOffset =
20470 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
20480 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
20490 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
204a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
204b0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
204c0 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
204d0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
204e0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  mit = 0;.    p->
204f0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
20500 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
20510 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
20520 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  0);.    sqlite3S
20530 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65  electSetName(pNe
20540 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d  w, pSub->zSelNam
20550 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73  e);.    p->pOffs
20560 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
20570 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
20580 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
20590 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
205a0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
205b0 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
205c0 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  = TK_ALL;.    if
205d0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
205e0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
205f0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
20600 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
20610 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
20620 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
20630 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
20640 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  = pNew;.      pN
20650 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ew->pNext = p;. 
20660 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
20670 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c   pNew;.      SEL
20680 45 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73  ECTTRACE(2,pPars
20690 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22  e,p,.         ("
206a0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
206b0 79 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61  y flattener crea
206c0 74 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65  tes %s.%p as pee
206d0 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  r\n",.         p
206e0 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  New->zSelName, p
206f0 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  New));.    }.   
20700 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
20710 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
20720 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
20730 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
20740 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
20750 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
20760 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
20770 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
20780 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
20790 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
207a0 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
207b0 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
207c0 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
207d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
207e0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
207f0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
20800 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
20810 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
20820 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
20830 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
20840 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
20850 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
20860 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
20870 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
20880 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
20890 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
208a0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
208b0 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
208c0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
208d0 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
208e0 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
208f0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
20900 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
20910 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
20920 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
20930 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
20940 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
20950 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
20960 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
20970 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
20980 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
20990 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
209a0 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
209b0 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
209c0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
209d0 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
209e0 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
209f0 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
20a00 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
20a10 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
20a20 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
20a30 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
20a40 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
20a50 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
20a60 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65  TabToDel->nTabRe
20a70 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
20a80 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
20a90 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
20aa0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
20ab0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
20ac0 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
20ad0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
20ae0 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
20af0 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
20b00 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
20b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20b20 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65  TabToDel->nTabRe
20b30 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
20b40 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
20b50 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
20b60 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
20b70 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
20b80 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
20b90 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
20ba0 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
20bb0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
20bc0 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
20bd0 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
20be0 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
20bf0 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
20c00 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
20c10 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
20c20 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
20c30 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
20c40 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
20c50 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
20c60 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
20c70 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
20c80 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
20c90 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
20ca0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
20cb0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
20cc0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
20cd0 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
20ce0 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
20cf0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
20d00 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
20d10 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
20d20 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
20d30 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
20d40 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
20d50 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
20d60 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
20d70 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
20d80 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
20d90 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
20da0 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
20db0 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
20dc0 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
20dd0 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
20de0 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
20df0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
20e00 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
20e10 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
20e20 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
20e30 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
20e40 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
20e50 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
20e60 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
20e70 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
20e80 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
20e90 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
20ea0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
20eb0 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
20ec0 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
20ed0 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
20ee0 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
20ef0 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
20f00 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
20f10 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
20f20 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
20f30 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
20f40 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
20f50 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
20f60 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
20f70 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
20f80 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
20f90 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
20fa0 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
20fb0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
20fc0 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
20fd0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  ->fg.jointype;. 
20fe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20ff0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
21000 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
21010 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
21020 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
21030 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
21040 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
21050 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
21060 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
21070 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
21080 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
21090 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
210a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
210b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
210c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
210d0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
210e0 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
210f0 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
21100 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
21110 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
21120 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
21130 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
21140 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
21150 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
21160 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
21170 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
21180 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
21190 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
211a0 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
211b0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
211c0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
211d0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
211e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
211f0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
21200 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
21210 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
21220 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
21230 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
21240 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
21250 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
21260 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
21270 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
21280 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
21290 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
212a0 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
212b0 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
212c0 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
212d0 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
212e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
212f0 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c  M clause to 4 sl
21300 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ots..    ** The 
21310 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65  middle slot is e
21320 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
21330 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
21340 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20   make space.    
21350 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65  ** for the two e
21360 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
21370 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
21380 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
21390 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
213a0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
213b0 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
213c0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
213d0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
213e0 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
213f0 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
21400 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
21410 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
21420 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
21430 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
21440 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
21450 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
21460 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
21470 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
21480 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
21490 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
214a0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
214b0 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
214c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
214d0 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
214e0 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73  sing);.      ass
214f0 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69  ert( pSrc->a[i+i
21500 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75  From].fg.isTabFu
21510 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  nc==0 );.      p
21520 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
21530 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
21540 0a 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e  .      iNewParen
21550 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  t = pSubSrc->a[i
21560 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
21570 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
21580 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
21590 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
215a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
215b0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a  c->a[iFrom].fg.j
215c0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
215d0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
215e0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
215f0 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
21600 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
21610 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
21620 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
21630 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
21640 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
21650 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
21660 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
21670 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
21680 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
21690 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
216a0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
216b0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
216c0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
216d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
216e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
216f0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
21700 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
21710 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
21720 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
21730 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
21740 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21750 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
21760 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
21770 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
21780 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
21790 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
217a0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
217b0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
217c0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
217d0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
217e0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
217f0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
21800 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
21810 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
21820 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
21830 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72  int, any non-zer
21840 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61  o iOrderByCol va
21850 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68  lues indicate th
21860 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
21870 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20  ORDER BY column 
21880 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64  expression is id
21890 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69  entical to the i
218a0 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20  OrderByCol'th.  
218b0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
218c0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  n returned by SE
218d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
218e0 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65  Sub. Since these
218f0 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
21900 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   do not necessar
21910 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ily correspond t
21920 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c  o columns in SEL
21930 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50  ECT statement pP
21940 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20  arent,.      ** 
21950 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65  zero them before
21960 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65   transfering the
21970 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
21980 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
21990 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68   ** Not doing th
219a0 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20  is may cause an 
219b0 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65  error if a subse
219c0 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68  quent call to th
219d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
219e0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
219f0 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f   flatten a compo
21a00 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e  und sub-query in
21a10 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20  to pParent.     
21a20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61   ** (the only wa
21a30 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
21a40 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70  n is if the comp
21a50 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
21a60 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65  s.      ** curre
21a70 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75  ntly part of pSu
21a80 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69  b->pSrc). See ti
21a90 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66  cket [d11a6e908f
21aa0 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ].  */.      Exp
21ab0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
21ac0 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
21ad0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
21ae0 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
21af0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
21b00 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
21b10 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
21b20 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
21b30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
21b40 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
21b50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21b60 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d  ( pSub->pPrior==
21b70 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
21b80 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
21b90 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
21ba0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
21bb0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68  0;.    }.    pWh
21bc0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
21bd0 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
21be0 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69  Where, 0);.    i
21bf0 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20  f( isLeftJoin>0 
21c00 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
21c10 45 78 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65  Expr(pWhere, iNe
21c20 77 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a  wParent);.    }.
21c30 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
21c40 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
21c50 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c  rAnd(db, pWhere,
21c60 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
21c70 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
21c80 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
21c90 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
21ca0 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e  text x;.      x.
21cb0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
21cc0 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20  .      x.iTable 
21cd0 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  = iParent;.     
21ce0 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69   x.iNewTable = i
21cf0 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
21d00 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20   x.isLeftJoin = 
21d10 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20  isLeftJoin;.    
21d20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75    x.pEList = pSu
21d30 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  b->pEList;.     
21d40 20 73 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c   substSelect(&x,
21d50 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20   pParent, 0);.  
21d60 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68    }.  .    /* Th
21d70 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
21d80 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
21d90 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
21da0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
21db0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
21dc0 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f  istinct. .    */
21dd0 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
21de0 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
21df0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
21e00 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f  stinct;.  .    /
21e10 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  *.    ** SELECT 
21e20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
21e30 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
21e40 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
21e50 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a  FFSET y;.    **.
21e60 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65      ** One is te
21e70 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
21e80 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
21e90 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
21ea0 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20  s.  But this.   
21eb0 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
21ec0 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
21ed0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
21ee0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
21ef0 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
21f00 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69      pParent->pLi
21f10 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
21f20 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  it;.      pSub->
21f30 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
21f40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
21f50 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
21f60 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
21f70 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
21f80 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
21f90 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
21fa0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
21fb0 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53  , pSub1);..#if S
21fc0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
21fd0 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
21fe0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
21ff0 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  100 ){.    SELEC
22000 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
22010 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c  rse,p,("After fl
22020 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a  attening:\n"));.
22030 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
22040 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
22050 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
22060 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
22070 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
22080 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
22090 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
220a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
220b0 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21  IEW) */....#if !
220c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
220d0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
220e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
220f0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
22100 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
22110 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20   relevant WHERE 
22120 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
22130 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
22140 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52  into.** the WHER
22150 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  E clause of subq
22160 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  uery.  Example:.
22170 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
22180 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
22190 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
221a0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78  FROM t1) WHERE x
221b0 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
221c0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
221d0 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nto:.**.**    SE
221e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
221f0 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20  ECT a AS x, c-d 
22200 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45  AS y FROM t1 WHE
22210 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31  RE a=5 AND c-d=1
22220 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20  0).**     WHERE 
22230 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a  x=5 AND y=10;.**
22240 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20  .** The hope is 
22250 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61  that the terms a
22260 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65  dded to the inne
22270 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b  r query will mak
22280 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66  e it more.** eff
22290 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f  icient..**.** Do
222a0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69   not attempt thi
222b0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
222c0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28  f:.**.**   (1) (
222d0 2a 2a 20 54 68 69 73 20 72 65 73 74 72 69 63 74  ** This restrict
222e0 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20  ion was removed 
222f0 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20  on 2017-09-29.  
22300 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20  We used to.**   
22310 20 20 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77          disallow
22320 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
22330 6f 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  on for aggregate
22340 20 73 75 62 71 75 65 72 69 65 73 2c 20 62 75 74   subqueries, but
22350 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
22360 20 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20    it is allowed 
22370 62 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 65  by putting the e
22380 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
22390 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
223a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 54 68  .**           Th
223b0 65 20 61 64 64 65 64 20 48 41 56 49 4e 47 20 63  e added HAVING c
223c0 6c 61 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65  lause is pointle
223d0 73 73 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ss if the subque
223e0 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20  ry lacks.**     
223f0 20 20 20 20 20 20 61 20 47 52 4f 55 50 20 42 59        a GROUP BY
22400 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75   clause.  But su
22410 63 68 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  ch a HAVING clau
22420 73 65 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c  se is also harml
22430 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ess.**          
22440 20 73 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e   so there does n
22450 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62 65 20  ot appear to be 
22460 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64  any reason to ad
22470 64 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a  d extra logic.**
22480 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 73 75             to su
22490 70 70 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a  ppress it. **).*
224a0 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69  *.**   (2) The i
224b0 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68  nner query is th
224c0 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74  e recursive part
224d0 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62   of a common tab
224e0 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  le expression..*
224f0 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69  *.**   (3) The i
22500 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61  nner query has a
22510 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73   LIMIT clause (s
22520 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73  ince the changes
22530 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a   to the WHERE.**
22540 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75         close wou
22550 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65  ld change the me
22560 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d  aning of the LIM
22570 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  IT)..**.**   (4)
22580 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
22590 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
225a0 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
225b0 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c  JOIN.  (The call
225c0 65 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f  er.**       enfo
225d0 72 63 65 73 20 74 68 69 73 20 72 65 73 74 72 69  rces this restri
225e0 63 74 69 6f 6e 20 73 69 6e 63 65 20 74 68 69 73  ction since this
225f0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
22600 74 20 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a  t have enough.**
22610 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69         informati
22620 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a  on to know.).**.
22630 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45  **   (5) The WHE
22640 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
22650 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20  sion originates 
22660 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
22670 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  NG clause.**    
22680 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49     of a LEFT JOI
22690 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  N..**.** Return 
226a0 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20  0 if no changes 
226b0 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e  are made and non
226c0 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20  -zero if one or 
226d0 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  more WHERE claus
226e0 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64  e.** terms are d
226f0 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74  uplicated into t
22700 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
22710 73 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44  static int pushD
22720 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20  ownWhereTerms(. 
22730 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22740 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
22750 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c  context (for mal
22760 6c 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20  loc() and error 
22770 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20  reporting) */.  
22780 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20  Select *pSubq,  
22790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62        /* The sub
227a0 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52  query whose WHER
227b0 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62  E clause is to b
227c0 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20  e augmented */. 
227d0 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
227e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
227f0 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
22800 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
22810 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20  .  int iCursor  
22820 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
22830 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
22840 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a   subquery */.){.
22850 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
22860 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20  int nChng = 0;. 
22870 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29   if( pWhere==0 )
22880 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22890 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73   pSubq->selFlags
228a0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
228b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
228c0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20  restriction (2) 
228d0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
228e0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c  E_DEBUG.  /* Onl
228f0 79 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  y the first term
22900 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63   of a compound c
22910 61 6e 20 68 61 76 65 20 61 20 57 49 54 48 20 63  an have a WITH c
22920 6c 61 75 73 65 2e 20 20 42 75 74 20 6d 61 6b 65  lause.  But make
22930 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f 74  .  ** sure no ot
22940 68 65 72 20 74 65 72 6d 73 20 61 72 65 20 6d 61  her terms are ma
22950 72 6b 65 64 20 53 46 5f 52 65 63 75 72 73 69 76  rked SF_Recursiv
22960 65 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 74 68  e in case someth
22970 69 6e 67 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ing changes.  **
22980 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a   in the future..
22990 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65 6c    */.  {.    Sel
229a0 65 63 74 20 2a 70 58 3b 20 20 0a 20 20 20 20 66  ect *pX;  .    f
229b0 6f 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b  or(pX=pSubq; pX;
229c0 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
229d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
229e0 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  pX->selFlags & (
229f0 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 3d 3d  SF_Recursive))==
22a00 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  0 );.    }.  }.#
22a10 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53 75  endif..  if( pSu
22a20 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b  bq->pLimit!=0 ){
22a30 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
22a40 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  * restriction (3
22a50 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ) */.  }.  while
22a60 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b  ( pWhere->op==TK
22a70 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e  _AND ){.    nChn
22a80 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65  g += pushDownWhe
22a90 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  reTerms(pParse, 
22aa0 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70  pSubq, pWhere->p
22ab0 52 69 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b  Right, iCursor);
22ac0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57  .    pWhere = pW
22ad0 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d  here->pLeft;.  }
22ae0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
22af0 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50  operty(pWhere,EP
22b00 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
22b10 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
22b20 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 69  ction (5) */.  i
22b30 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
22b40 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57  TableConstant(pW
22b50 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29  here, iCursor) )
22b60 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20  {.    nChng++;. 
22b70 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20     while( pSubq 
22b80 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f  ){.      SubstCo
22b90 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70  ntext x;.      p
22ba0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
22bb0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
22bc0 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20   pWhere, 0);.   
22bd0 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50     x.pParse = pP
22be0 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54  arse;.      x.iT
22bf0 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
22c00 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c        x.iNewTabl
22c10 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
22c20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
22c30 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c  = 0;.      x.pEL
22c40 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c  ist = pSubq->pEL
22c50 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ist;.      pNew 
22c60 3d 20 73 75 62 73 74 45 78 70 72 28 26 78 2c 20  = substExpr(&x, 
22c70 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
22c80 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73   pSubq->selFlags
22c90 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
22ca0 29 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  ){.        pSubq
22cb0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
22cc0 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
22cd0 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48  e->db, pSubq->pH
22ce0 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20  aving, pNew);.  
22cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22d00 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65     pSubq->pWhere
22d10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
22d20 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  d(pParse->db, pS
22d30 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65  ubq->pWhere, pNe
22d40 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
22d50 20 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d    pSubq = pSubq-
22d60 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20  >pPrior;.    }. 
22d70 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e   }.  return nChn
22d80 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  g;.}.#endif /* !
22d90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
22da0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
22db0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22dc0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
22dd0 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74  /*.** Based on t
22de0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
22df0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
22e00 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
22e10 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  y the first.** a
22e20 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75  rgument, this fu
22e30 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
22e40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
22e50 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
22e60 20 20 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f    * the query co
22e70 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69  ntains just a si
22e80 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65 20 66  ngle aggregate f
22e90 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a  unction,.**    *
22ea0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
22eb0 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65  unction is eithe
22ec0 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  r min() or max()
22ed0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68  , and.**    * th
22ee0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
22ef0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
22f00 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  tion is a column
22f10 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   value..**.** If
22f20 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
22f30 65 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e  e are true, then
22f40 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
22f50 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
22f60 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65  RBY_MAX.** is re
22f70 74 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70  turned as approp
22f80 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70  riate. Also, *pp
22f90 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f  MinMax is set to
22fa0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a   point to the .*
22fb0 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65  * list of argume
22fc0 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  nts passed to th
22fd0 65 20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f  e aggregate befo
22fe0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
22ff0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63  .** Or, if the c
23000 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
23010 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70  are not met, *pp
23020 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f  MinMax is set to
23030 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f   0 and.** WHERE_
23040 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69  ORDERBY_NORMAL i
23050 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
23060 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
23070 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41  uery(AggInfo *pA
23080 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74  ggInfo, ExprList
23090 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20   **ppMinMax){.  
230a0 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45  int eRet = WHERE
230b0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
230c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
230d0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
230e0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20  *ppMinMax = 0;. 
230f0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
23100 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45  Func==1 ){.    E
23110 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67  xpr *pExpr = pAg
23120 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
23130 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67  pExpr; /* Aggreg
23140 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ate function */.
23150 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
23160 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
23170 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41  pList;      /* A
23180 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20  rguments to agg 
23190 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  function */..   
231a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
231b0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
231c0 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ION );.    if( p
231d0 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
231e0 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c  >nExpr==1 && pEL
231f0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
23200 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
23210 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  MN ){.      cons
23220 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20  t char *zFunc = 
23230 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
23240 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
23250 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
23260 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20   "min")==0 ){.  
23270 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45        eRet = WHE
23280 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a  RE_ORDERBY_MIN;.
23290 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61          *ppMinMa
232a0 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  x = pEList;.    
232b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
232c0 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
232d0 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20  , "max")==0 ){. 
232e0 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48         eRet = WH
232f0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
23300 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d  .        *ppMinM
23310 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  ax = pEList;.   
23320 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
23330 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e    assert( *ppMin
23340 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69  Max==0 || (*ppMi
23350 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20  nMax)->nExpr==1 
23360 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74  );.  return eRet
23370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
23380 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
23390 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
233a0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
233b0 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
233c0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
233d0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
233e0 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
233f0 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
23400 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
23410 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
23420 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
23430 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
23440 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
23450 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
23460 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
23470 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
23480 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
23490 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
234a0 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
234b0 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
234c0 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
234d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
234e0 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
234f0 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
23500 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
23510 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
23520 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
23530 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
23540 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
23550 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
23560 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
23570 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
23580 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
23590 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
235a0 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
235b0 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
235c0 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
235d0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
235e0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
235f0 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
23600 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
23610 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
23620 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
23630 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
23640 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
23650 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
23660 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
23670 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
23680 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
23690 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
236a0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
236b0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
236c0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e  eturn 0;.  if( N
236d0 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e  EVER(pAggInfo->n
236e0 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72  Func==0) ) retur
236f0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
23700 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
23710 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26  Func->funcFlags&
23720 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
23730 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
23740 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
23750 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
23760 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
23770 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
23780 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
23790 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
237a0 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
237b0 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
237c0 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
237d0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
237e0 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
237f0 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
23800 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
23810 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
23820 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
23830 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
23840 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
23850 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
23860 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
23870 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
23880 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
23890 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
238a0 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
238b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
238c0 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
238d0 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
238e0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
238f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
23900 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
23910 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
23920 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
23930 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
23940 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
23950 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
23960 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d  ndexedBy = pFrom
23970 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b  ->u1.zIndexedBy;
23980 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
23990 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
239a0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
239b0 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
239c0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
239d0 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
239e0 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20  edBy); .        
239f0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
23a00 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
23a10 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
23a20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
23a30 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
23a40 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
23a50 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20  exedBy, 0);.    
23a60 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
23a70 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
23a80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
23a90 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
23aa0 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20  pFrom->pIBIndex 
23ab0 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
23ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23ad0 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
23ae0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
23af0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
23b00 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
23b10 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
23b20 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
23b30 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23b40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
23b50 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
23b60 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
23b70 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
23b80 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
23b90 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
23ba0 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
23bb0 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
23bc0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
23bd0 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
23be0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
23bf0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
23c00 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
23c10 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
23c20 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
23c30 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
23c40 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
23c50 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
23c60 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
23c70 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
23c80 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
23c90 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
23ca0 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
23cb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
23cc0 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
23cd0 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
23ce0 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
23cf0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
23d00 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
23d10 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
23d20 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
23d30 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
23d40 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
23d50 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
23d60 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
23d70 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
23d80 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
23d90 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
23da0 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
23db0 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
23dc0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
23dd0 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
23de0 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
23df0 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
23e00 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
23e10 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
23e20 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
23e30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
23e40 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
23e50 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
23e60 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
23e70 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
23e80 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
23e90 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
23ea0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
23eb0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
23ec0 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
23ed0 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
23ee0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
23ef0 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
23f00 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
23f10 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23f20 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
23f30 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
23f40 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23f50 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
23f60 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
23f70 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
23f80 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
23f90 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
23fa0 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
23fb0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
23fc0 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
23fd0 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
23fe0 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
23ff0 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
24000 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
24010 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
24020 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
24030 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
24040 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
24050 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
24060 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
24070 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
24080 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
24090 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
240a0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
240b0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
240c0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
240d0 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
240e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
240f0 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
24100 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
24110 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
24120 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
24130 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
24140 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
24150 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
24160 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
24170 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
24180 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
24190 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
241a0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
241b0 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
241c0 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
241d0 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
241e0 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
241f0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
24200 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
24210 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53  e3Expr(db, TK_AS
24220 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70  TERISK, 0));.  p
24230 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
24240 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
24250 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  0;.  pNew->pGrou
24260 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  pBy = 0;.  pNew-
24270 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  >pHaving = 0;.  
24280 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
24290 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   0;.  p->pPrior 
242a0 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  = 0;.  p->pNext 
242b0 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20  = 0;.  p->pWith 
242c0 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  = 0;.  p->selFla
242d0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
242e0 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  nd;.  assert( (p
242f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
24300 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b  Converted)==0 );
24310 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
24320 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a  = SF_Converted;.
24330 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
24340 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70  pPrior!=0 );.  p
24350 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  New->pPrior->pNe
24360 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
24370 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->pLimit = 0;. 
24380 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
24390 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
243a0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
243b0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
243c0 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   if the FROM cla
243d0 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68  use term pFrom h
243e0 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20  as table-valued 
243f0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75  function.** argu
24400 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f  ments.  If it do
24410 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  es, leave an err
24420 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
24430 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
24440 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e  ** non-zero, sin
24450 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20  ce pFrom is not 
24460 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20  allowed to be a 
24470 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
24480 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
24490 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e   int cannotBeFun
244a0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
244b0 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
244c0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
244d0 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66  {.  if( pFrom->f
244e0 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
244f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
24500 73 67 28 70 50 61 72 73 65 2c 20 22 27 25 73 27  sg(pParse, "'%s'
24510 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69   is not a functi
24520 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  on", pFrom->zNam
24530 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
24540 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
24550 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
24560 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
24570 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74  ** Argument pWit
24580 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  h (which may be 
24590 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20  NULL) points to 
245a0 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
245b0 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48   nested .** WITH
245c0 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20   contexts, from 
245d0 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f  inner to outermo
245e0 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  st. If the table
245f0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a   identified by .
24600 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ** FROM clause e
24610 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20  lement pItem is 
24620 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d  really a common-
24630 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e  table-expression
24640 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20   (CTE) .** then 
24650 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
24660 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69   to the CTE defi
24670 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nition for that 
24680 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65  table. Otherwise
24690 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  .** return NULL.
246a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d  .**.** If a non-
246b0 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65  NULL value is re
246c0 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43  turned, set *ppC
246d0 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20  ontext to point 
246e0 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f  to the With.** o
246f0 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72  bject that the r
24700 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f  eturned CTE belo
24710 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ngs to..*/.stati
24720 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65  c struct Cte *se
24730 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68  archWith(.  With
24740 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
24750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
24760 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74  urrent innermost
24770 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a   WITH clause */.
24780 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
24790 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20  _item *pItem,   
247a0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
247b0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f   element to reso
247c0 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a  lve */.  With **
247d0 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  ppContext       
247e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
247f0 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74   WITH clause ret
24800 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67  urn value belong
24810 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  s to */.){.  con
24820 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
24830 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
24840 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e  tabase==0 && (zN
24850 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ame = pItem->zNa
24860 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69  me)!=0 ){.    Wi
24870 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  th *p;.    for(p
24880 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e  =pWith; p; p=p->
24890 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69  pOuter){.      i
248a0 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
248b0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
248c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
248d0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
248e0 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e  (zName, p->a[i].
248f0 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
24900 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78         *ppContex
24910 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
24920 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d   return &p->a[i]
24930 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24940 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
24950 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
24960 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
24970 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73  or maintains a s
24980 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57  tack of active W
24990 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77  ITH clauses.** w
249a0 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f  ith the inner-mo
249b0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62  st WITH clause b
249c0 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20  eing at the top 
249d0 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
249e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
249f0 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48   pushes the WITH
24a00 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61   clause passed a
24a10 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
24a20 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68  ument.** onto th
24a30 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
24a40 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20  ck. If argument 
24a50 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74  bFree is true, t
24a60 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48  hen this.** WITH
24a70 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76   clause will nev
24a80 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f  er be popped fro
24a90 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20  m the stack. In 
24aa0 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20  this case it.** 
24ab0 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20  should be freed 
24ac0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50  along with the P
24ad0 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20  arse object. In 
24ae0 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65  other cases, whe
24af0 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74  n.** bFree==0, t
24b00 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77  he With object w
24b10 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f  ill be freed alo
24b20 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45  ng with the SELE
24b30 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  CT .** statement
24b40 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69   with which it i
24b50 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f  s associated..*/
24b60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
24b70 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  hPush(Parse *pPa
24b80 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68  rse, With *pWith
24b90 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61  , u8 bFree){.  a
24ba0 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20  ssert( bFree==0 
24bb0 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74  || (pParse->pWit
24bc0 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  h==0 && pParse->
24bd0 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20  pWithToFree==0) 
24be0 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  );.  if( pWith )
24bf0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
24c00 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69  arse->pWith!=pWi
24c10 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d  th );.    pWith-
24c20 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65  >pOuter = pParse
24c30 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
24c40 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
24c50 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65  th;.    if( bFre
24c60 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74  e ) pParse->pWit
24c70 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b  hToFree = pWith;
24c80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
24c90 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
24ca0 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70  ks if argument p
24cb0 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61  From refers to a
24cc0 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79   CTE declared by
24cd0 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75   .** a WITH clau
24ce0 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  se on the stack 
24cf0 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61  currently mainta
24d00 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ined by the pars
24d10 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63  er. And,.** if c
24d20 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
24d30 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73  ing a CTE expres
24d40 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61  sion, if it is a
24d50 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65   recursive.** re
24d60 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
24d70 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a  urrent CTE..**.*
24d80 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73  * If pFrom falls
24d90 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20   into either of 
24da0 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69  the two categori
24db0 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d  es above, pFrom-
24dc0 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68  >pTab.** and oth
24dd0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f  er fields are po
24de0 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e  pulated accordin
24df0 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  gly. The caller 
24e00 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20  should check.** 
24e10 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29  (pFrom->pTab!=0)
24e20 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
24e30 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73  ether or not a s
24e40 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a  uccessful match.
24e50 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a  ** was found..**
24e60 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
24e70 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f  ot a match is fo
24e80 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  und, SQLITE_OK i
24e90 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
24ea0 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
24eb0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  . If an error do
24ec0 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72  es occur, an err
24ed0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74  or message is st
24ee0 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ored in the.** p
24ef0 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65  arser and some e
24f00 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20  rror code other 
24f10 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72  than SQLITE_OK r
24f20 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
24f30 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e  ic int withExpan
24f40 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61  d(.  Walker *pWa
24f50 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20  lker, .  struct 
24f60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
24f70 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a  rom.){.  Parse *
24f80 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
24f90 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
24fa0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
24fb0 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43  ->db;.  struct C
24fc0 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20  te *pCte;       
24fd0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
24fe0 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20  ed CTE (or NULL 
24ff0 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a  if no match) */.
25000 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20    With *pWith;  
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25020 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65    /* WITH clause
25030 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e   that pCte belon
25040 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
25050 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
25060 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20  =0 );..  pCte = 
25070 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73  searchWith(pPars
25080 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c  e->pWith, pFrom,
25090 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20   &pWith);.  if( 
250a0 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c  pCte ){.    Tabl
250b0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70  e *pTab;.    Exp
250c0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
250d0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
250e0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65  .    Select *pLe
250f0 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
25100 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20     /* Left-most 
25110 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25120 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79   */.    int bMay
25130 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20  Recursive;      
25140 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25150 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64   compound joined
25160 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20   by UNION [ALL] 
25170 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61  */.    With *pSa
25180 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20  vedWith;        
25190 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
251a0 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d  value of pParse-
251b0 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f  >pWith */..    /
251c0 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  * If pCte->zCteE
251d0 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  rr is non-NULL a
251e0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
251f0 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c  en this is an il
25200 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63  legal.    ** rec
25210 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
25220 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65   to CTE pCte. Le
25230 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
25240 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
25250 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20  n.    ** early. 
25260 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  If pCte->zCteErr
25270 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
25280 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63  his is not a rec
25290 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
252a0 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
252b0 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20   case, proceed. 
252c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65   */.    if( pCte
252d0 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20  ->zCteErr ){.   
252e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
252f0 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d  sg(pParse, pCte-
25300 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e  >zCteErr, pCte->
25310 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
25320 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25330 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
25340 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
25350 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  n(pParse, pFrom)
25360 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
25370 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73  _ERROR;..    ass
25380 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
25390 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d  ==0 );.    pFrom
253a0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
253b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
253c0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
253d0 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20  able));.    if( 
253e0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
253f0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25400 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
25410 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
25420 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
25430 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
25440 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
25450 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
25460 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
25470 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
25480 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
25490 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
254a0 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
254b0 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
254c0 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c  al | TF_NoVisibl
254d0 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f  eRowid;.    pFro
254e0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
254f0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
25500 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c  , pCte->pSelect,
25510 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
25520 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
25530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
25540 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  MEM_BKPT;.    as
25550 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
25560 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  lect );..    /* 
25570 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
25580 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
25590 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20  . */.    pSel = 
255a0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
255b0 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76      bMayRecursiv
255c0 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d  e = ( pSel->op==
255d0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e  TK_ALL || pSel->
255e0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
255f0 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
25600 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
25610 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c  nt i;.      SrcL
25620 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f  ist *pSrc = pFro
25630 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
25640 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
25650 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
25660 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
25670 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
25680 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
25690 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >a[i];.        i
256a0 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
256b0 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ase==0 .        
256c0 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
256d0 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
256e0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
256f0 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
25700 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20   pCte->zName).  
25710 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
25720 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
25730 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
25740 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52     pItem->fg.isR
25750 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
25760 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54          pTab->nT
25770 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  abRef++;.       
25780 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
25790 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76  s |= SF_Recursiv
257a0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
257b0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
257c0 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75  /* Only one recu
257d0 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
257e0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f  is permitted. */
257f0 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e   .    if( pTab->
25800 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20  nTabRef>2 ){.   
25810 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
25820 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  sg(.          pP
25830 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20  arse, "multiple 
25840 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65  references to re
25850 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25  cursive table: %
25860 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a  s", pCte->zName.
25870 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
25880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
25890 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OR;.    }.    as
258a0 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62  sert( pTab->nTab
258b0 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20  Ref==1 || .     
258c0 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73         ((pSel->s
258d0 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
258e0 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
258f0 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20  TabRef==2 ));.. 
25900 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
25910 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
25920 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
25930 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
25940 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
25950 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25960 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
25970 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
25980 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
25990 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50  Prior = pSel->pP
259a0 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65  rior;.      asse
259b0 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74  rt( pPrior->pWit
259c0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
259d0 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53  rior->pWith = pS
259e0 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20  el->pWith;.     
259f0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
25a00 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69  ct(pWalker, pPri
25a10 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  or);.      pPrio
25a20 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20  r->pWith = 0;.  
25a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
25a40 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
25a50 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
25a60 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
25a70 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
25a80 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
25a90 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
25aa0 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
25ab0 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
25ac0 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
25ad0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
25ae0 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
25af0 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
25b00 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
25b10 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  !=pCte->pCols->n
25b20 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
25b30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25b40 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
25b50 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20  s has %d values 
25b60 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
25b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74  .            pCt
25b80 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74  e->zName, pEList
25b90 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70  ->nExpr, pCte->p
25ba0 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20  Cols->nExpr.    
25bb0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
25bc0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
25bd0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20  SavedWith;.     
25be0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25bf0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
25c00 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
25c10 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20  Cte->pCols;.    
25c20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  }..    sqlite3Co
25c30 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
25c40 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
25c50 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
25c60 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
25c70 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
25c80 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
25c90 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
25ca0 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
25cb0 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
25cc0 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70  CteErr = "multip
25cd0 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  le recursive ref
25ce0 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20  erences: %s";.  
25cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25d00 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
25d10 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65   = "recursive re
25d20 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62  ference in a sub
25d30 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20  query: %s";.    
25d40 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
25d50 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
25d60 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
25d70 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  }.    pCte->zCte
25d80 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
25d90 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
25da0 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
25db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25dc0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
25dd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25de0 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
25df0 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
25e00 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
25e10 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
25e20 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
25e30 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
25e40 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
25e50 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
25e60 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
25e70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
25e80 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
25e90 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
25ea0 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
25eb0 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
25ec0 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
25ed0 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
25ee0 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
25ef0 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
25f00 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
25f10 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
25f20 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
25f30 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
25f40 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
25f50 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
25f60 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
25f70 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
25f80 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57  .  if( OK_IF_ALW
25f90 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d  AYS_TRUE(pParse-
25fa0 3e 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50  >pWith) && p->pP
25fb0 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57  rior==0 ){.    W
25fc0 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
25fd0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
25fe0 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57  With;.    if( pW
25ff0 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ith!=0 ){.      
26000 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
26010 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a  pWith==pWith );.
26020 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
26030 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75  ith = pWith->pOu
26040 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ter;.    }.  }.}
26050 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73  .#else.#define s
26060 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23  electPopWith 0.#
26070 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
26080 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57  s routine is a W
26090 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  alker callback f
260a0 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61  or "expanding" a
260b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
260c0 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67  t..** "Expanding
260d0 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68  " means to do th
260e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
260f0 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
26100 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
26110 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
26120 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
26130 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
26140 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
26150 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
26160 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
26170 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
26180 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
26190 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
261a0 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
261b0 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
261c0 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
261d0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
261e0 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
261f0 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
26200 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
26210 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
26220 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
26230 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
26240 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
26250 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
26260 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
26270 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
26280 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
26290 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
262a0 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
262b0 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
262c0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
262d0 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
262e0 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
262f0 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73  sing up the pers
26300 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
26310 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
26320 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
26330 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
26340 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
26350 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
26360 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  ommodate the NAT
26370 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
26380 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
26390 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
263a0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
263b0 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
263c0 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
263d0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
263e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
263f0 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
26400 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
26410 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
26420 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
26430 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
26440 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
26450 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
26460 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
26470 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
26480 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
26490 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
264a0 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
264b0 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
264c0 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
264d0 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  nt selectExpande
264e0 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
264f0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
26500 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
26510 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
26520 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
26530 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
26540 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
26550 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
26560 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
26570 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
26580 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
26590 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20  db;.  Expr *pE, 
265a0 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b  *pRight, *pExpr;
265b0 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20  .  u16 selFlags 
265c0 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a  = p->selFlags;..
265d0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
265e0 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
265f0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
26600 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
26610 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26620 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70   }.  if( NEVER(p
26630 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73  ->pSrc==0) || (s
26640 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
26650 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  anded)!=0 ){.   
26660 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
26670 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  e;.  }.  pTabLis
26680 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
26690 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
266a0 74 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41  t;.  if( OK_IF_A
266b0 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70 57  LWAYS_TRUE(p->pW
266c0 69 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ith) ){.    sqli
266d0 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72  te3WithPush(pPar
266e0 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30 29  se, p->pWith, 0)
266f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
26700 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
26710 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
26720 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
26730 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
26740 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
26750 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
26760 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
26770 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
26780 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
26790 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
267a0 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
267b0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
267c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
267d0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
267e0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
267f0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
26800 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
26810 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
26820 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
26830 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
26840 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
26850 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
26860 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
26870 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
26880 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
26890 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
268a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
268b0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
268c0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
268d0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67  ssert( pFrom->fg
268e0 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  .isRecursive==0 
268f0 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  || pFrom->pTab!=
26900 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  0 );.    if( pFr
26910 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
26920 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
26930 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26940 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66  ->pTab==0 );.#if
26950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26960 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
26970 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
26980 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
26990 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
269a0 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
269b0 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
269c0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
269d0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
269e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
269f0 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
26a00 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
26a10 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
26a20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
26a30 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
26a40 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
26a50 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
26a60 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
26a70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
26a80 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
26a90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
26aa0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
26ab0 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72  r, pSel) ) retur
26ac0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
26ad0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
26ae0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
26af0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
26b00 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
26b10 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
26b20 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
26b30 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62  bort;.      pTab
26b40 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
26b50 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
26b60 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
26b70 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
26b80 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
26b90 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  db, pFrom->zAlia
26ba0 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
26bb0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
26bc0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
26bd0 72 69 6e 74 66 28 64 62 2c 20 22 73 75 62 71 75  rintf(db, "subqu
26be0 65 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29  ery_%p", (void*)
26bf0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pTab);.      }. 
26c00 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
26c10 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
26c20 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
26c30 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
26c40 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
26c50 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
26c60 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e  ->pEList,&pTab->
26c70 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c  nCol,&pTab->aCol
26c80 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  );.      pTab->i
26c90 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20  PKey = -1;.     
26ca0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
26cb0 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
26cc0 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
26cd0 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
26ce0 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
26cf0 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
26d00 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eral;.#endif.   
26d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
26d20 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
26d30 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
26d40 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
26d50 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
26d60 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
26d70 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
26d80 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
26d90 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
26da0 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
26db0 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20  0, pFrom);.     
26dc0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
26dd0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26de0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
26df0 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66  >nTabRef>=0xffff
26e00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26e10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26e20 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65  se, "too many re
26e30 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73  ferences to \"%s
26e40 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a  \": max 65535",.
26e50 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
26e60 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
26e70 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30   pFrom->pTab = 0
26e80 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26e90 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
26ea0 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
26eb0 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20  nTabRef++;.     
26ec0 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
26ed0 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42  pTab) && cannotB
26ee0 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  eFunction(pParse
26ef0 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
26f00 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
26f10 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69  bort;.      }.#i
26f20 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
26f30 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
26f40 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
26f50 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
26f60 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73  LE).      if( Is
26f70 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
26f80 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
26f90 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43  {.        i16 nC
26fa0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ol;.        if( 
26fb0 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
26fc0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
26fd0 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
26fe0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
26ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
27000 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
27010 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
27020 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
27030 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
27040 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
27050 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27060 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
27070 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70  From->pSelect, p
27080 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
27090 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62       nCol = pTab
270a0 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
270b0 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  pTab->nCol = -1;
270c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
270d0 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
270e0 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
270f0 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  ct);.        pTa
27100 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  b->nCol = nCol;.
27110 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
27120 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63     }..    /* Loc
27130 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ate the index na
27140 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58  med by the INDEX
27150 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66  ED BY clause, if
27160 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
27170 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
27180 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  yLookup(pParse, 
27190 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
271a0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
271b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
271c0 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
271d0 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
271e0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
271f0 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
27200 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
27210 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
27220 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
27230 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
27240 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
27250 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  rt;.  }..  /* Fo
27260 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
27270 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
27280 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
27290 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
272a0 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
272b0 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
272c0 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
272d0 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
272e0 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
272f0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
27300 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
27310 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
27320 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
27330 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
27340 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74  _ASTERISK operat
27350 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
27360 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
27370 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a   the column.  **
27380 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c   list.  The foll
27390 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
273a0 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
273b0 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20  e TK_ASTERISK.  
273c0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
273d0 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f  nd expand each o
273e0 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
273f0 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
27400 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73  .  ** all tables
27410 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
27420 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
27430 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
27440 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
27450 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
27460 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
27470 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
27480 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
27490 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
274a0 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61    pE = pEList->a
274b0 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
274c0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  f( pE->op==TK_AS
274d0 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a  TERISK ) break;.
274e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
274f0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
27500 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
27510 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
27520 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45  p!=TK_DOT || (pE
27530 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45  ->pLeft!=0 && pE
27540 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
27550 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ID) );.    if( p
27560 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
27570 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
27580 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62  =TK_ASTERISK ) b
27590 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
275a0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
275b0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
275c0 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
275d0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
275e0 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
275f0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
27600 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
27610 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
27620 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
27630 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
27640 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
27650 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
27660 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
27670 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
27680 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
27690 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
276a0 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
276b0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
276c0 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
276d0 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
276e0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
276f0 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
27700 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
27710 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27730 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
27740 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
27750 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
27760 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
27770 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
27780 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
27790 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69  pExpr;.      pRi
277a0 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
277b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
277c0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
277d0 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
277e0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
277f0 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20  =TK_ASTERISK.   
27800 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d      && (pE->op!=
27810 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
27820 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53  ->op!=TK_ASTERIS
27830 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  K).      ){.    
27840 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
27850 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
27860 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
27870 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
27880 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27890 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
278a0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
278b0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
278c0 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
278d0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
278e0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
278f0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
27900 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
27910 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
27920 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
27930 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
27940 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
27950 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
27960 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
27970 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
27980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
27990 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
279a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
279b0 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
279c0 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
279d0 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
279e0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
279f0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
27a00 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
27a10 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
27a20 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
27a30 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
27a40 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
27a50 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
27a60 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
27a70 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
27a80 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
27a90 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
27aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
27ab0 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
27ac0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
27ad0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
27ae0 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
27af0 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
27b00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
27b10 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
27b20 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
27b30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
27b40 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
27b50 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
27b60 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
27b70 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
27b80 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
27b90 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
27ba0 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
27bb0 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
27bc0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
27bd0 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
27be0 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
27bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
27c00 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
27c10 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
27c20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
27c30 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
27c40 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
27c50 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
27c60 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
27c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27c80 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
27c90 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
27ca0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
27cb0 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
27cc0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
27cd0 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
27ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
27cf0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
27d00 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
27d10 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
27d20 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
27d30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
27d40 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27d50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27d60 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
27d70 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
27d80 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
27d90 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
27da0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
27db0 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
27dc0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
27dd0 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
27de0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
27df0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
27e00 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
27e10 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
27e20 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
27e30 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
27e40 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
27e50 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
27e60 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
27e70 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
27e80 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
27e90 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
27ea0 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
27eb0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
27ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
27ed0 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
27ee0 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
27ef0 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
27f00 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
27f10 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
27f20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27f30 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
27f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
27f50 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
27f60 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
27f70 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
27f80 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
27f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
27fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
27fb0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
27fc0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
27fd0 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
27fe0 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
27ff0 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74  hidden', omit it
28000 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64   from the expand
28010 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
28020 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
28030 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c  t unless the SEL
28040 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49  ECT has the SF_I
28050 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20  ncludeHidden.   
28060 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20           ** bit 
28070 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  set..           
28080 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28090 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
280a0 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64   & SF_IncludeHid
280b0 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  den)==0.        
280c0 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e       && IsHidden
280d0 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
280e0 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20  ol[j]) .        
280f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
28100 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28110 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28120 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
28130 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
28140 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
28150 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
28160 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
28170 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pFrom->fg.jointy
28180 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
28190 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
281a0 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43      && tableAndC
281b0 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c  olumnIndex(pTabL
281c0 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  ist, i, zName, 0
281d0 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  , 0).           
281e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
281f0 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
28200 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
28210 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
28220 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
28230 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
28240 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68  able to the righ
28250 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
28260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28270 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28280 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28290 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
282a0 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
282b0 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pFrom->pUsing, z
282c0 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
282d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
282e0 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
282f0 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
28300 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
28310 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
28320 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
28330 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
28340 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
28350 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
28360 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
28370 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28390 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
283a0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
283b0 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  K_ID, zName);.  
283c0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
283d0 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
283e0 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
283f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
28400 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c   if( longNames |
28410 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
28420 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
28430 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
28440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28450 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
28460 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54  pr(db, TK_ID, zT
28470 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
28480 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
28490 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
284a0 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
284b0 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
284c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
284d0 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
284f0 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
28500 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
28510 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
28520 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
28530 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
28540 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
28550 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  Left, pExpr);.  
28560 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28570 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28580 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
285a0 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
285b0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
285c0 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
285d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
285e0 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
285f0 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
28600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28610 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28620 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
28630 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
28640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28650 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
28660 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
28670 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
28680 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
28690 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
286a0 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20  Init(&sColname, 
286b0 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
286c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
286d0 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
286e0 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
286f0 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
28700 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
28710 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
28720 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
28730 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
28740 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
28750 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20  List_item *pX = 
28760 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e  &pNew->a[pNew->n
28770 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20  Expr-1];.       
28780 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20         if( pSub 
28790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
287a0 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
287b0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
287c0 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  b, pSub->pEList-
287d0 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[j].zSpan);.  
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
287f0 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
28800 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
28810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
28830 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
28840 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
28850 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %s.%s",.        
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28880 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20     zSchemaName, 
28890 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  zTabName, zColna
288a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
288b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
288c0 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
288f0 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b  >bSpanIsTab = 1;
28900 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28910 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28920 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
28930 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
28940 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28950 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
28960 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
28970 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
28980 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28990 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
289a0 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
289b0 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
289c0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
289d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
289e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
289f0 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
28a00 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
28a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28a20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28a30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
28a40 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
28a50 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
28a60 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
28a70 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
28a80 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
28a90 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
28aa0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d  EList->nExpr>db-
28ab0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
28ac0 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
28ad0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
28ae0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
28af0 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
28b00 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
28b10 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
28b20 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ort;.  }.#endif.
28b30 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28b40 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28b50 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
28b60 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
28b70 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
28b80 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
28b90 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
28ba0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
28bb0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
28bc0 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
28bd0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
28be0 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
28bf0 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
28c00 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
28c10 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
28c20 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
28c30 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
28c40 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
28c50 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
28c60 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
28c70 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
28c80 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
28c90 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
28ca0 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e  rser tree..*/.in
28cb0 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  t sqlite3ExprWal
28cc0 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
28cd0 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *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 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28d30 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
28d40 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
28d50 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45   walker for SELE
28d60 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
28d70 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
28d80 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
28d90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
28da0 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  ectWalkNoop(Walk
28db0 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
28dc0 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
28dd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28de0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
28df0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
28e00 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28e10 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
28e20 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20  UG./*.** Always 
28e30 61 73 73 65 72 74 2e 20 20 54 68 69 73 20 78 53  assert.  This xS
28e40 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69  electCallback2 i
28e50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72  mplementation pr
28e60 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  oves that the.**
28e70 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
28e80 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b  2 is never invok
28e90 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
28ea0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73  te3SelectWalkAss
28eb0 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  ert2(Walker *Not
28ec0 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  Used, Select *No
28ed0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
28ee0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
28ef0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
28f00 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
28f10 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54  }.#endif./*.** T
28f20 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
28f30 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
28f40 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
28f50 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
28f60 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
28f70 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
28f80 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
28f90 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
28fa0 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
28fb0 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
28fc0 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
28fd0 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
28fe0 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
28ff0 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
29000 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
29010 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
29020 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
29030 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
29040 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
29050 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29060 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
29070 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
29080 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
29090 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
290a0 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
290b0 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
290c0 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
290d0 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
290e0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
290f0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
29100 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
29110 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
29120 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
29130 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
29140 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
29150 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
29160 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
29170 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
29180 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
29190 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
291a0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
291b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
291c0 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
291d0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
291e0 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
291f0 54 52 55 45 28 70 50 61 72 73 65 2d 3e 68 61 73  TRUE(pParse->has
29200 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20  Compound) ){.   
29210 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
29220 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70  ck = convertComp
29230 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
29240 75 65 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c  uery;.    w.xSel
29250 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30  ectCallback2 = 0
29260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
29270 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
29280 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53  ect);.  }.  w.xS
29290 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
292a0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
292b0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
292c0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70  ack2 = selectPop
292d0 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57  With;.  sqlite3W
292e0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
292f0 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
29300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29310 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
29320 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
29330 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
29340 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
29350 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
29360 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
29370 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
29380 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
29390 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
293a0 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
293b0 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
293c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
293d0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
293e0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
293f0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
29400 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
29410 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
29420 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
29430 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
29440 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
29450 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
29460 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
29470 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
29480 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
29490 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
294a0 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
294b0 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
294c0 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
294d0 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
294e0 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
294f0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
29500 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
29510 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
29520 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
29530 64 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  d selectAddSubqu
29540 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
29550 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
29560 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
29570 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
29580 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
29590 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
295a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
295b0 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
295c0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
295d0 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
295e0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
295f0 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
29600 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70  eInfo)==0 );.  p
29610 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
29620 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20  _HasTypeInfo;.  
29630 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
29640 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62  ->pParse;.  pTab
29650 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
29660 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
29670 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
29680 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
29690 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
296a0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
296b0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
296c0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
296d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  0 );.    if( (pT
296e0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
296f0 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
29700 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ){.      /* A su
29710 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
29720 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
29730 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
29740 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
29750 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
29760 20 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b       if( pSel ){
29770 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
29780 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70  pSel->pPrior ) p
29790 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
297a0 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  or;.        sqli
297b0 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75  te3SelectAddColu
297c0 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
297d0 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
297e0 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
297f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
29800 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
29810 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
29820 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
29830 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
29840 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
29850 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
29860 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
29870 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
29880 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
29890 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
298a0 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
298b0 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
298c0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
298d0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
298e0 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
298f0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
29900 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
29910 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
29920 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
29930 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
29940 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
29950 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
29960 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65  alkNoop;.  w.xSe
29970 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
29980 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
29990 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78  yTypeInfo;.  w.x
299a0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
299b0 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
299c0 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
299d0 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
299e0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
299f0 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69   pSelect);.#endi
29a00 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f.}.../*.** This
29a10 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
29a20 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
29a30 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
29a40 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ng.  The.** foll
29a50 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  owing is accompl
29a60 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ished:.**.**    
29a70 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20   *  VDBE Cursor 
29a80 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69  numbers are assi
29a90 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d  gned to all FROM
29aa0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a  -clause terms..*
29ab0 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72  *     *  Ephemer
29ac0 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73  al Table objects
29ad0 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
29ae0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
29af0 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
29b00 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53      *  ON and US
29b10 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
29b20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45  shifted into WHE
29b30 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  RE statements.**
29b40 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64       *  Wildcard
29b50 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45  s "*" and "TABLE
29b60 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65  .*" in result se
29b70 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ts are expanded.
29b80 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74  .**     *  Ident
29b90 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73  ifiers in expres
29ba0 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64  sion are matched
29bb0 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   to tables..**.*
29bc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
29bd0 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20  cts recursively 
29be0 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65  on all subquerie
29bf0 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c  s within the SEL
29c00 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
29c10 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a  ite3SelectPrep(.
29c20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
29c30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29c40 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
29c50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
29c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29c70 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
29c80 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
29c90 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
29ca0 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e   *pOuterNC  /* N
29cb0 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
29cc0 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a  container */.){.
29cd0 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 7c    assert( p!=0 |
29ce0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
29cf0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
29d00 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
29d10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
29d20 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
29d30 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
29d40 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
29d50 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
29d60 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65  ectExpand(pParse
29d70 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , p);.  if( pPar
29d80 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
29d90 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
29da0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
29db0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
29dc0 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73  electNames(pPars
29dd0 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b  e, p, pOuterNC);
29de0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
29df0 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
29e00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29e10 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
29e20 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
29e30 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b  Info(pParse, p);
29e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
29e50 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
29e60 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
29e70 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
29e80 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
29e90 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
29ea0 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
29eb0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
29ec0 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
29ed0 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
29ee0 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
29ef0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
29f00 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65   code that store
29f10 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
29f20 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a  f those memory.*
29f30 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * cells..*/.stat
29f40 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
29f50 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
29f60 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
29f70 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
29f80 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
29f90 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
29fa0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
29fb0 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
29fc0 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49  int nReg = pAggI
29fd0 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67  nfo->nFunc + pAg
29fe0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  gInfo->nColumn;.
29ff0 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20    if( nReg==0 ) 
2a000 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53  return;.#ifdef S
2a010 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
2a020 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c   Verify that all
2a030 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65   AggInfo registe
2a040 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68  rs are within th
2a050 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65  e range specifie
2a060 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66  d by.  ** AggInf
2a070 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f  o.mnReg..AggInfo
2a080 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65  .mxReg */.  asse
2a090 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e  rt( nReg==pAggIn
2a0a0 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e  fo->mxReg-pAggIn
2a0b0 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20  fo->mnReg+1 );. 
2a0c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
2a0d0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
2a0e0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
2a0f0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2a100 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
2a110 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
2a120 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
2a130 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  Col[i].iMem<=pAg
2a140 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
2a150 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2a160 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2a170 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2a180 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  rt( pAggInfo->aF
2a190 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  unc[i].iMem>=pAg
2a1a0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
2a1b0 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
2a1c0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
2a1d0 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
2a1e0 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  g );.  }.#endif.
2a1f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a200 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
2a210 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  0, pAggInfo->mnR
2a220 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg, pAggInfo->mx
2a230 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e  Reg);.  for(pFun
2a240 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
2a250 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
2a260 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2a270 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66  pFunc++){.    if
2a280 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
2a290 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
2a2a0 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
2a2b0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
2a2c0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2a2d0 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49  operty(pE, EP_xI
2a2e0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2a2f0 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73    if( pE->x.pLis
2a300 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c  t==0 || pE->x.pL
2a310 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  ist->nExpr!=1 ){
2a320 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a330 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2a340 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65   "DISTINCT aggre
2a350 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20  gates must have 
2a360 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20  exactly one ".  
2a370 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65           "argume
2a380 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  nt");.        pF
2a390 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
2a3a0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
2a3b0 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
2a3c0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
2a3d0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2a3e0 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
2a3f0 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pList, 0, 0);.  
2a400 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a410 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2a420 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
2a430 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
2a440 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a460 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
2a470 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2a480 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2a490 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
2a4a0 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
2a4b0 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
2a4c0 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
2a4d0 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
2a4e0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
2a4f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2a500 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
2a510 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
2a520 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2a530 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2a540 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2a550 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2a560 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2a570 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
2a580 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2a590 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2a5a0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2a5b0 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
2a5c0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
2a5d0 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
2a5e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
2a5f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
2a600 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
2a610 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71  elect) );.    sq
2a620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2a630 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
2a640 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20  pF->iMem, pList 
2a650 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
2a660 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2a670 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
2a680 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
2a690 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NCDEF);.  }.}../
2a6a0 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
2a6b0 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
2a6c0 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
2a6d0 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
2a6e0 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
2a6f0 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2a700 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2a710 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
2a720 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
2a730 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
2a740 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2a750 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2a760 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
2a770 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69   regHit = 0;.  i
2a780 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d  nt addrHitTest =
2a790 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   0;.  struct Agg
2a7a0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
2a7b0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2a7c0 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
2a7d0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
2a7e0 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
2a7f0 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
2a800 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
2a810 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
2a820 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
2a830 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
2a840 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
2a850 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
2a860 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
2a870 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
2a880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2a890 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a8a0 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
2a8b0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
2a8c0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2a8d0 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e    nArg = pList->
2a8e0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67  nExpr;.      reg
2a8f0 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Agg = sqlite3Get
2a900 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2a910 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73  , nArg);.      s
2a920 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2a930 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2a940 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c  List, regAgg, 0,
2a950 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
2a960 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2a970 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
2a980 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
2a990 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
2a9a0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
2a9b0 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
2a9c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2a9d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2a9e0 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
2a9f0 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72  ==0 );  /* Error
2aa00 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20   condition */.  
2aa10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
2aa20 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73  rg>1 );   /* Als
2aa30 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  o an error */.  
2aa40 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
2aa50 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69  (pParse, pF->iDi
2aa60 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74  stinct, addrNext
2aa70 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20  , 1, regAgg);.  
2aa80 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
2aa90 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
2aaa0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
2aab0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
2aac0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
2aad0 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
2aae0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2aaf0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
2ab00 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
2ab10 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
2ab20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
2ab30 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
2ab40 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
2ab50 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
2ab60 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
2ab70 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
2ab80 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2ab90 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2aba0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2abb0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
2abc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2abd0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
2abe0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
2abf0 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
2ac00 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
2ac10 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
2ac20 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
2ac30 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
2ac40 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
2ac50 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2ac60 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2ac70 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
2ac80 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
2ac90 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
2aca0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
2acb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2acc0 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op3(v, OP_AggSte
2acd0 70 30 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  p0, 0, regAgg, p
2ace0 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71  F->iMem);.    sq
2acf0 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
2ad00 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20  4(v, pF->pFunc, 
2ad10 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
2ad20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2ad30 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
2ad40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2ad50 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
2ad60 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
2ad70 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
2ad80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2ad90 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2ada0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
2adb0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
2adc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2add0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2ade0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
2adf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2ae00 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2ae10 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
2ae20 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
2ae30 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
2ae40 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
2ae50 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
2ae60 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
2ae70 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
2ae80 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
2ae90 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
2aea0 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
2aeb0 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
2aec0 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
2aed0 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
2aee0 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
2aef0 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
2af00 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
2af10 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
2af20 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
2af30 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
2af40 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
2af50 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
2af60 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
2af70 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
2af80 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
2af90 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
2afa0 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
2afb0 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
2afc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
2afd0 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
2afe0 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
2aff0 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
2b000 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
2b010 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
2b020 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
2b030 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
2b040 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
2b050 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2b060 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
2b070 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  gHit); VdbeCover
2b080 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
2b090 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2b0a0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
2b0b0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
2b0c0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
2b0d0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2b0e0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
2b0f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2b100 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
2b110 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
2b120 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
2b130 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
2b140 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
2b150 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2b160 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69  e);.  if( addrHi
2b170 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c  tTest ){.    sql
2b180 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2b190 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29  (v, addrHitTest)
2b1a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2b1b0 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45  dd a single OP_E
2b1c0 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
2b1d0 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74  on to the VDBE t
2b1e0 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70  o explain a simp
2b1f0 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71  le.** count(*) q
2b200 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f  uery ("SELECT co
2b210 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62  unt(*) FROM pTab
2b220 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ")..*/.#ifndef S
2b230 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
2b240 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  IN.static void e
2b250 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2b260 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
2b270 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2b280 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
2b290 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
2b2a0 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
2b2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
2b2c0 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
2b2d0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
2b2e0 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
2b2f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2b300 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
2b310 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a   scan, or NULL *
2b320 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
2b330 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
2b340 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20  .    int bCover 
2b350 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48  = (pIdx!=0 && (H
2b360 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
2b370 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
2b380 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20  dex(pIdx)));.   
2b390 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71   char *zEqp = sq
2b3a0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
2b3b0 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54  rse->db, "SCAN T
2b3c0 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20  ABLE %s%s%s",.  
2b3d0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
2b3e0 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  e,.        bCove
2b3f0 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45  r ? " USING COVE
2b400 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22  RING INDEX " : "
2b410 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  ",.        bCove
2b420 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  r ? pIdx->zName 
2b430 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  : "".    );.    
2b440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b450 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  4(.        pPars
2b460 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70  e->pVdbe, OP_Exp
2b470 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
2b480 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
2b490 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  Eqp, P4_DYNAMIC.
2b4a0 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
2b4b0 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
2b4c0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
2b4d0 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
2b4e0 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
2b4f0 63 74 20 66 6f 72 20 68 61 76 69 6e 67 54 6f 57  ct for havingToW
2b500 68 65 72 65 45 78 70 72 43 62 28 29 2e 0a 2a 2f  hereExprCb()..*/
2b510 0a 73 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f  .struct HavingTo
2b520 57 68 65 72 65 43 74 78 20 7b 0a 20 20 45 78 70  WhereCtx {.  Exp
2b530 72 20 2a 2a 70 70 57 68 65 72 65 3b 0a 20 20 45  r **ppWhere;.  E
2b540 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
2b550 79 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  y;.};../*.** sql
2b560 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63  ite3WalkExpr() c
2b570 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
2b580 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e  havingToWhere().
2b590 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
2b5a0 64 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  de passed to the
2b5b0 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54   callback is a T
2b5c0 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75  K_AND node, retu
2b5d0 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69  rn .** WRC_Conti
2b5e0 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69  nue to tell sqli
2b5f0 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f  te3WalkExpr() to
2b600 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2b610 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a   child nodes..**
2b620 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
2b630 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e  eturn WRC_Prune.
2b640 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
2b650 6c 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65  lso check if the
2b660 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73   .** sub-express
2b670 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20  ion matches the 
2b680 63 72 69 74 65 72 69 61 20 66 6f 72 20 62 65 69  criteria for bei
2b690 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  ng moved to the 
2b6a0 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e  WHERE.** clause.
2b6b0 20 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74   If so, add it t
2b6c0 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2b6d0 73 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74  se and replace t
2b6e0 68 65 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f  he sub-expressio
2b6f0 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  n.** within the 
2b700 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f  HAVING expressio
2b710 6e 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e  n with a constan
2b720 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  t "1"..*/.static
2b730 20 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65   int havingToWhe
2b740 72 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20  reExprCb(Walker 
2b750 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2b760 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
2b770 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20  xpr->op!=TK_AND 
2b780 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 48 61  ){.    struct Ha
2b790 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20 2a  vingToWhereCtx *
2b7a0 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
2b7b0 48 61 76 69 6e 67 43 74 78 3b 0a 20 20 20 20 69  HavingCtx;.    i
2b7c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
2b7d0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
2b7e0 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  y(pWalker->pPars
2b7f0 65 2c 20 70 45 78 70 72 2c 20 70 2d 3e 70 47 72  e, pExpr, p->pGr
2b800 6f 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20 20  oupBy) ){.      
2b810 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2b820 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64  alker->pParse->d
2b830 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
2b840 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
2b850 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e  rAlloc(db, TK_IN
2b860 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49  TEGER, &sqlite3I
2b870 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
2b880 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
2b890 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
2b8a0 2a 70 57 68 65 72 65 20 3d 20 2a 28 70 2d 3e 70  *pWhere = *(p->p
2b8b0 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
2b8c0 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65   SWAP(Expr, *pNe
2b8d0 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20  w, *pExpr);.    
2b8e0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
2b8f0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57  e3ExprAnd(db, pW
2b900 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20  here, pNew);.   
2b910 20 20 20 20 20 2a 28 70 2d 3e 70 70 57 68 65 72       *(p->ppWher
2b920 65 29 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  e) = pNew;.     
2b930 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
2b940 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2b950 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2b960 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2b970 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c 69 67  ** Transfer elig
2b980 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ible terms from 
2b990 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
2b9a0 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20 77 68  e of a query, wh
2b9b0 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73  ich is.** proces
2b9c0 73 65 64 20 61 66 74 65 72 20 67 72 6f 75 70 69  sed after groupi
2b9d0 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45 52 45  ng, to the WHERE
2b9e0 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68 20 69   clause, which i
2b9f0 73 20 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f  s processed befo
2ba00 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20  re.** grouping. 
2ba10 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
2ba20 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
2ba30 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74  SELECT * FROM <t
2ba40 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f  ables> WHERE a=?
2ba50 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
2ba60 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a  NG b=? AND c=?.*
2ba70 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72  *.** can be rewr
2ba80 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
2ba90 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2baa0 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61  <tables> WHERE a
2bab0 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50  =? AND b=? GROUP
2bac0 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 3d 3f   BY b HAVING c=?
2bad0 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66  .**.** A term of
2bae0 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72   the HAVING expr
2baf0 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67 69 62  ession is eligib
2bb00 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65 72 20  le for transfer 
2bb10 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a  if it consists.*
2bb20 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f  * entirely of co
2bb30 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78 70 72  nstants and expr
2bb40 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
2bb50 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59 20 74   also GROUP BY t
2bb60 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73 65  erms that.** use
2bb70 20 74 68 65 20 22 42 49 4e 41 52 59 22 20 63 6f   the "BINARY" co
2bb80 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
2bb90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2bba0 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 0a   havingToWhere(.
2bbb0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2bbc0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
2bbd0 6f 75 70 42 79 2c 0a 20 20 45 78 70 72 20 2a 70  oupBy,.  Expr *p
2bbe0 48 61 76 69 6e 67 2c 20 0a 20 20 45 78 70 72 20  Having, .  Expr 
2bbf0 2a 2a 70 70 57 68 65 72 65 0a 29 7b 0a 20 20 73  **ppWhere.){.  s
2bc00 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68  truct HavingToWh
2bc10 65 72 65 43 74 78 20 73 43 74 78 3b 0a 20 20 57  ereCtx sCtx;.  W
2bc20 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 0a  alker sWalker;..
2bc30 20 20 73 43 74 78 2e 70 70 57 68 65 72 65 20 3d    sCtx.ppWhere =
2bc40 20 70 70 57 68 65 72 65 3b 0a 20 20 73 43 74 78   ppWhere;.  sCtx
2bc50 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2bc60 75 70 42 79 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  upBy;..  memset(
2bc70 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
2bc80 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20  eof(sWalker));. 
2bc90 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
2bca0 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
2bcb0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2bcc0 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72  k = havingToWher
2bcd0 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
2bce0 65 72 2e 75 2e 70 48 61 76 69 6e 67 43 74 78 20  er.u.pHavingCtx 
2bcf0 3d 20 26 73 43 74 78 3b 0a 20 20 73 71 6c 69 74  = &sCtx;.  sqlit
2bd00 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
2bd10 6b 65 72 2c 20 70 48 61 76 69 6e 67 29 3b 0a 7d  ker, pHaving);.}
2bd20 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
2bd30 20 73 65 65 20 69 66 20 74 68 65 20 70 54 68 69   see if the pThi
2bd40 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c  s entry of pTabL
2bd50 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f  ist is a self-jo
2bd60 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69  in of a prior vi
2bd70 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c  ew..** If it is,
2bd80 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
2bd90 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f   SrcList_item fo
2bda0 72 20 74 68 65 20 70 72 69 6f 72 20 76 69 65 77  r the prior view
2bdb0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
2bdc0 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
2bdd0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  0..*/.static str
2bde0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2bdf0 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77   *isSelfJoinView
2be00 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
2be10 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  bList,          
2be20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73   /* Search for s
2be30 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69  elf-joins in thi
2be40 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  s FROM clause */
2be50 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2be60 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20  t_item *pThis   
2be70 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 72  /* Search for pr
2be80 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ior reference to
2be90 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20 2a   this subquery *
2bea0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
2beb0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2bec0 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d  m;.  for(pItem =
2bed0 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49   pTabList->a; pI
2bee0 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d  tem<pThis; pItem
2bef0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  ++){.    if( pIt
2bf00 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  em->pSelect==0 )
2bf10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2bf20 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
2bf30 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74  Coroutine ) cont
2bf40 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
2bf50 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20  tem->zName==0 ) 
2bf60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2bf70 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2bf80 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  p(pItem->zDataba
2bf90 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74 61  se, pThis->zData
2bfa0 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  base)!=0 ) conti
2bfb0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
2bfc0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74  ite3_stricmp(pIt
2bfd0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73  em->zName, pThis
2bfe0 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f  ->zName)!=0 ) co
2bff0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c000 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2c010 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20  re(0, .         
2c020 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d   pThis->pSelect-
2c030 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
2c040 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c  pSelect->pWhere,
2c050 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20   -1) .    ){.   
2c060 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20 77     /* The view w
2c070 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 73  as modified by s
2c080 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ome other optimi
2c090 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a 20  zation such as. 
2c0a0 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e       ** pushDown
2c0b0 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a  WhereTerms() */.
2c0c0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2c0d0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2c0e0 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65   pItem;.  }.  re
2c0f0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
2c100 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  f SQLITE_COUNTOF
2c110 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
2c120 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  N./*.** Attempt 
2c130 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71  to transform a q
2c140 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
2c150 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2c160 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28   count(*) FROM (
2c170 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
2c180 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
2c190 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a  T y FROM t2).**.
2c1a0 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a  ** Into this:.**
2c1b0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53  .**    SELECT (S
2c1c0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2c1d0 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20  ROM t1)+(SELECT 
2c1e0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
2c1f0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ).**.** The tran
2c200 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20  sformation only 
2c210 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20  works if all of 
2c220 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
2c230 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
2c240 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  *  The subquery 
2c250 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  is a UNION ALL o
2c260 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65  f two or more te
2c270 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72  rms.**   *  Ther
2c280 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72  e is no WHERE or
2c290 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
2c2a0 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e 20 74  ING clauses on t
2c2b0 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  he subqueries.**
2c2c0 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65 72 20     *  The outer 
2c2d0 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
2c2e0 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a  e count(*).**.**
2c2f0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2c300 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2c310 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a   is undertaken..
2c320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2c330 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a  untOfViewOptimiz
2c340 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
2c350 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
2c360 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c  .  Select *pSub,
2c370 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72   *pPrior;.  Expr
2c380 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20   *pExpr;.  Expr 
2c390 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74  *pCount;.  sqlit
2c3a0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70  e3 *db;.  if( (p
2c3b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c3c0 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20  Aggregate)==0 ) 
2c3d0 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54  return 0;   /* T
2c3e0 68 69 73 20 69 73 20 61 6e 20 61 67 67 72 65 67  his is an aggreg
2c3f0 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ate */.  if( p->
2c400 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
2c410 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2c430 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
2c440 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20  mn */.  pExpr = 
2c450 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
2c460 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
2c470 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
2c480 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
2c490 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65   0;        /* Re
2c4a0 73 75 6c 74 20 69 73 20 61 6e 20 61 67 67 72 65  sult is an aggre
2c4b0 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 73 71  gate */.  if( sq
2c4c0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 45  lite3_stricmp(pE
2c4d0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63  xpr->u.zToken,"c
2c4e0 6f 75 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20  ount") ) return 
2c4f0 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74 28  0;  /* Is count(
2c500 29 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  ) */.  if( pExpr
2c510 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72  ->x.pList!=0 ) r
2c520 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2c530 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
2c540 20 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a   be count(*) */.
2c550 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e    if( p->pSrc->n
2c560 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
2c570 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c580 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65      /* One table
2c590 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70   in FROM  */.  p
2c5a0 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
2c5b0 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  [0].pSelect;.  i
2c5c0 66 28 20 70 53 75 62 3d 3d 30 20 29 20 72 65 74  f( pSub==0 ) ret
2c5d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5f0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69 73 20   /* The FROM is 
2c600 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
2c610 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
2c620 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c640 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 63    /* Must be a c
2c650 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20 20  ompound ry */.  
2c660 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62  do{.    if( pSub
2c670 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20  ->op!=TK_ALL && 
2c680 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72  pSub->pPrior ) r
2c690 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73  eturn 0;  /* Mus
2c6a0 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a  t be UNION ALL *
2c6b0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
2c6c0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
2c6d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c6e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48          /* No WH
2c6f0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2c700 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
2c710 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2c720 61 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ate ) return 0; 
2c730 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67      /* Not an ag
2c740 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70  gregate */.    p
2c750 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  Sub = pSub->pPri
2c760 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c780 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20   /* Repeat over 
2c790 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77  compound */.  }w
2c7a0 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20  hile( pSub );.. 
2c7b0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
2c7c0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20  this point then 
2c7d0 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66  it is OK to perf
2c7e0 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72  orm the transfor
2c7f0 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20  mation */..  db 
2c800 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2c810 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a  pCount = pExpr;.
2c820 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70    pExpr = 0;.  p
2c830 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
2c840 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70  [0].pSelect;.  p
2c850 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2c860 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  lect = 0;.  sqli
2c870 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
2c880 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
2c890 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74   p->pSrc = sqlit
2c8a0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
2c8b0 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
2c8c0 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20  f(*p->pSrc));.  
2c8d0 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20  while( pSub ){. 
2c8e0 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a     Expr *pTerm;.
2c8f0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75      pPrior = pSu
2c900 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  b->pPrior;.    p
2c910 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b  Sub->pPrior = 0;
2c920 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74  .    pSub->pNext
2c930 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e   = 0;.    pSub->
2c940 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
2c950 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53  ggregate;.    pS
2c960 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20  ub->selFlags &= 
2c970 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
2c980 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52    pSub->nSelectR
2c990 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ow = 0;.    sqli
2c9a0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2c9b0 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  e(db, pSub->pELi
2c9c0 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  st);.    pTerm =
2c9d0 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65   pPrior ? sqlite
2c9e0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f  3ExprDup(db, pCo
2c9f0 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74  unt, 0) : pCount
2ca00 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69  ;.    pSub->pELi
2ca10 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
2ca20 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
2ca30 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20  e, 0, pTerm);.  
2ca40 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
2ca50 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2ca60 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b  K_SELECT, 0, 0);
2ca70 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70  .    sqlite3PExp
2ca80 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73  rAddSelect(pPars
2ca90 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b  e, pTerm, pSub);
2caa0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d  .    if( pExpr==
2cab0 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
2cac0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65   = pTerm;.    }e
2cad0 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72  lse{.      pExpr
2cae0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2caf0 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c  pParse, TK_PLUS,
2cb00 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a   pTerm, pExpr);.
2cb10 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d      }.    pSub =
2cb20 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70   pPrior;.  }.  p
2cb30 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
2cb40 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2cb50 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
2cb60 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23  SF_Aggregate;..#
2cb70 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2cb80 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2cb90 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2cba0 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
2cbb0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
2cbc0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
2cbd0 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20  r count-of-view 
2cbe0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22  optimization:\n"
2cbf0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2cc00 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2cc10 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2cc20 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  if.  return 1;.}
2cc30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2cc40 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
2cc50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  TIMIZATION */../
2cc60 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2cc70 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
2cc80 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
2cc90 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
2cca0 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
2ccb0 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74   results are ret
2ccc0 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20  urned according 
2ccd0 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  to the SelectDes
2cce0 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  t structure..** 
2ccf0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  See comments in 
2cd00 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20  sqliteInt.h for 
2cd10 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74  further informat
2cd20 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
2cd30 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2cd40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2cd50 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
2cd60 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
2cd70 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
2cd80 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
2cd90 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
2cda0 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
2cdb0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
2cdc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2cdd0 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
2cde0 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
2cdf0 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
2ce00 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
2ce10 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
2ce20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
2ce30 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
2ce40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2ce50 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2ce60 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2ce70 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
2ce80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
2ce90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
2cea0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
2ceb0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
2cec0 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
2ced0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
2cee0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
2cef0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2cf10 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2cf20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2cf30 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
2cf40 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
2cf50 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
2cf60 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
2cf70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
2cf80 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
2cf90 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2cfa0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
2cfb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2cfc0 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
2cfd0 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
2cfe0 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
2cff0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30  List *pEList = 0
2d000 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f  ;  /* List of co
2d010 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
2d020 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
2d030 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
2d040 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2d050 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
2d060 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
2d070 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
2d080 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
2d090 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
2d0a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
2d0b0 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
2d0c0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
2d0d0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
2d0e0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
2d0f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2d100 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
2d110 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
2d120 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
2d130 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
2d140 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
2d150 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
2d160 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
2d170 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e  sDistinct; /* In
2d180 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
2d190 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  e the DISTINCT k
2d1a0 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74  eyword */.  Sort
2d1b0 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20  Ctx sSort;      
2d1c0 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f     /* Info on ho
2d1d0 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52  w to code the OR
2d1e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2d1f0 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
2d200 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
2d210 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
2d220 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
2d230 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
2d240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d250 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
2d260 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
2d270 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
2d280 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
2d290 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
2d2a0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  nnection */..#if
2d2b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d2c0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
2d2d0 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20  RestoreSelectId 
2d2e0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
2d2f0 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  tId;.  pParse->i
2d300 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
2d310 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
2d320 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  ++;.#endif..  db
2d330 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2d340 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
2d350 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2d360 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
2d370 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2d380 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2d390 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
2d3a0 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
2d3b0 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
2d3c0 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
2d3d0 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
2d3e0 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
2d3f0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2d400 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65  ENABLED.  pParse
2d410 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b  ->nSelectIndent+
2d420 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  +;.  SELECTTRACE
2d430 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62  (1,pParse,p, ("b
2d440 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a  egin processing:
2d450 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73 71 6c  \n"));.  if( sql
2d460 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2d470 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73  & 0x100 ){.    s
2d480 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2d490 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2d4a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
2d4b0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2d4c0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2d4d0 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66  est!=SRT_DistFif
2d4e0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
2d4f0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2d500 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2d510 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  RT_Fifo );.  ass
2d520 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2d530 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2d540 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65  est!=SRT_DistQue
2d550 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ue );.  assert( 
2d560 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
2d570 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
2d580 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69  SRT_Queue );.  i
2d590 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
2d5a0 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
2d5b0 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
2d5c0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
2d5d0 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
2d5e0 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
2d5f0 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
2d600 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
2d610 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
2d620 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
2d630 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  d ||.           
2d640 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2d650 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73  T_Queue  || pDes
2d660 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
2d670 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20  stFifo ||.      
2d680 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2d690 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
2d6a0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d6b0 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20  ==SRT_Fifo);.   
2d6c0 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20   /* If ORDER BY 
2d6d0 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
2d6e0 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75  nce in the outpu
2d6f0 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64  t then neither d
2d700 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49  oes.    ** DISTI
2d710 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65  NCT so it can be
2d720 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f   removed too. */
2d730 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2d740 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2d750 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
2d760 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
2d770 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
2d780 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
2d790 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
2d7a0 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
2d7b0 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73  e, p, 0);.  mems
2d7c0 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69  et(&sSort, 0, si
2d7d0 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20  zeof(sSort));.  
2d7e0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2d7f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
2d800 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2d810 72 63 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rc;.  if( pParse
2d820 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
2d830 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2d840 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
2d850 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
2d860 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
2d870 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73  .  isAgg = (p->s
2d880 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2d890 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69 66 20  regate)!=0;.#if 
2d8a0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2d8b0 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
2d8c0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2d8d0 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x100 ){.    SELE
2d8e0 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
2d8f0 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20  arse,p, ("after 
2d900 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a  name resolution:
2d910 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
2d920 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2d930 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2d940 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20  endif..  /* Get 
2d950 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20 56 44  a pointer the VD
2d960 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
2d970 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e  ction, allocatin
2d980 67 20 61 20 6e 65 77 20 56 44 42 45 20 69 66 20  g a new VDBE if 
2d990 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  one.  ** does no
2d9a0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20  t already exist 
2d9b0 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
2d9c0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
2d9d0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
2d9e0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2d9f0 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
2da00 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
2da10 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
2da20 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
2da30 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   p);.  }..  /* T
2da40 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ry to flatten su
2da50 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
2da60 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69  FROM clause up i
2da70 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65  nto the main que
2da80 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  ry.  */.#if !def
2da90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2daa0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
2dab0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2dac0 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
2dad0 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
2dae0 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
2daf0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2db00 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2db10 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2db20 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2db30 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2db40 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2db50 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
2db60 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
2db70 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
2db80 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
2db90 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68  * Catch mismatch
2dba0 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64   in the declared
2dbb0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69   columns of a vi
2dbc0 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ew and the numbe
2dbd0 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  r of.    ** colu
2dbe0 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  mns in the SELEC
2dbf0 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a  T on the RHS */.
2dc00 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43      if( pTab->nC
2dc10 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74  ol!=pSub->pEList
2dc20 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2dc30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2dc40 28 70 50 61 72 73 65 2c 20 22 65 78 70 65 63 74  (pParse, "expect
2dc50 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f  ed %d columns fo
2dc60 72 20 27 25 73 27 20 62 75 74 20 67 6f 74 20 25  r '%s' but got %
2dc70 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
2dc80 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
2dc90 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  nCol, pTab->zNam
2dca0 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  e, pSub->pEList-
2dcb0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67  >nExpr);.      g
2dcc0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2dcd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
2dce0 20 6e 6f 74 20 74 72 79 20 74 6f 20 66 6c 61 74   not try to flat
2dcf0 74 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65  ten an aggregate
2dd00 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
2dd10 2a 0a 20 20 20 20 2a 2a 20 46 6c 61 74 74 65 6e  *.    ** Flatten
2dd20 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
2dd30 20 73 75 62 71 75 65 72 79 20 69 73 20 6f 6e 6c   subquery is onl
2dd40 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68  y possible if th
2dd50 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 20 20  e outer query.  
2dd60 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f    ** is not a jo
2dd70 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  in.  But if the 
2dd80 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
2dd90 6f 74 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ot a join, then 
2dda0 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
2ddb0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c   ** will be impl
2ddc0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
2ddd0 72 6f 75 74 69 6e 65 20 61 6e 64 20 74 68 65 72  routine and ther
2dde0 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61 67  e is no advantag
2ddf0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 66 6c 61 74  e to.    ** flat
2de00 74 65 6e 69 6e 67 20 69 6e 20 74 68 61 74 20 63  tening in that c
2de10 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
2de20 69 66 28 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  if( (pSub->selFl
2de30 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2de40 74 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  te)!=0 ) continu
2de50 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2de60 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  Sub->pGroupBy==0
2de70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   );..    /* If t
2de80 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74  he subquery cont
2de90 61 69 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59  ains an ORDER BY
2dea0 20 63 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20   clause and if. 
2deb0 20 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65     ** it will be
2dec0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
2ded0 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68  a co-routine, th
2dee0 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65  en do not flatte
2def0 6e 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  n.  This.    ** 
2df00 72 65 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f  restriction allo
2df10 77 73 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74  ws SQL construct
2df20 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  s like this:.   
2df30 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45   **.    **  SELE
2df40 43 54 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e  CT expensive_fun
2df50 63 74 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20  ction(x).    ** 
2df60 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20     FROM (SELECT 
2df70 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52  x FROM tab ORDER
2df80 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b   BY y LIMIT 10);
2df90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2dfa0 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e  he expensive_fun
2dfb0 63 74 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20  ction() is only 
2dfc0 63 6f 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20  computed on the 
2dfd0 31 30 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20  10 rows that.   
2dfe0 20 2a 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20   ** are output, 
2dff0 72 61 74 68 65 72 20 74 68 61 6e 20 65 76 65 72  rather than ever
2e000 79 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  y row of the tab
2e010 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
2e020 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
2e030 79 21 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d  y!=0.     && i==
2e040 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c  0.     && (pTabL
2e050 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20  ist->nSrc==1.   
2e060 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69        || (pTabLi
2e070 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e  st->a[1].fg.join
2e080 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54  type&(JT_LEFT|JT
2e090 5f 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20  _CROSS))!=0).   
2e0a0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
2e0b0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ue;.    }..    i
2e0c0 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
2e0d0 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
2e0e0 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
2e0f0 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
2e100 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
2e110 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
2e120 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20  t. */.      i = 
2e130 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  -1;.    }.    pT
2e140 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2e150 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
2e160 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2e170 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2e180 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
2e190 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
2e1a0 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  {.      sSort.pO
2e1b0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2e1c0 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erBy;.    }.  }.
2e1d0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
2e1e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
2e1f0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
2e200 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64   Handle compound
2e210 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2e220 74 73 20 75 73 69 6e 67 20 74 68 65 20 73 65 70  ts using the sep
2e230 61 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63  arate multiSelec
2e240 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75  t().  ** procedu
2e250 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  re..  */.  if( p
2e260 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
2e270 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
2e280 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
2e290 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53  t);.    explainS
2e2a0 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
2e2b0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
2e2c0 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
2e2d0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2e2e0 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45  ENABLED.    SELE
2e2f0 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
2e300 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e  ,p,("end compoun
2e310 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  d-select process
2e320 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50  ing\n"));.    pP
2e330 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
2e340 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20  ent--;.#endif.  
2e350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2e360 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f  .#endif..  /* Fo
2e370 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74  r each term in t
2e380 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20  he FROM clause, 
2e390 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20  do two things:. 
2e3a0 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a   ** (1) Authoriz
2e3b0 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ed unreferenced 
2e3c0 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20  tables.  ** (2) 
2e3d0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2e3e0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
2e3f0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  s.  */.  for(i=0
2e400 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
2e410 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2e420 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2e430 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2e440 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2e450 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
2e460 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
2e470 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  b;.#if !defined(
2e480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2e490 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
2e4a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2e4b0 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  EW).    const ch
2e4c0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
2e4d0 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20  ntext;.#endif.. 
2e4e0 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49     /* Issue SQLI
2e4f0 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
2e500 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61  ations with a fa
2e510 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66  ke column name f
2e520 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61  or any.    ** ta
2e530 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65  bles that are re
2e540 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f  ferenced but fro
2e550 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65  m which no value
2e560 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e  s are extracted.
2e570 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73  .    ** Examples
2e580 20 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20   of where these 
2e590 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51  kinds of null SQ
2e5a0 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
2e5b0 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  izations.    ** 
2e5c0 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20  would occur:.   
2e5d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
2e5e0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2e5f0 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c  ROM t1;   -- SQL
2e600 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20  ITE_READ t1."". 
2e610 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
2e620 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74   t1.* FROM t1, t
2e630 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  2;   -- SQLITE_R
2e640 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a  EAD t2."".    **
2e650 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65  .    ** The fake
2e660 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
2e670 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
2e680 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
2e690 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a   for a table to.
2e6a0 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f      ** have a co
2e6b0 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68  lumn named by th
2e6c0 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  e empty string, 
2e6d0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
2e6e0 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
2e6f0 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75  .    ** distingu
2e700 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75  ish between an u
2e710 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
2e720 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20  e and an actual 
2e730 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2e740 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d  .    ** "" colum
2e750 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  n. The original 
2e760 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74  design was for t
2e770 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
2e780 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c  ame to be a NULL
2e790 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
2e7a0 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75  ould be unambigu
2e7b0 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79  ous.  But legacy
2e7c0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
2e7d0 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20  allbacks might. 
2e7e0 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65     ** assume the
2e7f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
2e800 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67  non-NULL and seg
2e810 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20  fault.  The use 
2e820 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20  of an empty.    
2e830 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ** string for th
2e840 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
2e850 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a  me seems safer..
2e860 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2e870 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30  Item->colUsed==0
2e880 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e890 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2e8a0 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20  e, SQLITE_READ, 
2e8b0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22  pItem->zName, ""
2e8c0 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
2e8d0 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
2e8e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2e8f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2e900 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2e910 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
2e920 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2e930 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
2e940 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
2e950 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a  M clause.    */.
2e960 20 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d      pSub = pItem
2e970 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
2e980 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
2e990 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
2e9a0 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
2e9b0 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
2e9c0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
2e9d0 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
2e9e0 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
2e9f0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
2ea00 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
2ea10 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
2ea20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
2ea30 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
2ea40 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
2ea50 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
2ea60 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
2ea70 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
2ea80 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
2ea90 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
2eaa0 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
2eab0 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
2eac0 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
2ead0 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
2eae0 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
2eaf0 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
2eb00 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
2eb10 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
2eb20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
2eb30 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
2eb40 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2eb50 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
2eb60 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2eb70 2f 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e  /* The subroutin
2eb80 65 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73  e that manifests
2eb90 20 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20   the view might 
2eba0 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f  be a one-time ro
2ebb0 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a  utine,.        *
2ebc0 2a 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65  * or it might ne
2ebd0 65 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f  ed to be rerun o
2ebe0 6e 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e  n each iteration
2ebf0 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20   because it.    
2ec00 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61      ** encodes a
2ec10 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
2ec20 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uery. */.       
2ec30 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
2ec40 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
2ec50 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2ec60 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  b)->opcode==OP_O
2ec70 6e 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  nce );.        s
2ec80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ec90 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
2eca0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2ecb0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2ecc0 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
2ecd0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2ece0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
2ecf0 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
2ed00 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
2ed10 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
2ed20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
2ed30 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
2ed40 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
2ed50 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
2ed60 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
2ed70 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
2ed80 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
2ed90 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
2eda0 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
2edb0 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
2edc0 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
2edd0 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
2ede0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
2edf0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
2ee00 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
2ee10 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
2ee20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
2ee30 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
2ee40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
2ee50 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
2ee60 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2ee70 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
2ee80 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
2ee90 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
2eea0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
2eeb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2eec0 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
2eed0 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
2eee0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
2eef0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
2ef00 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
2ef10 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
2ef20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67    if( (pItem->fg
2ef30 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
2ef40 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26  UTER)==0.     &&
2ef50 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2ef60 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
2ef70 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  , p->pWhere, pIt
2ef80 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20  em->iCursor).   
2ef90 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   ){.#if SELECTTR
2efa0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2efb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2efc0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2efd0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45   ){.        SELE
2efe0 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
2eff0 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57  arse,p,("After W
2f000 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68  HERE-clause push
2f010 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  -down:\n"));.   
2f020 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
2f030 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2f040 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
2f050 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a  dif.    }..    z
2f060 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
2f070 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
2f080 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61  Context;.    pPa
2f090 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
2f0a0 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
2f0b0 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
2f0c0 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  te code to imple
2f0d0 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72  ment the subquer
2f0e0 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  y.    **.    ** 
2f0f0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
2f100 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
2f110 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74   co-routine if t
2f120 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 20  he subquery is. 
2f130 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
2f140 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72   to be the outer
2f150 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69   loop (so that i
2f160 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
2f170 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  to be.    ** com
2f180 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  puted more than 
2f190 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20  once).    **.   
2f1a0 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68   ** TODO: Are th
2f1b0 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ere other reason
2f1c0 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20  s beside (1) to 
2f1d0 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  use a co-routine
2f1e0 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  .    ** implemen
2f1f0 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20  tation?.    */. 
2f200 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20     if( i==0.    
2f210 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
2f220 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
2f230 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
2f240 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
2f250 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
2f260 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31  OSS))!=0)  /* (1
2f270 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
2f280 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
2f290 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
2f2a0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
2f2b0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
2f2c0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
2f2d0 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
2f2e0 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
2f2f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2f300 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
2f310 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
2f320 31 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70  1;.     .      p
2f330 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
2f340 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2f350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f360 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2f370 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70  InitCoroutine, p
2f380 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
2f390 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
2f3a0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2f3b0 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  (v, "%s", pItem-
2f3c0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2f3d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
2f3e0 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
2f3f0 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
2f400 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
2f410 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
2f420 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2f430 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65  Return);.      e
2f440 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2f450 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
2f460 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
2f470 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
2f480 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2f490 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
2f4a0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
2f4b0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
2f4c0 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
2f4d0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
2f4e0 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
2f4f0 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20  routine = 1;.   
2f500 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73     pItem->regRes
2f510 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  ult = dest.iSdst
2f520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f530 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
2f540 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  v, pItem->regRet
2f550 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
2f560 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2f570 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
2f580 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2f590 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2f5a0 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
2f5b0 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
2f5c0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2f5d0 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
2f5e0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
2f5f0 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
2f600 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2f610 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
2f620 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2f630 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
2f640 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
2f650 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
2f660 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
2f670 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
2f680 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
2f690 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
2f6a0 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
2f6b0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
2f6c0 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
2f6d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
2f6e0 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
2f6f0 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
2f700 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
2f710 72 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  r;.      struct 
2f720 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50  SrcList_item *pP
2f730 72 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73  rior;..      ass
2f740 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
2f750 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
2f760 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2f770 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
2f780 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
2f790 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
2f7a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2f7b0 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
2f7c0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2f7d0 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
2f7e0 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
2f7f0 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +1;.      if( pI
2f800 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  tem->fg.isCorrel
2f810 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ated==0 ){.     
2f820 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2f830 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72  query is not cor
2f840 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77  related and if w
2f850 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65  e are not inside
2f860 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
2f870 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77   trigger, then w
2f880 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63  e only need to c
2f890 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65  ompute the value
2f8a0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
2f8b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  .        ** once
2f8c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63  . */.        onc
2f8d0 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  eAddr = sqlite3V
2f8e0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
2f8f0 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
2f900 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2f910 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f920 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
2f930 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
2f940 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2f950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f960 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
2f970 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
2f980 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
2f990 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2f9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2f9b0 50 72 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f  Prior = isSelfJo
2f9c0 69 6e 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c  inView(pTabList,
2f9d0 20 70 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69   pItem);.      i
2f9e0 66 28 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  f( pPrior ){.   
2f9f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fa00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
2fa10 6e 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75  nDup, pItem->iCu
2fa20 72 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43  rsor, pPrior->iC
2fa30 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
2fa40 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2fa50 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
2fa60 49 64 2c 20 70 50 72 69 6f 72 2d 3e 69 53 65 6c  Id, pPrior->iSel
2fa70 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20  ectId);.        
2fa80 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
2fa90 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
2faa0 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c        pSub->nSel
2fab0 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
2fac0 3e 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63  >pSelect->nSelec
2fad0 74 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tRow;.      }els
2fae0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2faf0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
2fb00 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65  (&dest, SRT_Ephe
2fb10 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75  mTab, pItem->iCu
2fb20 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 65  rsor);.        e
2fb30 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2fb40 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
2fb50 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
2fb60 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
2fb70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
2fb80 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
2fb90 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
2fba0 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e   }.      pItem->
2fbb0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2fbc0 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74   = pSub->nSelect
2fbd0 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  Row;.      if( o
2fbe0 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  nceAddr ) sqlite
2fbf0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2fc00 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20   onceAddr);.    
2fc10 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69    retAddr = sqli
2fc20 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2fc30 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65   OP_Return, pIte
2fc40 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2fc50 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2fc60 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70  ((v, "end %s", p
2fc70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2fc80 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
2fc90 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
2fca0 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64  , topAddr, retAd
2fcb0 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
2fcc0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
2fcd0 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
2fce0 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
2fcf0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2fd00 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2fd10 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
2fd20 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
2fd30 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
2fd40 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41  ;.    pParse->zA
2fd50 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
2fd60 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
2fd70 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
2fd80 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74   Various element
2fd90 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
2fda0 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61  copied into loca
2fdb0 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a  l variables for.
2fdc0 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65    ** convenience
2fdd0 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
2fde0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65  ->pEList;.  pWhe
2fdf0 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
2fe00 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2fe10 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
2fe20 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
2fe30 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73  ;.  sDistinct.is
2fe40 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  Tnct = (p->selFl
2fe50 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
2fe60 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45  t)!=0;..#if SELE
2fe70 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2fe80 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2fe90 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
2fea0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2feb0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2fec0 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46  ,p,("After all F
2fed0 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79  ROM-clause analy
2fee0 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  sis:\n"));.    s
2fef0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2ff00 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2ff10 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
2ff20 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  f SQLITE_COUNTOF
2ff30 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
2ff40 4e 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  N.  if( Optimiza
2ff50 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
2ff60 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
2ff70 74 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75  tener|SQLITE_Cou
2ff80 6e 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20  ntOfView).   && 
2ff90 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d  countOfViewOptim
2ffa0 69 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  ization(pParse, 
2ffb0 70 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  p).  ){.    if( 
2ffc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2ffd0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2ffe0 6e 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  nd;.    pEList =
2fff0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
30000 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
30010 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
30020 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
30030 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69  y is DISTINCT wi
30040 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62  th an ORDER BY b
30050 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ut is not an agg
30060 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a  regate, and .  *
30070 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d  * if the select-
30080 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65  list is the same
30090 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59   as the ORDER BY
300a0 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73   list, then this
300b0 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20   query.  ** can 
300c0 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  be rewritten as 
300d0 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f  a GROUP BY. In o
300e0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73  ther words, this
300f0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
30100 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
30110 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  xyz FROM ... ORD
30120 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
30130 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d   ** is transform
30140 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ed to:.  **.  **
30150 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20       SELECT xyz 
30160 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42  FROM ... GROUP B
30170 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78  Y xyz ORDER BY x
30180 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
30190 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
301a0 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
301b0 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
301c0 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
301d0 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
301e0 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
301f0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
30200 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
30210 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
30220 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
30230 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
30240 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
30250 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
30260 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
30270 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
30280 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
30290 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
302a0 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
302b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
302c0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
302d0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
302e0 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
302f0 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
30300 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
30310 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  e(sSort.pOrderBy
30320 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30  , pEList, -1)==0
30330 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  .  ){.    p->sel
30340 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
30350 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75  tinct;.    pGrou
30360 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
30370 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
30380 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
30390 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  t, 0);.    /* No
303a0 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
303b0 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
303c0 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
303d0 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
303e0 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
303f0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
30400 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
30410 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
30420 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
30430 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
30440 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
30450 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
30460 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
30470 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
30480 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
30490 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53  isTnct );..#if S
304a0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
304b0 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
304c0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
304d0 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53  0x400 ){.      S
304e0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
304f0 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e  ,pParse,p,("Tran
30500 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69  sform DISTINCT i
30510 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22  nto GROUP BY:\n"
30520 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
30530 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
30540 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, p, 0);.    }.
30550 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
30560 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
30570 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
30580 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20   then create an 
30590 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
305a0 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73  to.  ** do the s
305b0 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69  orting.  But thi
305c0 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65  s sorting epheme
305d0 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20  ral index might 
305e0 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e  end up.  ** bein
305f0 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
30600 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72  data can be extr
30610 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
30620 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20  ted order..  ** 
30630 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
30640 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50  ase, then the OP
30650 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
30660 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
30670 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20  be.  ** changed 
30680 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
30690 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ce we figure out
306a0 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
306b0 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20  g index is.  ** 
306c0 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
306d0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
306e0 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73  ndex variable is
306f0 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
30700 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68  ate.  ** that ch
30710 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
30720 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
30730 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
30740 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
30750 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
30760 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
30770 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  rse, sSort.pOrde
30780 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  rBy, 0, pEList->
30790 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72  nExpr);.    sSor
307a0 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  t.iECursor = pPa
307b0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
307c0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
307d0 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
307e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
307f0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
30800 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53  al,.          sS
30810 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53  ort.iECursor, sS
30820 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
30830 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45  xpr+1+pEList->nE
30840 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  xpr, 0,.        
30850 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
30860 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20  o, P4_KEYINFO.  
30870 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
30880 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
30890 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
308a0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
308b0 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
308c0 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
308d0 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
308e0 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
308f0 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
30900 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
30910 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
30920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
30930 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
30940 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
30950 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
30960 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
30970 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
30980 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
30990 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
309a0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
309b0 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
309c0 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  it)==0 ){.    p-
309d0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
309e0 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
309f0 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63   rows */.  }.  c
30a00 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
30a10 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
30a20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
30a30 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
30a40 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
30a50 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
30a60 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
30a70 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  de(v, sSort.addr
30a80 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f  SortIndex, OP_So
30a90 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73  rterOpen);.    s
30aa0 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
30ab0 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
30ac0 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
30ad0 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  Open an ephemera
30ae0 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
30af0 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
30b00 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
30b10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
30b20 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
30b30 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
30b40 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
30b50 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
30b60 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
30b70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
30b80 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
30b90 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
30ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bb0 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
30bc0 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
30bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30be0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
30bf0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
30c00 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
30c10 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
30c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c30 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
30c40 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
30c50 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
30c60 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
30c70 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
30c80 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
30c90 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
30ca0 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERED;.  }else{. 
30cb0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
30cc0 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
30cd0 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
30ce0 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  }..  if( !isAgg 
30cf0 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
30d00 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72  {.    /* No aggr
30d10 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
30d20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
30d30 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31  clause */.    u1
30d40 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  6 wctrlFlags = (
30d50 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
30d60 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   ? WHERE_WANT_DI
30d70 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 20 20 20  STINCT : 0);.   
30d80 20 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55   assert( WHERE_U
30d90 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78  SE_LIMIT==SF_Fix
30da0 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 77  edLimit );.    w
30db0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 70 2d 3e  ctrlFlags |= p->
30dc0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69  selFlags & SF_Fi
30dd0 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f  xedLimit;..    /
30de0 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
30df0 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
30e00 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
30e10 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
30e20 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
30e30 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
30e40 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
30e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e60 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
30e70 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e   wctrlFlags, p->
30e80 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
30e90 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
30ea0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
30eb0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
30ec0 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
30ed0 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70  ount(pWInfo) < p
30ee0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
30ef0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
30f00 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Row = sqlite3Whe
30f10 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
30f20 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
30f30 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63      if( sDistinc
30f40 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69  t.isTnct && sqli
30f50 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
30f60 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ct(pWInfo) ){.  
30f70 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
30f80 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65  nctType = sqlite
30f90 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
30fa0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
30fb0 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f      if( sSort.pO
30fc0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
30fd0 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73  sSort.nOBSat = s
30fe0 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
30ff0 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ered(pWInfo);.  
31000 20 20 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72      sSort.bOrder
31010 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71  edInnerLoop = sq
31020 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 65  lite3WhereOrdere
31030 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66  dInnerLoop(pWInf
31040 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53  o);.      if( sS
31050 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72  ort.nOBSat==sSor
31060 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
31070 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f  r ){.        sSo
31080 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
31090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
310a0 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
310b0 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
310c0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
310d0 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
310e0 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
310f0 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
31100 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
31110 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
31120 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
31130 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
31140 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
31150 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72   */.    if( sSor
31160 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
31170 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64  =0 && sSort.pOrd
31180 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
31190 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
311a0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
311b0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
311c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
311d0 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
311e0 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a   inner loop. */.
311f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
31200 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b  EList==pEList );
31210 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  .    selectInner
31220 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
31230 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
31240 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
31250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31260 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
31270 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
31280 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
31290 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
312a0 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
312b0 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
312c0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
312d0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
312e0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
312f0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
31300 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
31310 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
31320 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
31330 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
31340 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
31350 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
31360 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
31370 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
31380 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
31390 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
313a0 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
313b0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
313c0 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
313d0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
313e0 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
313f0 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
31400 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
31410 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
31420 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
31430 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
31440 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
31450 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
31460 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
31470 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
31480 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
31490 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
314a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314b0 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
314c0 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
314d0 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
314e0 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
314f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
31500 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
31510 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
31520 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
31530 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
31540 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
31550 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
31560 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
31570 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
31580 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
31590 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
315a0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
315b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
315c0 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
315d0 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
315e0 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
315f0 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
31600 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
31610 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
31620 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
31630 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
31640 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
31650 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
31660 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
31670 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
31680 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
31690 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
316a0 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
316b0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
316c0 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
316d0 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
316e0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
316f0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
31700 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
31710 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
31720 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
31730 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
31740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31750 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
31760 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
31770 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
31780 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
31790 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
317a0 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
317b0 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
317c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
317d0 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
317e0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
317f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
31800 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
31810 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
31820 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
31830 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
31840 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
31850 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
31860 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
31870 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
31880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31890 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69  assert( 66==sqli
318a0 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
318b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
318c0 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70  SelectRow>66 ) p
318d0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36  ->nSelectRow = 6
318e0 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
318f0 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
31900 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
31910 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  );.      p->nSel
31920 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
31930 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
31940 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
31950 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
31960 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
31970 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
31980 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
31990 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
319a0 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
319b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
319c0 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
319d0 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
319e0 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
319f0 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
31a00 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
31a10 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
31a20 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
31a30 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
31a40 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
31a50 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
31a60 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
31a70 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
31a80 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
31a90 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
31aa0 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
31ab0 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
31ac0 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
31ad0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
31ae0 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
31af0 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
31b00 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
31b10 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
31b20 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
31b30 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
31b40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
31b50 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
31b60 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
31b70 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
31b80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
31b90 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
31ba0 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
31bb0 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
31bc0 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
31bd0 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
31be0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
31bf0 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
31c00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
31c10 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
31c20 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
31c30 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
31c40 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
31c50 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
31c60 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
31c70 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
31c80 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
31c90 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
31ca0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
31cb0 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
31cc0 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
31cd0 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
31ce0 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
31cf0 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
31d00 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
31d10 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
31d20 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
31d30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ;.    sAggInfo.m
31d40 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
31d50 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
31d60 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
31d70 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
31d80 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
31d90 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
31da0 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
31db0 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
31dc0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
31dd0 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
31de0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
31df0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
31e00 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
31e10 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
31e20 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
31e30 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
31e40 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31e50 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68  ( pWhere==p->pWh
31e60 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 68  ere );.        h
31e70 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61  avingToWhere(pPa
31e80 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70  rse, pGroupBy, p
31e90 48 61 76 69 6e 67 2c 20 26 70 2d 3e 70 57 68 65  Having, &p->pWhe
31ea0 72 65 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68  re);.        pWh
31eb0 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
31ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
31ed0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
31ee0 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
31ef0 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  , pHaving);.    
31f00 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
31f10 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
31f20 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
31f30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
31f40 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
31f50 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
31f60 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
31f70 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  rty(sAggInfo.aFu
31f80 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  nc[i].pExpr, EP_
31f90 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
31fa0 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
31fb0 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
31fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
31fd0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
31fe0 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
31ff0 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
32000 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
32010 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
32020 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
32030 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
32040 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mxReg = pParse-
32050 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64  >nMem;.    if( d
32060 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
32070 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
32080 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
32090 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
320a0 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
320b0 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
320c0 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
320d0 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
320e0 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
320f0 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
32100 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
32110 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
32120 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
32130 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
32140 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
32150 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
32160 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  y clause */.    
32170 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
32180 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20        /* A-vs-B 
32190 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70  comparision jump
321a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
321b0 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a  drOutputRow;  /*
321c0 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
321d0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
321e0 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
321f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  /.      int regO
32200 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52  utputRow;   /* R
32210 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
32220 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75  gister for outpu
32230 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
32240 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
32250 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74  tAbort;   /* Set
32260 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
32270 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
32280 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
32290 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f  fLoop;  /* Top o
322a0 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
322b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
322c0 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a  drSortingIdx; /*
322d0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
322e0 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
322f0 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
32300 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73       int addrRes
32310 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72  et;      /* Subr
32320 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
32330 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
32340 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ator */.      in
32350 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
32360 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
32370 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
32380 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
32390 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  e */..      /* I
323a0 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
323b0 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
323c0 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
323d0 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
323e0 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
323f0 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
32400 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
32410 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
32420 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
32430 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
32440 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
32450 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  l, the OP_Sorter
32460 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  Open instruction
32470 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
32480 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
32490 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
324a0 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
324b0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
324c0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
324d0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
324e0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
324f0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
32500 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e  oupBy, 0, sAggIn
32510 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  fo.nColumn);.   
32520 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
32530 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
32540 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
32550 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20  erOpen, .       
32560 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
32570 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f  ingIdx, sAggInfo
32580 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
32590 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28   .          0, (
325a0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
325b0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
325c0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
325d0 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
325e0 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
325f0 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
32600 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
32610 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
32620 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
32630 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
32640 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
32650 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
32660 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
32670 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
32680 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
32690 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
326a0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
326b0 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
326c0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
326d0 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
326e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
326f0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
32700 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
32710 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
32720 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
32730 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
32740 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
32750 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
32760 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
32770 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
32780 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
32790 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
327a0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
327b0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
327c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
327d0 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
327e0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
327f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
32800 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
32810 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
32820 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
32830 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
32840 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
32850 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
32860 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
32870 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
32880 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
32890 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
328a0 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
328b0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
328c0 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
328d0 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
328e0 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
328f0 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
32900 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
32910 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
32920 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
32930 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
32940 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
32950 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
32960 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
32970 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
32980 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
32990 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
329a0 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
329b0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
329c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
329d0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
329e0 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
329f0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
32a00 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
32a10 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
32a20 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75  t, pWhere, pGrou
32a30 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBy, 0,.        
32a40 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20    WHERE_GROUPBY 
32a50 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20  | (orderByGrp ? 
32a60 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
32a70 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20  P : 0), 0.      
32a80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
32a90 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
32aa0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
32ab0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
32ac0 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
32ad0 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  )==pGroupBy->nEx
32ae0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pr ){.        /*
32af0 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
32b00 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
32b10 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
32b20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
32b30 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
32b40 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
32b50 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
32b60 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
32b70 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
32b80 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
32b90 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
32ba0 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
32bb0 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
32bc0 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
32bd0 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
32be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32bf0 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
32c00 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
32c10 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
32c20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
32c30 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
32c40 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
32c50 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
32c60 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
32c70 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
32c80 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
32c90 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
32ca0 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
32cb0 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
32cc0 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
32cd0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
32ce0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
32cf0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
32d00 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
32d10 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
32d20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
32d30 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
32d40 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
32d50 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
32d60 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
32d70 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
32d80 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
32d90 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
32da0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
32db0 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
32dc0 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
32dd0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
32de0 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
32df0 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
32e00 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
32e10 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  l = nGroupBy;.  
32e20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
32e30 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
32e40 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
32e50 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
32e60 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
32e70 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
32e80 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
32e90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
32ea0 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
32eb0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
32ec0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
32ed0 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
32ee0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
32ef0 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
32f00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32f10 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
32f20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
32f30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
32f40 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
32f50 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
32f60 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
32f70 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
32f80 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
32f90 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
32fa0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
32fb0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
32fc0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
32fd0 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
32fe0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
32ff0 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
33000 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
33010 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
33020 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
33030 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33040 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
33050 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20  mnToReg(pParse, 
33060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33080 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
33090 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  ->iColumn, pCol-
330a0 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20  >iTable, r1);.  
330b0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
330c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
330d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
330e0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
330f0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
33100 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
33110 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
33120 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
33130 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72  regBase, nCol, r
33140 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
33150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33160 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
33170 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  rInsert, sAggInf
33180 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65  o.sortingIdx, re
33190 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
331a0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
331b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
331c0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
331d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
331e0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
331f0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
33200 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
33210 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
33220 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  fo);.        sAg
33230 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
33240 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20  PTab = sortPTab 
33250 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
33260 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75  ;.        sortOu
33270 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
33280 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
33290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
332a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
332b0 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50  penPseudo, sortP
332c0 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43  Tab, sortOut, nC
332d0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
332e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
332f0 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
33300 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
33310 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
33320 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
33330 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42  ent((v, "GROUP B
33340 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43  Y sort")); VdbeC
33350 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
33360 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65      sAggInfo.use
33370 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a  SortingIdx = 1;.
33380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
33390 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
333a0 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a  arse);..      }.
333b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
333c0 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72   index or tempor
333d0 61 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62  ary table used b
333e0 79 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73  y the GROUP BY s
333f0 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ort.      ** wil
33400 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69  l naturally deli
33410 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20  ver rows in the 
33420 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62  order required b
33430 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  y the ORDER BY. 
33440 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20       ** clause, 
33450 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d  cancel the ephem
33460 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20  eral table open 
33470 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20  coded earlier.. 
33480 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
33490 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
334a0 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63  mization - the c
334b0 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68  orrect answer sh
334c0 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61  ould result rega
334d0 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a  rdless..      **
334e0 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f   Use the SQLITE_
334f0 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61  GroupByOrder fla
33500 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45  g with SQLITE_TE
33510 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52  STCTRL_OPTIMIZER
33520 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69   to .      ** di
33530 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d  sable this optim
33540 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74  ization for test
33550 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a  ing purposes.  *
33560 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65  /.      if( orde
33570 72 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69  rByGrp && Optimi
33580 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
33590 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  , SQLITE_GroupBy
335a0 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26  Order) .       &
335b0 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c  & (groupBySort |
335c0 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  | sqlite3WhereIs
335d0 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a  Sorted(pWInfo)).
335e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
335f0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
33600 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
33610 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
33620 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  Noop(v, sSort.ad
33630 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
33640 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
33650 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
33660 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
33670 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
33680 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
33690 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
336a0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
336b0 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
336c0 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
336d0 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
336e0 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
336f0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
33700 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
33710 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
33720 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
33730 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
33740 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
33750 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
33760 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33770 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
33780 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
33790 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
337a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
337b0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
337c0 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
337d0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
337e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
337f0 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
33800 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Data, sAggInfo.s
33810 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
33820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33830 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f       sortOut, so
33840 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  rtPTab);.      }
33850 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
33860 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
33870 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
33880 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
33890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
338a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
338b0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f  v, OP_Column, so
338c0 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d  rtPTab, j, iBMem
338d0 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +j);.        }el
338e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
338f0 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
33900 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
33910 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
33920 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
33930 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69  y->a[j].pExpr, i
33940 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
33950 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
33960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33970 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
33980 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20  , iAMem, iBMem, 
33990 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
339a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
339b0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
339c0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
339d0 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
339e0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
339f0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
33a00 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
33a10 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
33a20 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
33a30 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31  OP_Jump, addr1+1
33a40 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56  , 0, addr1+1); V
33a50 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
33a60 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
33a70 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
33a80 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
33a90 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
33aa0 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
33ab0 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
33ac0 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
33ad0 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
33ae0 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
33af0 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
33b00 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
33b10 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
33b20 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
33b30 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
33b40 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
33b50 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
33b60 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
33b70 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
33b80 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
33b90 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
33ba0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
33bb0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
33bc0 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
33bd0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
33be0 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
33bf0 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
33c00 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
33c10 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
33c20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
33c30 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
33c40 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
33c50 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
33c60 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
33c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
33c80 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
33c90 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
33ca0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
33cb0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
33cc0 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
33cd0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
33ce0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
33cf0 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
33d00 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20  Flag, addrEnd); 
33d10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
33d20 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
33d30 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
33d40 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
33d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33d60 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
33d70 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
33d80 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
33d90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
33da0 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
33db0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
33dc0 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
33dd0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
33de0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
33df0 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
33e00 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
33e10 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
33e20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
33e30 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
33e40 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
33e50 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
33e60 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
33e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33e80 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
33e90 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 1, iUseFlag);
33ea0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
33eb0 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
33ec0 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
33ed0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
33ee0 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
33ef0 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
33f00 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
33f10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
33f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
33f30 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
33f40 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
33f50 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
33f60 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64  oop);.        Vd
33f70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
33f80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33f90 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
33fa0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
33fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33fc0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
33fd0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b  addrSortingIdx);
33fe0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33ff0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
34000 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
34010 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
34020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34030 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
34040 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
34050 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
34060 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
34070 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
34080 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20  l row"));..     
34090 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68   /* Jump over th
340a0 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20  e subroutines.  
340b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
340c0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
340d0 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
340e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
340f0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
34100 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
34110 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
34120 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
34130 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
34140 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
34150 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
34160 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
34170 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
34180 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
34190 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
341a0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
341b0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
341c0 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
341d0 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
341e0 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
341f0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
34200 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
34210 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
34220 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
34230 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
34240 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
34250 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
34260 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
34270 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
34280 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
34290 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
342a0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
342b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
342c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
342d0 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
342e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
342f0 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
34300 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
34310 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
34320 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
34330 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
34340 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
34350 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
34360 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
34370 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
34380 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
34390 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
343a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
343b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
343c0 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
343d0 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
343e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
343f0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
34400 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
34410 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
34420 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
34430 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
34440 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
34450 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
34460 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
34470 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
34480 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
34490 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
344a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
344b0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
344c0 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
344d0 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  w+1, SQLITE_JUMP
344e0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
344f0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
34500 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
34510 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Sort,.          
34520 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69              &sDi
34530 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
34540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34550 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
34560 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f  ow+1, addrSetAbo
34570 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
34580 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
34590 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
345a0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
345b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
345c0 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73  "end groupby res
345d0 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
345e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
345f0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
34600 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
34610 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
34620 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
34630 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
34640 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34650 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b  l(v, addrReset);
34660 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
34670 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
34680 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
34690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
346a0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
346b0 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20  , regReset);.   
346c0 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
346d0 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67  f pGroupBy.  Beg
346e0 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  in aggregate que
346f0 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f  ries without GRO
34700 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c  UP BY: */.    el
34710 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  se {.      ExprL
34720 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23  ist *pDel = 0;.#
34730 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34740 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20  IT_BTREECOUNT.  
34750 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
34760 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62  .      if( (pTab
34770 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74   = isSimpleCount
34780 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21  (p, &sAggInfo))!
34790 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
347a0 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e   If isSimpleCoun
347b0 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f  t() returns a po
347c0 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65  inter to a Table
347d0 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
347e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
347f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
34800 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
34810 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
34820 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75   **   SELECT cou
34830 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
34840 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
34850 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65      ** where the
34860 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
34870 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73   returned repres
34880 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e  ents table <tbl>
34890 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
348a0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61       ** This sta
348b0 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d  tement is so com
348c0 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f  mon that it is o
348d0 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c  ptimized special
348e0 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ly. The.        
348f0 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74  ** OP_Count inst
34900 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75  ruction is execu
34910 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68  ted either on th
34920 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74  e intkey table t
34930 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
34940 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
34950 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e   for table <tbl>
34960 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74   or on one of it
34970 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20  s indexes. It.  
34980 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74        ** is bett
34990 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  er to execute th
349a0 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78  e op on an index
349b0 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65  , as indexes are
349c0 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20   almost.        
349d0 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64  ** always spread
349e0 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67   across less pag
349f0 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f  es than their co
34a00 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
34a10 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
34a20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
34a30 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
34a40 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
34a50 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
34a60 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
34a70 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d  const int iCsr =
34a80 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
34a90 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
34aa0 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f  o scan b-tree */
34ab0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
34ac0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
34ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34ae0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
34af0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65  le */.        Ke
34b00 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
34b10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
34b20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f     /* Keyinfo fo
34b30 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20  r scanned index 
34b40 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
34b50 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20   *pBest = 0;    
34b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b70 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f  /* Best index fo
34b80 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  und so far */.  
34b90 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20        int iRoot 
34ba0 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20  = pTab->tnum;   
34bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
34bc0 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e  ot page of scann
34bd0 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20  ed b-tree */..  
34be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
34bf0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
34c00 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
34c10 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
34c20 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
34c30 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
34c40 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
34c50 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
34c60 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  h for the index 
34c70 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77  that has the low
34c80 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20  est scan cost.. 
34c90 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34ca0 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35    ** (2011-04-15
34cb0 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75  ) Do not do a fu
34cc0 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e  ll scan of an un
34cd0 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20  ordered index.. 
34ce0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34cf0 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33    ** (2013-10-03
34d00 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74  ) Do not count t
34d10 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20  he entries in a 
34d20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20  partial index.. 
34d30 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34d40 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65    ** In practice
34d50 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
34d60 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20  ucture will not 
34d70 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f  be used. It is o
34d80 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  nly .        ** 
34d90 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f  passed to keep O
34da0 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79  P_OpenRead happy
34db0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34dc0 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
34dd0 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74  id(pTab) ) pBest
34de0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
34df0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
34e00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
34e10 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
34e20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
34e30 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
34e40 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e     if( pIdx->bUn
34e50 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
34e60 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73        && pIdx->s
34e70 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a  zIdxRow<pTab->sz
34e80 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20  TabRow.         
34e90 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74    && pIdx->pPart
34ea0 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20  IdxWhere==0.    
34eb0 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73         && (!pBes
34ec0 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78  t || pIdx->szIdx
34ed0 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78  Row<pBest->szIdx
34ee0 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29  Row).          )
34ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
34f00 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
34f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34f20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
34f30 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
34f40 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e   iRoot = pBest->
34f50 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
34f60 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
34f70 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
34f80 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b  (pParse, pBest);
34f90 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
34fa0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65      /* Open a re
34fb0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
34fc0 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43  execute the OP_C
34fd0 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20  ount, close the 
34fe0 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20  cursor. */.     
34ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
35000 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70  dOp4Int(v, OP_Op
35010 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52  enRead, iCsr, iR
35020 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  oot, iDb, 1);.  
35030 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
35040 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
35050 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
35060 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
35070 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)pKeyInfo, P4_
35080 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
35090 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
350a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
350b0 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c   OP_Count, iCsr,
350c0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
350d0 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0].iMem);.      
350e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
350f0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
35100 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   iCsr);.        
35110 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
35120 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  nt(pParse, pTab,
35130 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   pBest);.      }
35140 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
35150 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
35160 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
35170 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
35180 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
35190 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
351a0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
351b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
351c0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
351d0 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
351e0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
351f0 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
35200 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
35210 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
35220 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
35230 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
35240 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
35250 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
35260 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
35270 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
35280 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
35290 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
352a0 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
352b0 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
352c0 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
352d0 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
352e0 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
352f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
35300 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
35310 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
35320 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
35330 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
35340 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
35350 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
35360 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
35370 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
35380 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
35390 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
353a0 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
353b0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
353c0 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
353d0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
353e0 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
353f0 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
35400 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
35410 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
35420 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
35430 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
35440 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
35450 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
35460 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c  behavior as foll
35470 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ows:.        **.
35480 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49          **   + I
35490 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
354a0 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
354b0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
354c0 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20  coded by.       
354d0 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20   **     where.c 
354e0 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61  should not itera
354f0 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75  te over any valu
35500 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  es with a NULL v
35510 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
35520 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
35530 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
35540 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a     + The optimiz
35550 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  er code in where
35560 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68  .c (the thing th
35570 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68  at decides which
35580 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
35590 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73  index or indices
355a0 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20   to use) should 
355b0 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e  place a differen
355c0 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20  t priority on . 
355d0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61         **     sa
355e0 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
355f0 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
35600 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
35610 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
35620 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72      **     Refer
35630 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d   to code and com
35640 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63  ments in where.c
35650 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
35660 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
35670 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
35680 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ax = 0;.        
35690 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f  u8 flag = WHERE_
356a0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
356b0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
356c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
356d0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
356e0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
356f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
35700 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
35710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
35720 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
35730 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e  &sAggInfo, &pMin
35740 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Max);.        }.
35750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35760 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e  flag==0 || (pMin
35770 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61  Max!=0 && pMinMa
35780 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a  x->nExpr==1) );.
35790 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
357a0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  g ){.          p
357b0 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
357c0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
357d0 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20  pMinMax, 0);.   
357e0 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d         pDel = pM
357f0 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20  inMax;.         
35800 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
35810 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 4d 69  locFailed || pMi
35820 6e 4d 61 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  nMax!=0 );.     
35830 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
35840 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
35850 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
35860 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  x->a[0].sortOrde
35870 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f  r = flag!=WHERE_
35880 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30  ORDERBY_MIN ?1:0
35890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
358a0 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
358b0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
358c0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  N;.          }. 
358d0 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
358e0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
358f0 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
35900 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
35910 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
35920 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
35930 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
35940 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
35950 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
35960 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
35970 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
35980 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
35990 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
359a0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
359b0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
359c0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
359d0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
359e0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
359f0 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 20 30  here, pMinMax, 0
35a00 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20  ,flag,0);.      
35a10 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
35a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
35a30 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
35a40 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
35a50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
35a60 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
35a70 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74   }.        updat
35a80 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
35a90 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
35aa0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
35ab0 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70   pMinMax==0 || p
35ac0 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
35ad0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
35ae0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
35af0 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20  dered(pWInfo)>0 
35b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
35b10 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
35b20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
35b30 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
35b40 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
35b50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
35b60 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20   by index",.    
35b70 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
35b80 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
35b90 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
35ba0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )));.        }. 
35bb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
35bc0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
35bd0 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65          finalize
35be0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
35bf0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
35c00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
35c10 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
35c20 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
35c30 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
35c40 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
35c50 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
35c60 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
35c70 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
35c80 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20  (pParse, p, -1, 
35c90 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
35ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
35cb0 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
35cc0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEnd);.      sql
35cd0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
35ce0 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
35cf0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
35d00 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
35d10 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
35d20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
35d30 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
35d40 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e  /..  if( sDistin
35d50 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  ct.eTnctType==WH
35d60 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
35d70 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78  RDERED ){.    ex
35d80 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
35d90 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
35da0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ");.  }..  /* If
35db0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
35dc0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
35dd0 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
35de0 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
35df0 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
35e00 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
35e10 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
35e20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
35e30 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65  OrderBy ){.    e
35e40 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
35e50 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
35e60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 53 6f               sSo
35e70 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52  rt.nOBSat>0 ? "R
35e80 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44  IGHT PART OF ORD
35e90 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59  ER BY":"ORDER BY
35ea0 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  ");.    generate
35eb0 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
35ec0 20 70 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69   p, &sSort, pELi
35ed0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
35ee0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
35ef0 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
35f00 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
35f10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
35f20 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
35f30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
35f40 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
35f50 65 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ed. If there is 
35f60 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
35f70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2c  Parse structure,
35f80 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 72 65  .  ** set the re
35f90 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20  turn code to 1. 
35fa0 4f 74 68 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a  Otherwise 0. */.
35fb0 20 20 72 63 20 3d 20 28 70 50 61 72 73 65 2d 3e    rc = (pParse->
35fc0 6e 45 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43  nErr>0);..  /* C
35fd0 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
35fe0 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
35ff0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
36000 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
36010 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
36020 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
36030 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
36040 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53  _end:.  explainS
36050 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
36060 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
36070 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
36080 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
36090 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
360a0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
360b0 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
360c0 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45  o.aFunc);.#if SE
360d0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
360e0 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  D.  SELECTTRACE(
360f0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64  1,pParse,p,("end
36100 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29   processing\n"))
36110 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c  ;.  pParse->nSel
36120 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e  ectIndent--;.#en
36130 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
36140 0a 7d 0a                                         .}.